A form that excludes no one
Validates as you type, asks the server about the e-mail, summarises errors at the top — and can be operated entirely by keyboard.
- Inline validation
- async check
- error summary
- focus management
- WCAG 2.1 AA
Software engineering · Architecture · Consulting — Mainz, Germany
Architecture, software and operations from one hand — reasoned, documented, ready to hand over.
Five disciplines, one person accountable — so no decision falls between two responsibilities.
Applications for workflows no standard product maps cleanly — built to scale, not bolted together.
A decision you can rely on before budget flows into an architecture that can't be corrected later.
The design of the whole: how the parts fit together, where data lives and what happens when a part fails.
Automated delivery with checks that actually block — and a way back when something goes wrong.
Infrastructure as code instead of grown handiwork — including an honest calculation of the running costs.
Projects that run — what was built, not what was promised.
Event and design agencyRental catalogue, dispatch planner, importer and website on one shared back end: a catalogue for customers, a planning tool for the team, an import for the inventory — shipped through the same pipeline that builds this site.
Working group of the German Acoustical Society (DEGA)A tool that checks every link in a body of PDF documents for reachability, detects dead targets and — where a reliable replacement exists — proposes it with a confidence rating. Runs locally, delivers a readable report.
Attorney at law, FürthA custom WordPress theme instead of a bought one, and an SEO roadmap with measurable goals for the local market — organic and in the Maps pack, measured with Search Console instead of gut feeling.
Four things we deliver — here on the page, not as screenshots. Click, type, use the keyboard.
Validates as you type, asks the server about the e-mail, summarises errors at the top — and can be operated entirely by keyboard.
A metric that moves every second without moving the page. Pausable, deterministic, and calm under reduced motion.
Simulated data, generated deterministically (seed 7). The same curve on every load.
A command palette like the one in your editor. It really navigates this page — with ⌘K, arrow keys and Escape.
The architecture of this site — not as a diagram, but as what just served it. Each node explains its part; a request runs through at the press of a button.
Requests the page and receives finished HTML. JavaScript adds behaviour — the cursor, the demos — and is a precondition for none of it.
Each ends with something tangible — and with the option to stop.
A conversation about the problem, not the solution. It ends with a written assessment: feasibility, risks, rough order of magnitude — free and without obligation.
Architecture, data model and interfaces are settled before code exists. Every decision is recorded with its reasoning.
Delivery in short intervals against a running environment. Progress is visible, not reported — and scope can change at any time.
Operations, documentation and onboarding of the internal team. Then the client decides whether we stay — not a vendor lock-in.
Chosen for the problem, and for whether your team can still run it in a year.
deployment:
provider: cloudflare-workers
cloudflare:
config: wrangler.jsonc
# populateCache copies the prerendered [slug] pages into the asset bundle
# (static-assets incremental cache, see open-next.config.ts); without it
# every generateStaticParams route is a 404 on the Worker.
build_command: npm run build && npx opennextjs-cloudflare build && npx opennextjs-cloudflare populateCache local
# Three environments, one name each, identical in GitHub / Cloudflare /
# Infisical. See ~/docs/operations/ENVIRONMENT_CONVENTION.md. `development`
# is local-only and never deployed, so it has no entry here.
#
# Feature-branch PRs are deliberately NOT deployed: PR pipelines build, lint
# and test only. The first deployment of a change is the merge to `dev`.
environments:
- name: preview
trigger:
event: push
branch: dev
auto_deploy: true
- name: production
trigger:
event: push
branch: main
auto_deploy: true
The block that ships this very page — not an example, the configuration. It is read again at the next build.
This list is a snapshot, not a creed. If your team already works on another stack, that is usually the better argument than our habit.
No price list — a number you can rely on comes after the clarification, not before.
A bounded undertaking with a defined result, date and fixed price.
Fixed capacity per month for projects whose scope changes with what is learned.
Second opinion, architecture review or technology decision — clearly bounded in time.
The answers that otherwise cost the first quarter of an hour of a first call.
There is no lower limit. A two-day architecture review is as welcome as an application that runs for a year. If a project is better placed with someone else, we say so in the first conversation.
Because a number you can rely on only exists after the clarification. You get a written order of magnitude before any effort is billed — the first conversation and the assessment are free.
Yes, that is the rule. Before changes to a grown system comes an inventory: what runs, what depends on it, and what breaks on a change. A rebuild is only proposed when it is genuinely cheaper than the repair.
Code, infrastructure definitions and access belong to the client and live in the client's accounts — not in ours. Onboarding the internal team is part of the handover. Further collaboration is an option, not a precondition.
In the EU by default. If a project requires a service outside the EU, that is named and justified beforehand, instead of being hidden in a data processing agreement.
Yes. Since 28 June 2025 the European Accessibility Act applies, which refers to WCAG 2.1 level AA for web content. We build against it from the start — accessibility added later costs more and is rarely complete.
You get an honest first assessment — including the cases where we advise against it.