−0%
Dashboard payload on first load
4.75 MB → 1.26 MB
Back-end in Go, TypeScript/Bun and Python. I build services that talk to industrial equipment, learn from the data and stay testable with the hardware switched off.
Build a real-time back-end that reads the PLC, tunes its own control loop and stays testable with the equipment switched off.
Execution
Connected
Profile config
Stack
Results measured in production, on the back end I write and maintain.
−0%
4.75 MB → 1.26 MB
96.00ms
was 96 ms · 300k rows
40→40
switching screens no longer reconnects the WebSocket
R$0k/mo
deterministic + random forest algorithms in pid-service
Back end that runs inside the client’s plant and, before that, a year mentoring a programming community.
Jun 2026 – Present
currentComber Indústria LTDAFull-time
Back end for two products: a real-time platform that runs embedded on Raspberry Pi 5 boards and industrial PCs inside the client’s plant, and the back-office web app that handles sales rep commissions. The products are confidential, so this is the engineering side.
Jul 2025 – Jun 2026
endedBeroLabPart-time
Technical and career mentoring in a programming community.
The two systems I build at Comber: one runs next to the equipment at the customer's plant, the other settles sales commissions. Both are confidential, so this is architecture and engineering only.
2026 — presentBack-end · Comber
Supervision and adaptive control for industrial equipment. It reads the PLC over Modbus, tunes the PID episode by episode and serves a web HMI on the plant network, all in containers that run on anything from a Raspberry Pi 5 to an industrial PC.
ISA architecture: the equipment's PLC talks Modbus TCP only to core-isa, which relays readings over HTTP to pid-service and over WebSocket to the Go web-backend. The web-backend stores data in SQLite and is published by the web-frontend's nginx, the only port open to the operator's browser. Everything runs on Docker Compose on a Raspberry Pi 5 or an industrial PC.
2026 — presentBack-end · Comber
Internal system that records sales and receipts and calculates sales commissions, with registries, a dashboard and PDF and Excel reports. A TypeScript API on PostgreSQL that also serves the front-end.
Commissions architecture: the browser calls /api on the same origin; the Express API serves the React build and reaches PostgreSQL through Prisma, all in one container on one port. In CI, GitHub Actions runs lint, typecheck, migrations and tests against an isolated test Postgres.
The systems behind the numbers, animated from the real code. Plant names and calibration values are left out.
A single owner of the Modbus connection reads the PLC once per second and streams the same reading to the supervisory UI and the adaptive tuning service.
Animated diagram: the PLC accepts a single Modbus TCP connection. core-isa is the only owner of that connection, reads the PLC once per second and streams the same reading over WebSocket to two consumers: web-service, the supervisory UI in Go with Gin and SQLite, and pid-service, which does adaptive tuning in Python. More open browsers add no extra traffic on the PLC.
Each episode measures overshoot, oscillation, offset and saturation. The first matching rule adjusts P, I and D, always within ±30% and the bounds.
Animation of three tuning episodes. Each episode holds 300 temperature samples (about 5 minutes), cleaned by a median-of-3 filter. From the first setpoint crossing on, the regulation window, it measures overshoot, undershoot, oscillation and offset (standard deviation and mean of the last quarter) plus the share of saturated Hz, combined into a weighted score where lower is better. Rules run in this order and the first match decides: 1, overshoot or undershoot, raise D and lower P; 2, Hz saturated or sweeping the range, lower P and raise D; 3, oscillation, lower P and I; 4, offset below setpoint, raise I and P slightly; 5, offset above, lower P and I; otherwise keep the PID. The suggested PID then goes through the rails: at most ±30% per episode and within bounds. In the example, episode 1 overshoots and the suggested D hits its bound; episode 2 oscillates; episode 3 is within tolerance and the PID is kept.
After 20 steady-state episodes, an 80-tree forest predicts the score of 125 P, I, D combinations around the current one and picks the lowest.
Animation of the pid-service machine learning layer. While history holds fewer than 20 steady-state episodes, the deterministic rules decide. At 20, an 80-tree RandomForestRegressor is trained on P, I, D, level and setpoint to predict the episode score. It scores a 5 × 5 × 5 grid of 125 candidates, each gain from −30% to +30% of the current PID, and picks the lowest predicted score (argmin). The suggestion goes through the same rails as the rules, ±30% per episode and bounds, and is only applied in drive mode; in shadow it is just logged and off disables the layer. If the predictions are nearly tied (spread under 1%), the rules decide. The loop alternates between two operating profiles.
The master password never leaves the machine. The client derives the keys and encrypts every item; the server only stores opaque blobs it cannot read.
Animated diagram of Guardian, a zero-knowledge password manager. The master password goes through Argon2id into the master key, which HKDF-SHA256 splits into an auth hash and an enc key. Only the auth hash goes to the server, which stores an Argon2id of it. The enc key never leaves the client: it opens the vault key with AES-256-GCM, and the vault key seals every item, name included, with AES-256-GCM and AAD bound to the user and the item. The server only receives and stores opaque blobs in PostgreSQL.
Three languages, each where it pays off most: Go for services, TypeScript for web apps and Python for data and talking to the PLC.
go 1.27 · production
Simple concurrency with goroutines and a single binary with no runtime to install, which makes it great for network services. I use it for a web supervisory system on Gin + SQLite (REST + WebSocket, JWT with rotating refresh tokens, rate limiting) and for Guardian, a zero-knowledge password manager with a TUI.
$ go mod init github.com/guialvesrf/app go: creating new go.mod: module github.com/guialvesrf/app
ts 6 · api + web
Types catch the bug before it reaches production, and Bun rounds it out as a fast runtime with its own bundler and test runner. In the commissions app, the API runs on Express, Prisma and PostgreSQL, with automated tests and CI on GitHub Actions.
$ bun init -y + .gitignore + index.ts + tsconfig.json (for editor autocomplete) + README.md To get started, run: bun run index.ts
python 3.14 · data + PLC
A mature scientific ecosystem: linear algebra, statistics and machine learning without reinventing anything. I use it for the adaptive tuning service (NumPy and a scikit-learn random forest), built with ports and adapters, and for the core that talks to the PLC over Modbus TCP.
$ python3 -m venv .venv && source .venv/bin/activate
First place at Global Solution Future at Work 2025, the FIAP hackathon held on November 11, 2025.
FIAP University Center certifies that
Guilherme Alves Rodrigues Ferreira
Won the Global Solution Future at Work 2025, held on November 11, with a workload of 2 hours.
A FIAP challenge themed Future at Work: think up, build and pitch a tech solution for the future of work, against the clock. The project took first place in the 2025 edition.
Software Engineering, at FIAP and now at UniRV.
2026 – present
UniRV · Universidade de Rio Verde
in progress2024 – 2025
FIAP
endedOpen to back-end developer opportunities.