OPSWAT
Firewall software for OT networks, from Web UI to data plane.
C++ and Python on Linux appliances (4P, 8P, 1U) that sit between a plant's OT network and the IT side. Click a stage or scroll to see each feature.
I build systems end to end: C++ firewall software for Linux network appliances that protect critical-infrastructure and OT networks, from the packet path to HA and the Web UI. On the side I ship web products for brands and games on Steam.
I'm Hien, a software and systems engineer at OPSWAT. I write C++ and Python for Linux firewall appliances that protect industrial networks, and on the side I build web products and games.





C++ and Python on Linux appliances (4P, 8P, 1U) that sit between a plant's OT network and the IT side. Click a stage or scroll to see each feature.
Became primary owner of the appliance's Web UI and led the migration off Tornado, then wired every network feature into the new stack.
End-to-end DPI from the UI down to the data-plane reload, plus C++ parsers in the packet-processing engine that read industrial protocols field by field.
Packets come off NFQUEUE, go to the engine through a request ring, and come back with a verdict through a second ring. If the engine is down, traffic keeps flowing: the plant matters more than the alert.
Each ring has exactly one writer and one reader. The worker owns req_head and ver_tail, the engine owns req_tail and ver_head. No index is written by both sides, so no lock is needed.
1,024 slots allocated once, one L3 packet (≤ 2048 B) per slot, so no allocation per packet. Each verdict carries the packet's seq, so the worker applies PASS or DROP to the right packet.
Equal means empty: the reader has nothing and waits. Full is head + 1 == tail: one slot is left unused so full and empty never look the same.
Sites connect through an IPsec tunnel that behaves like a normal interface, so the routing table decides what goes into it. The appliance can also dial out as an OpenVPN client.
Publish an internal service, hide a subnet behind one address, or pin a device to its own public address. Replies are translated back from connection tracking.
Highlighted field = what the firewall rewrites. The reply takes the reverse mapping automatically.
FRR runs OSPF and RIP so the firewall learns routes from its neighbours, alongside static routes. On the same segments it watches ARP and flags an IP that suddenly answers from a different MAC.
| Prefix | Via | |
|---|---|---|
| O | 172.16.0.0/16 | 10.0.0.2 [110/20] |
| R | 192.168.5.0/24 | 10.0.0.3 [120/2] |
| S | 0.0.0.0/0 | 203.0.113.1 |
| C | 10.0.0.0/24 | eth1 |
10.0.0.100:1b:21:3a:4f:01gateway · known10.0.0.200:1b:21:3a:4f:02R1 · known10.0.0.1de:ad:be:ef:00:66new MAC for a known IPWhen the master fails, the virtual IP moves to the backup and its config is already in sync. I hardened the sync path and removed a job backlog.
Each firewall rule can carry a bandwidth policy. Its packets get a mark in iptables mangle, tc sends that mark to the rule's own HTB class, and the class's token bucket holds it to the rate.
The packet engine hands packets to one reader over a Unix socket file. The reader writes them into a capped Redis Stream, and every viewer reads the stream from its own position, so a slow browser falls behind instead of blocking the others.
A small studio working with brands, media and partners like PhuotLuon.vn, Không Che and Algorithmics. I take the input, write the proposal, get sign-off, build, and keep it running.
Goals, audience, budget and references. The questions asked here decide what the proposal can promise.
Scope, stack, milestones and price, written so the client can say yes or point at exactly what to change.
Editors manage content in a CMS, the site is built with Next.js or Gatsby, and everything runs in Docker on a VPS. For IID I reworked the production site on Payload CMS to make it faster.
Centralized Advertisement Management System for Biscoo and Bida.vn (2026): marketing changes an ad in a dashboard, Supabase pushes the change, and every screen in every venue swaps it live.
A venue screen running the system. Saved once in the dashboard, every subscribed screen swaps to the new ad.
Three games released independently on Steam in C#, plus interactive campaign games for brands like Kewpie × HTV and iSEE. Gameplay AI, algorithms and game architecture.
Production deploys for brands, releases on Steam, and maintenance after launch.
Course data lives in MongoDB, learning paths are a graph in Neo4j, public pages come from Payload CMS for SEO, and Cloudflare's CDN carries video and pages so the platform holds up under load.
Ask the question early, while it's still cheap to change: in the design doc or in the pull request.
for (const id of learnerIds) {- await session.run(nextLessonQuery, { id })+ await session.run(nextLessonBatch, { ids: learnerIds })When a deploy fails or a bug won't reproduce, sit with the engineer, read the logs together, and fix the cause rather than the symptom.
Run interviews for new engineers and keep regular 1:1s with the people already on the team.
The hard part of C is what happens in memory. I draw it: where a variable lives, what a pointer holds, and what changes when you write through it.
int x = 42; int *p = &x; *p = 7; // x is now 7
Teams run their project like a small product team: a board, pull requests, and review from me before anything is merged.
Students leave with a project that's deployed and that they can explain, not just a set of exercises.
Example student projects
A server–client system: marketing schedules ads centrally and screens in each venue update live.
The on-site edition of the “Start your meal with vegetables” campaign game, played on touch kiosks.
Interactive campaign game for Kewpie: “Hãy bắt đầu bữa ăn bằng rau”.
A game developed with the EP4 team, with its own launch site.
A game that tells the story of a negative thinker.
A 2D strategy defense game.
Notes from the systems I build
Deep dives, diagrams, and lessons from Linux networking, product engineering, games, and teaching.
Notion-ready · mock contentTopics I keep exploring
Open to new opportunities, collaborations, or just a tech chat.