Aarhus, Denmark
Software Engineer building stable, business-critical systems.
I'm Eduard, a Software Developer at Bankdata in Silkeborg. Calm under complexity, meticulous about quality, and motivated by long-term solutions for business-critical systems.

About
I'm a Software Engineer based in Aarhus, with five-plus years across the public sector, defence, retail, and SaaS. Since October 2026 I have been a Software Developer at Bankdata. From April to September 2026 I was at Mjølner Informatics, which I joined after closing my chapter at Netcompany. Before that came a multi-system run inside Netcompany across Danish public-sector platforms (KOMBIT VALG elections, STIL / Uddannelse.dk education, and adjacent municipal systems), and earlier Greenbyte ApS, Boozt, and Systematic. The throughline is quality-focused delivery: backend and frontend feature work, requirements clarification, automated testing, and the kind of stakeholder coordination that lowers delivery risk.
Romanian by birth, Danish by residence, European by inclination. I hold an MSc in Engineering: Technology-Based Business Development from Aarhus University (2022 – 2024), and a BSc in Software Technology Engineering from VIA University College in Horsens. The marketing diploma I started with at IBA Kolding still pays off; it left me with a habit of reading a brief carefully before writing a line of code.
What I look for in a team: meaningful systems, calm review culture, and colleagues who treat correctness as the long game. The /my-story page has the longer arc; the /now page has whatever has my attention this month.
At a glance
- 5+
- Years engineering software
- 4
- Languages
- 4
- Major projects shipped
- 20+
- Countries visited
Experience
Five years across six companies.
My professional timeline across six companies in five years, ordered with the current role first. Company names link to their websites.Software Developer
Bankdata · Silkeborg, Denmark
Oct 2026 – Present
Joined Bankdata in October 2026 as a Software Developer in Investment Advisory, based at the development centre in Silkeborg.
Software Engineer
Mjølner Informatics · Aarhus, Denmark
Apr 2026 – Sep 2026
Mit Norlys (mit.norlys.dk), Norlys's customer self-service platform, on Team Bifrost as a Mjølner consultant. React 19 + TypeScript in an Nx monorepo, with .NET 9 BFF work alongside. Rebuilt the platform's Datadog observability (two live dashboards and consent-gated RUM with GDPR PII masking), stood up the Playwright end-to-end foundation with CI, delivered BFF telemetry and fail-fast incident fixes, and built an Electron QA tool from scratch whose adoption on managed company PCs drove an org-wide endpoint-policy change.
TypeScriptReactNxDemo repos for TypeScriptUnknown is a value
- Problem
- When a figure cannot be worked out from its sources, code tends to return a plausible number anyway. That number then ends up in charts and reports with nothing to show it was a guess.
- Use case
- Anyone building reports or dashboards on incomplete records, for example a salary comparison where one source includes pension and another never says.
- What this demo shows
- Open maybe.ts and salary.ts. A calculation returns either a known value or unknown with a required reason, and TypeScript will not let the caller use the number until it has handled the unknown case. Look at change(): it refuses on two separate grounds, a missing pension basis and different weekly hours.
C#Demo repos for C#Result, not exception
- Problem
- If "this vehicle is already booked" and "the database is down" are thrown as the same kind of exception, every caller writes the same catch block and the two cases get mixed up.
- Use case
- A team building a .NET web API that needs honest status codes: expected business failures are handled by the caller, infrastructure failures go to one central handler.
- What this demo shows
- In BookingEndpoint.cs a booking comes back as a Result. A clash maps to 409 and inverted dates to 400, while a dropped connection still throws and becomes a 500. The handler has no try/catch at all.
.NETMartenWolverinePlaywrightStorybookDatadogElectronGitHub ActionsDemo repos for .NETResult, not exception
- Problem
- If "this vehicle is already booked" and "the database is down" are thrown as the same kind of exception, every caller writes the same catch block and the two cases get mixed up.
- Use case
- A team building a .NET web API that needs honest status codes: expected business failures are handled by the caller, infrastructure failures go to one central handler.
- What this demo shows
- In BookingEndpoint.cs a booking comes back as a Result. A clash maps to 409 and inverted dates to 400, while a dropped connection still throws and becomes a 500. The handler has no try/catch at all.
IT Consultant
Netcompany · Aarhus, Denmark
Oct 2024 – Feb 2026
KOMBIT VALG, Denmark's administrative election platform. Full-stack C#/.NET + Angular. Jun–Sep 2025 stint at STIL on UA.dk EUD III, leading the build of a reusable UI component catalog on JBoss + TypeScript + jQuery.
C#Demo repos for C#Result, not exception
- Problem
- If "this vehicle is already booked" and "the database is down" are thrown as the same kind of exception, every caller writes the same catch block and the two cases get mixed up.
- Use case
- A team building a .NET web API that needs honest status codes: expected business failures are handled by the caller, infrastructure failures go to one central handler.
- What this demo shows
- In BookingEndpoint.cs a booking comes back as a Result. A clash maps to 409 and inverted dates to 400, while a dropped connection still throws and becomes a 500. The handler has no try/catch at all.
.NETDemo repos for .NETResult, not exception
- Problem
- If "this vehicle is already booked" and "the database is down" are thrown as the same kind of exception, every caller writes the same catch block and the two cases get mixed up.
- Use case
- A team building a .NET web API that needs honest status codes: expected business failures are handled by the caller, infrastructure failures go to one central handler.
- What this demo shows
- In BookingEndpoint.cs a booking comes back as a Result. A clash maps to 409 and inverted dates to 400, while a dropped connection still throws and becomes a 500. The handler has no try/catch at all.
ASP.NETEntity Framework CoreAngularMS SQLAzure DevOpsJBoss / WildFlyDemo repos for ASP.NETResult, not exception
- Problem
- If "this vehicle is already booked" and "the database is down" are thrown as the same kind of exception, every caller writes the same catch block and the two cases get mixed up.
- Use case
- A team building a .NET web API that needs honest status codes: expected business failures are handled by the caller, infrastructure failures go to one central handler.
- What this demo shows
- In BookingEndpoint.cs a booking comes back as a Result. A clash maps to 409 and inverted dates to 400, while a dropped connection still throws and becomes a 500. The handler has no try/catch at all.
TypeScriptjQueryPlaywrightDemo repos for TypeScriptUnknown is a value
- Problem
- When a figure cannot be worked out from its sources, code tends to return a plausible number anyway. That number then ends up in charts and reports with nothing to show it was a guess.
- Use case
- Anyone building reports or dashboards on incomplete records, for example a salary comparison where one source includes pension and another never says.
- What this demo shows
- Open maybe.ts and salary.ts. A calculation returns either a known value or unknown with a required reason, and TypeScript will not let the caller use the number until it has handled the unknown case. Look at change(): it refuses on two separate grounds, a missing pension basis and different weekly hours.
Software Engineer / Student Software Engineer
Greenbyte ApS · Horsens, Denmark
Nov 2021 – Sep 2024
Kalenda, a planning and shift-management SaaS for daycare centres, schools, libraries and citizen services. Java and Spring backend with JSP/JSTL and a React front end; architect and lead developer of the Flutter/Dart mobile companion app.
JavaDemo repos for JavaRead model apart from write
- Problem
- When the same entities serve both the business rules and the screens, a summary page ends up loading several aggregates and building rows in a loop, and changing the screen puts the rules at risk.
- Use case
- A Spring application where one screen needs a flat, joined view (here an account summary) while money transfers must follow strict rules inside a single transaction.
- What this demo shows
- Compare the two files. AccountSummaryQuery.java returns a plain record from one SQL query, with no entities. TransferService.java enforces the transfer rules and never mentions the screen. Worth noticing: accounts are locked in id order to avoid deadlocks, and there is no second database or event bus.
SpringHibernateJSPApache TomcatReactFlutterDartDemo repos for SpringRead model apart from write
- Problem
- When the same entities serve both the business rules and the screens, a summary page ends up loading several aggregates and building rows in a loop, and changing the screen puts the rules at risk.
- Use case
- A Spring application where one screen needs a flat, joined view (here an account summary) while money transfers must follow strict rules inside a single transaction.
- What this demo shows
- Compare the two files. AccountSummaryQuery.java returns a plain record from one SQL query, with no entities. TransferService.java enforces the transfer rules and never mentions the screen. Worth noticing: accounts are locked in id order to avoid deadlocks, and there is no second database or event bus.
.NETDemo repos for .NETResult, not exception
- Problem
- If "this vehicle is already booked" and "the database is down" are thrown as the same kind of exception, every caller writes the same catch block and the two cases get mixed up.
- Use case
- A team building a .NET web API that needs honest status codes: expected business failures are handled by the caller, infrastructure failures go to one central handler.
- What this demo shows
- In BookingEndpoint.cs a booking comes back as a Result. A clash maps to 409 and inverted dates to 400, while a dropped connection still throws and becomes a 500. The handler has no try/catch at all.
System Engineer
Boozt Fashion · Malmö, Sweden
Oct 2021 – May 2022
Large-scale e-commerce backend on boozt.com in PHP/Symfony. Introduced Kanban; quality and test automation focus.
PHPSymfonyDoctrine ORMMySQLBehatMockeryGuzzlePHPUnitDemo repos for PHPMoney as a value object
- Problem
- Floats lose fractions of a krone, nothing stops kroner from being added to euros, and splitting an amount three ways quietly loses a unit.
- Use case
- Any system that handles prices, invoices or payouts, where amounts must add up exactly and currencies must never mix.
- What this demo shows
- Money.php keeps amounts as whole minor units (øre, cents) with the currency inside the object. Adding two different currencies throws, and allocate() splits 100 into 34, 33 and 33 so the parts always sum to the whole. Every operation returns a new object.
Junior Systems Engineer
Systematic · Aarhus, Denmark
Feb 2021 – Jun 2021
Mission-critical SitaWare suite (Frontline, Edge). Java + Angular. NATO interoperability.
JavaAngularJUnitKarmaJasmineRobot FrameworkSeleniumDemo repos for JavaRead model apart from write
- Problem
- When the same entities serve both the business rules and the screens, a summary page ends up loading several aggregates and building rows in a loop, and changing the screen puts the rules at risk.
- Use case
- A Spring application where one screen needs a flat, joined view (here an account summary) while money transfers must follow strict rules inside a single transaction.
- What this demo shows
- Compare the two files. AccountSummaryQuery.java returns a plain record from one SQL query, with no entities. TransferService.java enforces the transfer rules and never mentions the screen. Worth noticing: accounts are locked in id order to avoid deadlocks, and there is no second database or event bus.
PowerShellTeamCityBitbucketDemo repos for PowerShellA ratchet gate
- Problem
- Turning on a lint rule in a codebase that already breaks it thousands of times leaves two bad options: block every build, or settle for warnings nobody acts on.
- Use case
- A team adopting a new rule in an existing codebase that wants new code to follow it from day one and old code to improve over time.
- What this demo shows
- Invoke-RatchetGate.ps1 reads an ESLint JSON report, counts violations per rule against a baseline committed to the repository, and fails only when a count goes up. The baseline is only ever lowered automatically; raising it takes a commit a reviewer can see.
How I work
Six short principles on how I deliver, each grounded in a specific project or role from my CV.Six short principles, each grounded in something I've actually shipped (not chips, not buzzwords). Where it was learned is on the line above each.
KOMBIT VALG · Netcompany 2024–2026
I optimise for legibility over cleverness when the audit trail will outlive me. Election platforms have to read clearly to auditors years later, so I treat naming, comments, and PR descriptions as part of the deliverable, not garnish.
STIL / UA.dk · Netcompany 2025
When the deadline is fixed and the team is small, I pair the architecture conversation with the first commit. On the four-month EUD III stint at STIL we shipped a reusable component catalog because we agreed the boundaries on day three, not at the retro.
SitaWare · Systematic 2021
I lean on test automation when the cost of a defect is borne downstream. Robot Framework UI tests on Frontline & Edge weren't a vanity exercise: defence software calibrates how seriously you take qualification.
Greenbyte mobile · 2021–2024
Architect-and-ship rather than architect-then-hand-off. I designed the Flutter / Dart companion app and stayed on it through release, which is also how I learned that the second-hardest part of a mobile app is the release pipeline.
Boozt Fashion · 2021–2022
I introduce process changes the same way I introduce code changes: small, reversible, and measured. Bringing Kanban into the campaign-booking team was a six-week experiment with an exit ramp, not a mandate.
Across all five roles
I read the brief twice before writing the first line. The marketing diploma I started with at IBA Kolding wasn't wasted; it left me with a habit of clarifying scope with stakeholders before the IDE is open.
Working with
Tools and languages.
Backend-leaning full-stack, with deeper work in mobile and tooling. Click any logo for the official documentation.
References
What collaborators have said.
Endorsements from colleagues, clients, and academic supervisors, collected from LinkedIn and signed reference letters.“Excels in understanding complex concepts and applying them practically; communicates complex ideas clearly and collaborates efficiently across teams.”
–
Selected work
Selected case studies.
A curated set of case studies from business-critical systems I have helped design and ship, with context on the problem, my role, and the outcome.Netcompany · Oct 2024 – Feb 2026
KOMBIT VALG
Full-stack engineering on Denmark's national administrative election platform, C# / .NET, Angular, and the integrations every Danish kommune depends on at poll time.
Systematic · Feb 2021 – Jun 2021
SitaWare Frontline & Edge
Internship on Systematic's NATO-grade C2 suite. Java + Angular feature work, defect triage, and Robot Framework UI test automation under FDD.
Greenbyte ApS · Nov 2021 – Sep 2024
Greenbyte SaaS + Mobile
Three years on Kalenda, a planning and shift-management SaaS for public-sector institutions. Java and Spring with JSP/JSTL and React, and architect and lead developer of the Flutter / Dart mobile companion app.
Boozt Fashion · Oct 2021 – May 2022
Boozt e-commerce backend
PHP / Symfony backend on a large-scale Nordic fashion retailer. Feature work, automated testing, and a Kanban flow brought to the team.