01IntroductionFirsthand · For agencies

A senior TypeScript
engineer for your
client projects.

Turns the badge to this side.

I help your agency take on more client work by building features across the interface, backend and reports. I work in your repository and follow your review process. Before I start, we discuss how the feature affects the rest of the product and what your team will review. I have six years of professional experience, including three years of fullstack work on hotel software at Tabist.

I want to understand where you want your agency to go, what matters to your team and what your client needs. I enjoy getting to know people and sharing stories beyond the project. When you invite me into client conversations, I bring that same interest in the people behind the work. The first call goes both ways. I'd like to hear your story and give you a chance to ask about mine.

02Where I can help

Where I can help

  1. You have a defined feature and want one engineer to deliver it in your existing codebase and process.

  2. The work crosses the interface, backend and reporting, and someone needs to work through the dependencies.

  3. You need to quote a client and want an engineer to review the brief or codebase first.

Bring a defined task or a rough outline. We'll discuss the codebase, what the client needs and who will review the work. I'll explain where I can contribute and what we need to clarify before agreeing on delivery.

I work in TypeScript across the stack: React and Next.js with TanStack Query and Tailwind CSS on the frontend, NestJS with Drizzle or Prisma on the backend, and AWS services such as S3 and Cognito.

TypeScript across the stack: frontend, backend and AWS Frontend React and Next.js with TanStack Queryand Tailwind CSS Backend NestJS with Drizzle or Prisma AWS Services such as S3 and CognitoTypeScript across the stack
03Relevant experienceExperience

Fullstack work on a hotel property management system.

For about three years, until September 2026, I worked at Tabist on a property management system that hotel staff use for reservations, billing and reporting. I knew most of the product and took part in decisions across it. My own implementation work centred on reservations, receipts, payments, local taxes and reports. I also contributed to the Superset queries behind its embedded reporting dashboard. This was team work, and I describe my part in it.

One example is quick receipts: recording sales and payments that have no room booking. Building them on the existing receipt and payment data would have changed the reports that depended on it. I explained that cost to the product manager and proposed giving these sales their own records, connected to the existing reports. That is the design we shipped.

I built it across the database schema, NestJS APIs and React interface. Each sale and its payments are saved together or not at all, and they appear in the existing sales and payment reports. It was released in September 2025, and I maintained it until I left. When hotels later needed to record a transaction date, the reports had to change too, because the date a payment counts for is not always the day someone entered it.

When you scope a feature for your client, I look for the same kind of dependency. A new screen can change the data and reports your client already relies on.

Before Tabist, I spent almost two years as a frontend developer at Achiko AG on Teman Sehat, a COVID-19 health app in Indonesia. I led a four-month redesign of its dashboard with a new design system, and led the move of its code to TypeScript. Our team also designed a system to read results from the device used with Achiko's new COVID-19 test. I processed the raw device data and showed it in charts for research use. I also built data tables, a markdown editor, and exports to Excel and PDF.

Diagram, not a product screen
Simplified sketch of the quick-receipt decision described in the textSIMPLIFIED SKETCH OF THE DECISION DESCRIBED HERE Quick receipts on the existingreceipt and payment data Existing reports change Quick receipts gettheir own records Connected to theexisting reportsmy proposalshipped, Sept 2025

Before Tabist, I spent almost two years as a frontend developer at Achiko AG on Teman Sehat, a COVID-19 health app in Indonesia. I led a four-month redesign of its dashboard with a new design system, and led the move of its code to TypeScript. Our team also designed a system to read results from the device used with Achiko's new COVID-19 test. I processed the raw device data and showed it in charts for research use. I also built data tables, a markdown editor, and exports to Excel and PDF.

04First engagement

Start with one piece of client work.

The usual starting point is a paid trial of one or two weeks around a real ticket. We agree on the result, dependencies, review owner, dates and fixed price before work starts.

You receive

  • 01The implementation in the agreed repository
  • 02Relevant tests and documentation
  • 03A demonstration your team can review against the acceptance criteria

The trial is a complete first engagement. Ongoing work is a separate decision.

  1. Before work starts

    We agree on the result, dependencies, review owner, dates and fixed price.

  2. One or two weeks

    A paid trial around a real ticket, in the agreed repository.

  3. You receive

    The implementation, relevant tests and documentation, and a demonstration your team can review against the acceptance criteria.

  4. The trial is a complete first engagement.

  5. Ongoing work is a separate decision.

05Working with your agencyWorking together

Your client relationship stays yours.

I can work under your agency's name. Updates go to your team, and you decide what reaches the client. We agree on any client meetings or direct communication beforehand. I do not approach your clients for my own work.

You get a written update each working day and a weekly demo. If an estimate changes or a dependency blocks progress, I explain the effect and the choices available. Changes to scope or the agreed spending cap need your approval.

I work Monday to Friday, 09:00 to 18:00 WIB, UTC+7.

We agree on live overlap. Outside that overlap, I reply within two hours during my working day. After-hours messages are answered the next working day.

Illustrative update, not a client recordIllustrativeupdate, not a client record
The account settings page is ready for review on the preview link. Importing existing users needs more work than I estimated, because some records have no email address. I recommend releasing the settings page now and scoping the import separately. Please confirm whether your client needs the import for launch before I price the additional work.
06Cost and continuityCost

Agree the scope and spending limit first.

Ongoing work is USD 45 to 75 per hour, with the rate agreed for the scope and responsibility. It usually starts at 20 hours a week, with a weekly cap and invoicing every two weeks. I confirm available hours and a start date when we discuss your project.

A weekly cap limits that week's spending. We discuss the expected total cost and schedule separately. The first paid trial has its own fixed price and completion terms.

Blank on purpose: no sample hoursBlank on purpose

The card shows how a weekly cap works. It holds no sample hours.

Your code, your accounts

Your agency or client controls the repository and project accounts. I keep setup instructions, relevant decisions and handover notes with the work so your team can continue it.

I work independently, with no automatic engineering cover during an absence. We agree on handover or ongoing support before the engagement ends.

Read the engagement details
07Contact

What does your agency need to deliver?

Email a short outline, the stack and your deadline. Include who will review the work if you already know. You do not need a finished specification to start the conversation.

We'll discuss fit and the main unknowns on a 30-minute call. If the work fits, I'll propose a first piece of work to scope and price with you.

Your email can include

  • Project outline
  • Stack
  • Deadline
  • Review contact

Tear one off, or use the button. Both open an email. Nothing is sent automatically.