In Buenos Aires · & available worldwide

— Mr. Sebastian Midolo presents —

Frontend & Product vision, for startups.

✦ ✦ ✦

Frontend engineer with product instinct, six years building fast and durable interfaces for B2B and consumer startups. I work where engineering meets product decisions — the edges where most projects quietly fall apart.

The Company
KLog.co
Years of experience
7+ years
Location
Buenos Aires · Remote
Languages
Spanish · English C1
Chapter I

A brief introduction — about me.

My dear reader, —

I’m Sebastian, 26, and I’ve been writing code for sixteen years. It started with a line a friend told me when I was a kid — “programming is the tool to bring ideas into the real world” — and I haven’t found a reason to disagree yet.

The part of the job I care most about isn’t the code. It’s making sure the thing I’m building is actually going to be used. I’d rather spend an extra hour talking to a stakeholder than two weeks shipping a feature that ends up dead on arrival — that time wasn’t just lost, it was traded for something better that never got made.

For reasons that escape me, I also build interfaces in my spare time. On Saturdays I go bouldering. Weekdays, calisthenics. The rest is mostly code.

Yours, Sebastian.
Chapter II

Work Experience, on a line.

PresentJul 2025 → Now

Senior Frontend Engineer

KLog.co · Santiago, Chile
  • Cut main-search latency from 15s back to 1s by reading what PostHog was patiently trying to say, then memoizing the queries users actually run. see in full →
  • Trimmed shipment-page FCP from 5s to 2.2s — the most-visited page in the product — with an AI agent driving Chrome's MCP server to surface bottlenecks. see in full →
  • Mentored 40+ engineers in advanced TypeScript across teams: one-on-one walkthroughs, group sessions, written guides on generics, type guards, discriminated unions. see in full →
PriorMay 2019 → Jul 2025

Frontend Engineer

KLog.co · Santiago, Chile
  • Built a GraphQL-to-TypeScript filter-inference library — runtime filter bugs dropped to zero and writing a new table’s filters became a matter of minutes. see in full →
  • Wrote an OpenAPI-to-TypeScript pure-function generator — one typed function per endpoint, the whole client regenerated with a single command. see in full →
Studies→ 2026

BSc Computer Science

Universidad Nacional de Lanús · Buenos Aires

Pursued concurrent with full-time engineering practice. Expected completion 2026.

LanguageJan 2026

PTE Academic English

ICANA · Argentina

Certified C1/B2 level — overall score 66/90. One should be able to negotiate in any language.

Chapter III

A small collection of projects.

Roll and Rol landing page — a dark wooden desk arranged with notebook drawings, a D20, pencils and a candle.
Affair № Ifor a friend

Roll and Rol, a darker landing.

a darker time, told on lined paper

The landing for a friend’s roguelite of twisted fairy tales. Drawings on lined notebook paper, a moody illustrated tableau, and a single quiet call to action — sign up to receive the crows.

Next.jsIllustrationFigma
✦ open ↗
HALTON landing page — a quiet residential scene with a beige armchair, a round wooden side table and a monstera plant beside vertical timber slats.
Affair № IIfreelance

HALTON, espacios con criterio.

furniture & flooring, in a calm Argentine room

A landing page for a furniture and flooring company. Direct work with the client to translate the brand’s quiet, residential voice into three audiences — residencial, comercial and hospitalario — and a single conversational call to action.

Next.jsFigmaTailwind
✦ open ↗
Chapter IV

The gentleman's cabinet of skills.

The main stack

daily, in production

  • Next.js · React·7 yrs
  • TypeScript·7 yrs
  • Tailwind·5 yrs
  • GraphQL·7 yrs
  • Jest · PW·7 yrs
  • PostHog·2 yrs

The supporting cast

comfortable, used as needed

  • Docker·2 yrs
  • AWS·7 yrs
  • Zod·7 yrs
  • Figma·7 yrs
DisciplineSincePracticed asTier
— The main stack —
01Next.js · React7 yrsin production dailyMain
02TypeScript7 yrsgenerics, type-guards, codegenMain
03Tailwind5 yrsdesign-system tokens, componentsMain
04GraphQL7 yrsApollo, Nexus, codegen pipelinesMain
05Jest · PW7 yrsunit, integration, end-to-endMain
06PostHog2 yrsproduct analytics, perf telemetryMain
— The supporting cast —
07Docker2 yrscontainers, local dev paritySupport
08AWS7 yrsdeploy, ops, infra-as-codeSupport
09Zod7 yrsruntime schema validationSupport
10Figma7 yrsdesign handoff, prototypingSupport
M · 01Next.js · React7 yrs
M · 02TypeScript7 yrs
M · 03Tailwind5 yrs
M · 04GraphQL7 yrs
M · 05Jest · PW7 yrs
M · 06PostHog2 yrs
S · 07Docker2 yrs
S · 08AWS7 yrs
S · 09Zod7 yrs
S · 10Figma7 yrs
Main · daily Support · used as needed

Main stack

daily, in production

Next.js · React7 yrs
TypeScript7 yrs
Tailwind5 yrs
GraphQL7 yrs
Jest · PW7 yrs
PostHog2 yrs

Supporting cast

comfortable, used as needed

Docker2 yrs
AWS7 yrs
Zod7 yrs
Figma7 yrs
The main stack
NxNext.js · React TsTypeScript TwTailwind GqGraphQL JpJest · PW PhPostHog
The supporting cast
DkDocker AwAWS ZdZod FgFigma

The household runs on Next.js · React, TypeScript, Tailwind and GraphQL by day — seven years apiece, in production daily. Tests are kept in two registers: Jest for the small claims and Playwright for the public hearings, with PostHog quietly reading the room these past two years.

Behind the curtain — AWS, also seven years, with Docker as the more recent companion. Zod guards the seams where types meet runtime; Figma keeps the design conversation honest. A small, working household — nothing here that I haven’t shipped.

— A working inventory, kept current S. Midolo · MMXXVI
Chapter V

Five principal milestones.

Theme IOn developer tooling
Milestone № I · at KLog

GraphQL-to-TypeScript filter inference library

Built an internal library that reads our GraphQL schema and emits fully-typed filter configurations for every data table — operations, shipments, invoices. An entire class of drift bugs disappeared from production, and the mechanical work of writing filter configs went with them.

Read in full

Our frontend used a generic <AdvancedFilters /> component across dozens of tables. Every new column meant a hand-written config: which fields were filterable, what type each one was, which operators were valid, which options to show for enums. Three things compounded — configs drifted out of sync with the backend, errors surfaced only at runtime in production, and the team was spending real time on what was essentially clerical work.

I took up the fix. Since the GraphQL schema was already the source of truth for every column, I built a library that consumes it at build time and emits a strongly-typed signature for each query — <AdvancedFilters<GetShipment['Filters']> /> becomes self-documenting. A column typed Date produces a filter that only accepts dates, with only date-valid operators — after, before, between. Enum columns pull their options automatically.

Filter-related runtime errors fell to effectively zero. New tables ship with filters in minutes instead of an afternoon of config-writing and QA. When the backend evolves, the frontend either updates with it or fails loudly in CI — which is the better of the two failure modes.

TypeScriptGraphQLCodegenDX
Milestone № II · at KLog

OpenAPI-to-TypeScript pure function generator

A code generator that turns any OpenAPI document into strictly-typed, pure TypeScript functions — one per endpoint. The whole API surface becomes autocompletable, type-safe, and impossible to misuse. Onboarding a new backend went from a day of wiring up clients to a single command.

Read in full

We were integrating with multiple backend services, each with its own OpenAPI spec. The pattern on the team had been to hand-write a thin client per endpoint — typing the request body, query params, response shape. Tedious, error-prone, and a constant source of subtle bugs: a backend route would change, the client wouldn't, and the frontend would happily send malformed requests until a user found the broken path.

The generator takes any OpenAPI JSON and emits one pure function per endpoint. Parameters arrive as typed arguments, responses come back as precisely-typed Promises, and the functions carry no hidden state — trivially testable, trivially composable. Since the spec is the source of truth, a single command regenerates the whole client, and any breaking backend change surfaces as a compile error across every consumer of that endpoint.

Client/server drift effectively disappeared from our incident logs for the migrated services. The pure-function shape made the generated code a natural foundation for higher-level data layers, and a natural target for tests.

TypeScriptOpenAPICodegenDX
Theme IIOn performance
Milestone № III · at KLog

Search performance via behavioral analytics

When I joined, the main search took a second or two. As filters were added and data volume grew, it slid past fifteen. PostHog told me which combinations users actually ran — a small set of fields, the bulk of queries — and the targeted memoization and caching that followed cut latency back to single digits.

Read in full

When I first joined the team, our main search took one or two seconds — fast enough that nobody thought about it. Over the following months, as new filters landed from different contributors and the underlying data volume grew, the search slowly slid past the point of usability. By the time I looked at it, PostHog telemetry showed an average above fifteen seconds. None of the individual changes had been obviously wrong; performance had simply not been anyone's concern, and the cost compounded.

Rather than guess at hotspots, I went to the analytics first. The PostHog event data showed exactly which filter combinations users actually ran — and the distribution was extremely skewed, with a small set of fields accounting for the overwhelming majority of queries. With that in hand, I applied targeted memoization to the most-queried columns and introduced caching keyed on the real-world filter patterns, rather than optimising the engine uniformly. The principle was simple: optimise for the queries users actually make, not the queries they could theoretically make.

Latency dropped from above fifteen seconds back into the low single digits — roughly the experience the search had had years before, but on a much larger dataset and feature surface. Just as important, the work established a pattern on the team: when performance matters, look at analytics before you look at code.

PostHogReactProfilingCaching
Milestone № IV · at KLog

Shipment page FCP optimization, AI-assisted

Ranked every page by FCP × user volume to find where the most real time was being lost. The shipment detail page won by a wide margin. I built an agent connected to Chrome's MCP server to diagnose bottlenecks systematically, paired it with my own judgment on which fixes were worth making, and cut FCP from 5s to 2.2.

Read in full

Performance work tends to get prioritised by gut feel — whoever complained most recently, or whichever page felt slowest to the engineer who happened to look at it. I wanted a more honest answer, so I pulled PostHog data and computed a simple ranking: FCP multiplied by user volume for each page. The shipment detail page came out on top by a wide margin — slow at ~5s FCP and heavily trafficked, meaning it was where users were actually losing the most time, in aggregate.

The page had grown complex enough that manually hunting bottlenecks would have meant a long, scattered investigation. So I built an agent that connects to Chrome's MCP server, drives the browser to load the page under varying conditions, captures performance traces, and surfaces bottlenecks systematically. I paired the agent's findings with my own judgment about which fixes were worth making — some textbook-correct suggestions were architecturally expensive; some small changes had outsized impact. The agent found signal; I decided what to act on.

FCP dropped from 5 to 2.2 seconds on the single most-visited page in the product. Beyond the numbers, the work demonstrated something I now look for: AI agents are most useful not as autonomous fixers, but as tireless investigators paired with a human who can judge tradeoffs.

Chrome MCPPostHogPerformanceAgentic AI
Theme IIIOn the team
Milestone № V · across teams

Mentoring 40+ engineers in advanced TypeScript

Most engineers on the team knew TypeScript well enough to make the compiler happy, but not well enough to make it useful. Ongoing mentorship — one-on-one walkthroughs, group sessions, written guides — covered the patterns that separate the two. Over time it reached 40+ people across teams.

Read in full

A pattern I kept noticing on code reviews was that most engineers on the team knew TypeScript well enough to make the compiler happy, but not well enough to make the compiler useful. People would reach for any where generics would have served them, conflate interface with type without understanding the implications, or write runtime checks that didn't narrow types because they hadn't internalised type guards. Each gap was small in isolation; together they meant we were paying for TypeScript without getting most of its value.

I started running ongoing mentorship — a mix of one-on-one code-review walkthroughs, group sessions, and written guides. The curriculum followed where I saw the most leverage: when to use interface versus type and why it matters for declaration merging and extension, the surprising power of as const for inference, generics that actually constrain rather than just exist, type-guard predicates, and discriminated unions for safely modelling state. Over time this reached more than forty engineers across teams.

The outcome wasn't a single metric but a cultural shift. Code reviews started catching fewer 'this should have been typed properly' comments because engineers were catching them upstream. Newer team members ramped faster because the patterns were documented and the seniors around them could explain why, not just what. The difference between a team that uses a tool and a team that gets full value from it usually comes down to whether someone is willing to teach.

TypeScriptMentorshipCode reviewWriting
Contact · A calling card from S. Midolo

Do you have a problem? — I can help you 

— for a project, a role, or a question. Write to me and I’ll answer within the day.

Send a private letter
By post
midolo.1912@gmail.com
By telephone
+11 5966-9129
In residence
Buenos Aires
Online
linkedin / sebastian-midolo