Development
I build websites and web applications in TypeScript, from the database to the interface. For every feature I first write a test that fails, and only then the code.
Who it is for
Companies that want a custom website, client-facing system or internal software. Also those that already have a system but find it slow or hard to change.
What I take on
- Business website
- A statically generated, search-friendly site that loads quickly even on a slow mobile connection.
- Enquiry and booking
- Enquiry and appointment forms, application flows, with a notification for the owner.
- Calculator, configurator
- A calculating or assembling interface that follows your business rules, with tested logic.
- Admin interface
- An internal interface for managing content, bookings or data, with permissions.
- Client and partner portal
- Sign-in, and showing a person their own data and statuses.
- Web shop
- A web shop with custom features.
- Integration
- APIs and external systems, email, database, authentication, file storage. Only with the services that are actually needed.
- Existing code
- Tests for the current behaviour first, then refactoring, bug fixes and speed-ups.
What we agree on first
- Whether a specific feature or integration is feasible is decided once the requirements are known. I do not promise anything unconditionally in advance.
- Scope, deadline and billing are put in writing before the order.
- How deep the testing goes depends on the project and its risks.
An example from this site
The contact form validation and its test, shortened. The browser and the server call the same function, so the rules on the two sides cannot drift apart.
// src/lib/contact.ts
export function validateContact(raw) {
const name = text(raw.name);
const email = text(raw.email);
…
if (!name) errors.name = m.nameRequired;
else if (name.length > LIMITS.name) errors.name = m.nameLong;
…
} // tests/site/contact.test.ts
it('accepts and trims a valid message', () => {
const r = validateContact({ name: ' Kiss Anna ', … });
expect(r).toEqual({ ok: true, data: { name: 'Kiss Anna', … } });
});
it('reports every missing field in the requested language', …); What you get at the end
- Working code in a Git repository, with its full history.
- The tests next to the code, runnable with one command.
- A short write-up on installing, running and the main decisions.
- An automated check that keeps running on later changes.
How it goes
- 1. Understanding. What the software must do, for whom, and how we can tell it works. These become the acceptance criteria.
- 2. Small steps. Every feature starts with a failing test. After each step there is something that can be tried out.
- 3. Automated checks. Tests, accessibility and performance checks run before anything is released.
- 4. Handover. Documented code together with its tests, so it can be changed safely later.
Maintenance and further development
The work can continue after handover.
- Regular technical checks.
- Updates and bug fixes.
- Further development within an agreed scope.
- Technical support.
The time allowance, how urgent and normal faults are handled, and billing are agreed together when ordering. I do not offer unlimited support.
Tools
TypeScript, JavaScript, Vue.js, Nuxt, Astro, React, Node.js, Supabase, Tailwind CSS, Sass, Java, Python, C, C++, Git, Linux
Frequently asked questions
Which technologies do you use?
TypeScript, with Vue/Nuxt, Astro or React for the interface and Node.js or Supabase for the backend. For content that rarely changes I use static generation, because it is the fastest and leaves the least room for errors.
Do you work on existing code?
Yes. First I write tests for how the code works now, and only then change it. That way it shows when a fix breaks something else.
Who owns the code after handover?
You do, together with the tests and the write-up. I hand it over so that another developer can continue safely.
Related work
Let's talk
Do you have an idea or an operational problem? Describe briefly what you need, and we will look at how it can be done.
Put the project together step by step, with an informative estimate