# Alex Rivera Software Engineer at Northwind Labs. 8+ years of professional experience. Based in Lisbon, remote. Focus: Developer tools & reliable backends. Building the internal platform at Northwind Labs: deploy pipelines, service templates, and the tooling that keeps them boring. Previously built payment APIs at Brightpay. --- # Experience ## Software Engineer, Northwind Labs (Mar 2022 - Present) Own the internal developer platform: deploy pipeline, service templates, and on-call tooling. - Built the deploy pipeline now used by 40+ services. - Cut median time from commit to production from two days to twelve minutes. - Wrote the service template that new teams start from. Stack: TypeScript, Kubernetes, PostgreSQL, GitHub Actions ## Backend Engineer, Brightpay (Jun 2018 - Feb 2022) Worked on the payments API and the systems around it. - Designed the idempotent write path for the payments API. - Built the replay tool support uses to resolve stuck payments. Stack: Go, PostgreSQL, Kafka, AWS --- # Selected work ## A deploy pipeline teams actually use (Northwind Labs · internal platform) Replaced three hand-rolled release scripts with one pipeline: build, test, canary, promote. Adoption went from a pilot team to every service in two quarters because the first deploy took ten minutes, not a day. Metrics: 40+ services on the pipeline; 12 min median commit to production Stack: TypeScript, Kubernetes, GitHub Actions ## Idempotent payments API (Brightpay · payments) Designed the retry-safe write path for a payments API handling millions of requests a day, with request fingerprints, an outbox, and a replay tool for support. Metrics: 0 double charges in production Stack: Go, PostgreSQL, Kafka --- # Open-source and side projects ## Sample Project A small command-line tool that turns a folder of notes into a searchable index. Replace this card with your own project. Link: https://github.com/alexrivera/sample-project Language: TypeScript Topics: cli, search, notes --- # Skills ## Languages Primary: TypeScript, Go, SQL Also: Python, Bash ## Platform Primary: Kubernetes, PostgreSQL, GitHub Actions Also: Terraform, Kafka, AWS --- # Blog - [Hello world](https://alex-rivera.example/blog/hello-world) (2026-11-10, slug `hello-world`): A first post that doubles as the authoring guide for this site. Replace it with your own writing. Markdown: https://alex-rivera.example/blog/hello-world.md --- # Contact Email: alex@alex-rivera.example Website: https://alex-rivera.example - GitHub: @alexrivera (https://github.com/alexrivera) - LinkedIn: /in/alexrivera (https://www.linkedin.com/in/alexrivera) - Twitter/X: @alexrivera (https://twitter.com/alexrivera) - Email: alex@alex-rivera.example (mailto:alex@alex-rivera.example) --- # Hello world A first post that doubles as the authoring guide for this site. Replace it with your own writing. - Author: Alex Rivera (https://alex-rivera.example) - Published: 2026-11-10 - URL: https://alex-rivera.example/blog/hello-world - Tags: meta, writing This is the starter post. It shows what a post can do, and the source of this file is the reference. When you write your own first post, delete this one (or keep it as a draft with `draft: true`). ## Create a post ```sh pnpm new:post "My first post" --description "One sentence about it." --tags notes --publish ``` That creates `content/posts/my-first-post.md`. The file name is the URL: `/blog/my-first-post`. Without `--publish` the post is a hidden draft, so you can write in peace and publish later. ## Frontmatter Every post starts with a block between `---` lines: - `title`, `description` and `published` are required. The description is used on cards, in search results and in feeds. - `published` can be a date (`2026-11-10`) or a date with a time (`2026-11-10T14:30`). Posts are listed newest first, and the time orders posts from the same day. - `tags` become topic pages and filter chips. - `projects` lists project names from `content/github-projects.ts`; the post then shows them as "where I use this" cards. - `cover` is optional: a finished 1200x630 JPEG under `content/public/`, with the title already on it. - `aliases` lists former slugs. If you rename a post, put the old name here and the old link redirects. - `draft: true` hides the post everywhere. ## Callouts > [!TIP] Callouts > GitHub alert syntax works: NOTE, TIP, IMPORTANT, WARNING, CAUTION and TLDR. Add a title after the type, as in this one. ## Code Fenced code is syntax highlighted: ```ts title="greet.ts" export const greet = (name: string) => `Hello, ${name}!`; ``` A `prompt` block is a prompt readers can copy or open in Claude or ChatGPT: ```prompt title="Try it with your agent" Explain what a callout is and when to use one in a blog post. ``` ## Figures A figure is a small Svelte component that plays on its own while it is on screen. This one is registered in `content/figures/index.ts`: > **Figure: An example figure: write, check, ship, on a loop.** > > Three boxes in a row, labelled Write, Check and Ship. A highlight steps through them in turn, then starts over. > > Interactive version: https://alex-rivera.example/blog/hello-world#figure-example To add your own, create a component next to `ExampleFigure.svelte`, register it in that index with a caption and a text description, and put `::figure your-id` on a line of its own. Feeds and the Markdown copy use the caption and description instead of the component. ## Images ![A placeholder banner](/images/og-image.png "A titled image becomes a captioned figure") Put image files in `content/public/images/` and reference them with a path starting with `/images/`. ## Before you publish Run `pnpm check-content`. It tells you what is missing or still a starter value.