./stack

The tools I reach for, and why.

Boring on purpose. Every line here has stayed in my setup for at least two years.

[languages]

Languages

TypeScript

TypeScript

For anything that ends up in a browser or a build.

For anything that ends up in a browser or a build.

Rust

Rust

When it must be fast and must not fall over.

When it must be fast and must not fall over.

Go

Go

Small servers and command-line tools.

Small servers and command-line tools.

SQL

SQL

Underrated, and still the best way to ask a database a question.

Underrated, and still the best way to ask a database a question.

[web]

On the web

React

React

For interfaces with state. I keep components small and dull.

For interfaces with state. I keep components small and dull.

Node

Node

Build scripts, servers and tests.

Build scripts, servers and tests.

Plain CSS

Plain CSS

Custom properties and a handful of rules.

Custom properties and a handful of rules.

Accessible HTML

Accessible HTML

The first draft, not a final polish.

The first draft, not a final polish.

[data]

Data

Postgres

Postgres

The default. I need a very good reason to pick something else.

The default. I need a very good reason to pick something else.

SQLite

SQLite

Local-first apps, tests, and anything under a few gigabytes.

Local-first apps, tests, and anything under a few gigabytes.

Plain files

Plain files

Underused. A folder of text files is a database with a very good backup story.

Underused. A folder of text files is a database with a very good backup story.

[habits]

Habits

Small commits

Small commits

One idea each, with a message a stranger can follow.

One idea each, with a message a stranger can follow.

Written decisions

Written decisions

Three lines in the repo: what, why, revisit.

Three lines in the repo: what, why, revisit.

Boring deploys

Boring deploys

If a release is exciting, it is too big.

If a release is exciting, it is too big.

No Friday releases

No Friday releases

Not because it is risky. Because I like my weekends.

Not because it is risky. Because I like my weekends.

05 / cat setup.toml

The whole desk, in one file.

Nothing here is rare. It is a plain laptop, a plain keyboard and a terminal I have used for eleven years.

setup.toml

[machine]

laptop = “14-inch, five years old”

keyboard = “plain, mechanical, quiet”

display = “one, at arm’s length”

[software]

editor = “a small, fast one”

shell = “whatever ships with the machine”

notes = “a folder of text files”

[desk]

synth = “second-hand, plays one note”

06 / things I avoid

Not because they’re bad. Because I’m bad at them.

x

Clever abstractions

If I need a diagram to explain a helper, I write the boring version.

x

Big rewrites

I would rather change one module every month for a year.

x

Tools that need a dashboard

If I cannot read the state in a terminal, I do not trust it yet.

07 / mail iri

Does your stack look like this? Let’s talk.

$ subscribe --notes

New notes by email, when there are any. About one a month.

Iri Halvorsen

Software engineer

Bergen, Norway

Open to work from January 2027

Colophon

Set in Geist and Geist Mono

Built in Framer

No tracking, no cookie banner

buildlog_

© 2026 Iri Halvorsen. All demo work is fictional.

exit 0

Create a free website with Framer, the website builder loved by startups, designers and agencies.