# Emanuel Dan
> Software developer · architecture, debugging, coordination · Bucharest
Understand the problem first. Then write the simplest code that holds.
Seventeen years of shipping for the web, the last seven on point-of-sale: a self-ordering kiosk that runs in four countries, the kitchen display, a delivery dispatch app and a new front end for the back office. I stay close to the decisions, from the architecture down to the last log line.
17yrsshipping production code, since 2009
30+brandsrun their kiosks on one codebase I work on
4countriesHungary, France, Poland and Romania
25+siteshotel and restaurant websites and booking engines delivered
$ whoamisoftware developer · architecture, debugging, coordination · bucharestTip: press ⌘K or Ctrl K to open any file.
# About
Full stack, from the restaurant floor to the server.
I started writing websites in 2009 and moved through booking engines, custom CMS platforms and hotel portals. One of those projects won Best Hotel Website at the 2018 eTravel Awards. Since 2019 I have been at Bitsoft, building software for quick-service restaurants.
I’m pragmatic, analytical and focused on results. I care about the quality and performance of what I build, and just as much about what it changes for users, clients and the people who run it every day. I stay directly involved in technical and implementation decisions: I’d rather understand the mechanism than just hand the work off.
Most of my time goes into the self-ordering kiosk, with the kitchen display, the delivery dispatch app and the back-office front end around it. I like the parts nobody sees: one codebase configured per client instead of forked, tests that walk the whole order on every brand variant, and releases boring enough to ship on a Friday.
## Right now
> Best Hotel Website, eTravel Awards 2018
# What I do
Software, debugging and the decisions around them.
## Software development and architecture
Web applications, back ends, integrations and APIs, mostly in PHP and JavaScript, with the databases behind them. I design for the long run and treat performance as something to measure, not guess.
For example:
- A self-ordering kiosk that runs for 30+ brands from one codebase, configured per client
- Integrations with POS systems, bank terminals and fiscal printers
- A rules engine that moved 117 home automations into tested code
## Analysis and debugging
Finding the cause of problems that cross several systems: reading logs, forming hypotheses and testing them, and weighing the impact of a change before it ships. The fix has to hold, not hide the symptom.
For example:
- Production support, from the first investigation to the release
- Payment and fiscal changes checked against every client’s setup before they ship
- A differential bench that replayed about 12,400 events to prove a migration changed nothing it shouldn’t
## Technical and operational coordination
Prioritising development, estimating effort and working with technical teams, and making the trade-off between time, complexity and commercial benefit explicit.
For example:
- Every support ticket tracked from the report to the release
- Changes planned per client and per country, so a fix for one doesn’t break another
<template>
<!-- Bitsoft · 2019 – now -->
<h1>Self-ordering kiosk</h1>
<p>A multi-tenant kiosk app for quick-service restaurants. Customers browse the menu, customise products, pay by card and get a fiscal receipt, while the order goes straight to the POS and the kitchen.</p>
<ul>
<li>One codebase, configured per client, running for 30+ brands, among them Burger King, Popeyes, Subway, Bellozzo and Pep&Pepper</li>
<li>Integrations with POS systems, bank terminals and fiscal printers, including French NF525 rules</li>
<li>Electron builds for Windows and Linux with remote updates</li>
<li>A flow-test harness that runs the full order on every brand variant (Jest, Playwright)</li>
</ul>
</template>
<script setup>
const stack = ["Vue", "Quasar", "Electron", "Node.js", "Jest", "Playwright", "Docker"]
</script>
# Around the kiosk
<!-- Bitsoft · restaurant platform -->
The kiosk is one stop on an order’s way through the restaurant. I work on the other apps it passes through, too.
- OrderOnline ordering sitefood ordering on the web (for a while)
- KitchenKDSkitchen display system, now
- DeliveryDispatchdelivery app, now
- ReportsBreeze ReportingFlutter app for iOS and Android
Back officea rebuilt front end on top of the existing system
# MCP tools for support
<!-- Bitsoft · AI tooling -->
MCP servers that give coding agents read access to the POS database, so support tickets can be investigated with real data.
$ agent "check the ticket against POS data"● pos-db · read_orders(location, date)● pos-db · read_payments(order)✓ found the mismatch
tags:
MCP MySQL# Earlier: hospitality web, 2011 – 2019
Hotel portals, booking engines, restaurant ordering and SEO. Some of these sites have been redesigned since.
# house.py · Personal · Home Assistant · ongoing
"""
A house that runs itself
My house makes its own decisions. It heats room by room, runs the air conditioning on solar surplus, waters the garden unless rain is coming, closes each shutter when the sun hits that window and keeps going on battery when the power drops. Behind it are 190 devices, more than 3,000 entities and six integrations I wrote in Python.
"""
class House(Autonomous):
devices = 190 # devices
entities = 3,066 # entities
own_integrations = 6 # own integrations
automations_in_code = 117 # automations moved into code
def heating(self): # Heating
"""Each zone has a role: comfort, sleep and eco presets, eco while a window is open or nobody is in the room, scheduled preheat, an away mode and anti-freeze protection."""
def solar_and_ac(self): # Solar and AC
"""The inverter’s surplus decides which AC may heat or cool. When the sun fades the units stop one at a time, and a missing inverter reading counts as no sun."""
def irrigation(self): # Irrigation
"""Programs per zone, with pump and valve control. A run is skipped when rain is forecast or already falling, and after a restart every valve is closed first."""
def shutters(self): # Shutters
"""Each shutter knows where the sun is against its own window: azimuth, elevation, a monthly correction and the day’s forecast high. Frost nights close them; a move by hand pauses the rules until evening."""
def weather(self): # Weather
"""A weather-station integration (Wunderground or Tempest, read through a small PHP server) supplies the rain forecast that irrigation and the other rules use."""
def power_and_presence(self): # Power and presence
"""UPS and grid-voltage alerts, recovery after a power cut, arrive and leave routines, NFC tags, camera person detection and four wall panels with summer and winter layouts."""
# How it’s built
# - Six custom integrations: about 9,000 lines of code and four custom dashboard cards, configured from the UI, in English and Romanian
# - 117 YAML automations, 48 scripts and 146 helpers moved into code, through a rules engine that runs each rule on Home Assistant’s own automation machinery so behaviour stays identical
# - Every migration came with a backup and a one-command restore. Climate was checked 1:1 on a differential bench (46 scenarios, about 12,400 events); any intended behaviour change went in as a numbered fix that I approved
# - A test mode that runs on a copy of the settings, so I can test without touching the live house
# Also: lights that take their colours from the album cover that’s playing, an IR-controlled LED strip that works as a real light, and automation for the Denon AV receiver.
$ python house.py --today06:10 Bedroom preheats to the comfort preset09:40 Solar surplus: the living room AC starts heating12:15 Sun on the south windows, hot day: 3 shutters close16:30 Sun is fading: ACs stop one at a time18:00 Rain in the forecast: evening irrigation skipped21:05 Office window open: the zone drops to eco23:40 Frost below the threshold: open shutters close✓ Day complete. 7 decisions, 0 manual interventions.
// How I decide: Evidence before opinions, small steps before big ones.
// In complex situations I look for the real cause first, then for the simplest solution that solves it reliably. Complexity isn’t an advantage in itself, and I don’t add mechanisms whose benefit is small.
export const principles = [
{ name: "Pragmatic",
why: "A stable, fast-enough solution usually beats a perfect one that costs twice as much. Complexity has to earn its place." },
{ name: "Evidence first",
why: "Logs, measurements and tests before opinions. When two options look equal on paper, I measure them." },
{ name: "Root cause, then the simplest fix",
why: "Find what is really broken, then make the smallest change that fixes it reliably. Hiding the symptom doesn’t count." },
{ name: "Small, reversible changes",
why: "Incremental steps, validated before production, each with a way back. Every migration in my house came with a one-command restore." },
{ name: "Balanced optimisation",
why: "Performance matters, weighed against build cost, maintenance and what the business needs right now." },
{ name: "Plain language",
why: "Clear explanations without corporate filler, so the people who own a system understand it and can decide for themselves." },
] as const;
// When something breaks
export const whenSomethingBreaks = [
1. "Observe" → "Reproduce it, collect logs, metrics and timestamps, and write down what is known and what is only assumed.",
2. "Hypothesise" → "List the possible causes, the most likely and cheapest to check first.",
3. "Test" → "Run the smallest experiment that can rule a cause in or out.",
4. "Fix" → "Change the root cause with the simplest fix that holds, reversible and validated before production.",
5. "Verify" → "Compare before and after, and add a test so it can’t come back quietly.",
];
# Technology and AI
A colleague, not a shortcut.
New technology and automation keep my attention, and I treat AI as a technical and intellectual partner, not a fast way to generate content. The point is to be more productive without giving up quality or control: what it writes gets the same review, tests and scepticism as anyone else’s code.
## What I use it for
- Faster development and debugging
- Analysing complex technical problems
- Automating the repetitive parts of the work
- Comparing technical alternatives objectively
- Built into the workflow: coding agents every day, MCP servers that let them read the systems I support, lint and tests after every change
> Open to innovation, careful about adopting generated output uncritically.
$ git log --career
commit 5cf15de (HEAD -> main)
Senior Full-Stack Developer @ Bitsoft
Restaurant software for international quick-service brands: the self-ordering kiosk, the kitchen display system, a delivery dispatch app, a rebuilt back-office front end, the online ordering site and a Flutter reporting app. Payment, fiscal and POS integrations, test automation, releases and support.
commit b669ecc
Web Developer @ Red Route Digital
Booking engines, a custom CMS, API integrations and SEO for hotels and resorts. Delivered 25+ products, including the winner of Best Hotel Website at the 2018 eTravel Awards.
commit 1058843
Web Developer @ Expremio Technology
Websites and web applications for local clients, mainly Romanian hotel chains, from build to long-term maintenance.
commit 0d5ebcb
Web Developer @ Tecksoft Concept
First production websites, built and maintained end to end.
{
"Front end": ["Vue.js", "Quasar", "JavaScript", "HTML", "CSS", "Sass", "Electron"],
"Mobile": ["Flutter", "Dart"],
"Back end": ["PHP", "Laravel", "Node.js", "REST APIs", "MySQL", "NoSQL"],
"Quality and delivery": ["Jest", "Playwright", "ESLint", "Docker", "Git", "CI builds"],
"Restaurant tech": ["POS integration", "Bank terminals", "Fiscal printers", "NF525", "Multi-tenant config"],
"AI and automation": ["AI coding agents", "MCP servers", "Python", "Home Assistant"],
"also": "Also: SEO, WordPress · Romanian (native), English (C1)"
}
# Off the clock
Curiosity that doesn’t clock out.
Outside work it’s the same curiosity with different hardware: electronics, audio and video systems, home automation and my own digital infrastructure. I like to experiment, configure and improve complex systems, and I give personal projects the same rigour as paid ones.
I care about energy efficiency, smart-home technology, good multimedia and technology that fits into everyday life without getting in the way. When something interests me I go deep, compare the alternatives and look for a solution that lasts.
## Working with me
- Analytical and curious · I look for logical explanations and mechanisms I can verify.
- Direct and pragmatic · Clear conclusions and recommendations you can act on.
- Independent · I want to understand a solution well enough to make my own decisions about it.
- Demanding about quality · I notice details, inconsistencies and solutions that aren’t well founded.
- Always improving · There is usually a better way, and I keep looking for it.
- Open to arguments · Better evidence changes my mind. Dry humour helps, too.
> I value autonomy, the freedom to experiment, things done well and being in control of the systems I use.
#!/usr/bin/env bash
# Have a product that needs to ship?
# Kiosks, web apps, mobile apps or the integrations between them. Tell me what you’re building and I’ll answer within a couple of days.
location="Bucharest, Romania"
phone_and_vcard # Phone and vCard
download_cv # Download CV
$ ./contact.sh
- Files
- Vkiosk.vuework/
- M↓platform.mdwork/
- M↓mcp-tools.mdwork/
- M↓earlier.mdwork/
- pyhouse.pyhome/
- M↓README.md~/
- M↓about.md~/
- M↓what-i-do.md~/
- TSprinciples.ts~/
- M↓ai.md~/
- gitcareer.log~/
- {}skills.json~/
- M↓off-the-clock.md~/
- $contact.sh~/
- Commands
- ›Download the CV
- ›Show phone and vCard
- ›Toggle light / dark theme
- ›Switch to Romanian
- ›Privacy policy
- Nothing found