What I use
The following is the way in which I am currently using my setup. My philosophy is usually associated with it being FOSS (Free and open source software) since this is ideally how the internet is supposed to be used. Typically, the less bloat that exists the better.
Disclosure
Many of the links here are affiliate links to services and products I use. I would never use affiliate links for products that I don't personally use.
Hardware
Laptop
For my laptop, I use a Macbook Pro 15".
Mouse
For my mouse, I use a Razer Viper Pro (White). I found this mouse to be the most lightweight from what I researched but honestly more for gaming (which I haven't done in a while) so a majority of the time I am trying to just use the keyboard.
Keyboard
For my keyboard, I use a Custom Keyboard. As of right now the custom build uses a Glorious keyboard base but I think eventually I am going to give in on the split keyboard hype as it seems overall more ergonomic.
Laptop Stand
For my laptop stand, I use a Rain Design, Inc. 10084 mBar Pro+ Foldable Laptop Stand - Silver. This is essential if you want to avoid the typical back and neck pain associated with being hunched over a laptop all day. It also folds small enough to stuff it into a backpack to work outside, which I often do.
Software
Operating System
The daily driver is macOS, bullied into behaving like a tiling window manager: AeroSpace for i3-style workspaces, SketchyBar in place of the menu bar, and Karabiner remapping caps lock into something useful. Arch runs on the other machines, and my dotfiles install on both — they are tested in Ubuntu and Arch containers in CI, with an optional Nix flake for anyone who wants the whole thing declarative.
Terminal & Shell
Command Line
Most of the standard Unix tools have been quietly replaced:
- atuin — shell history that syncs and is actually searchable
- yazi — file manager
- eza and bat —
lsandcat, with colour - ripgrep and zoxide — grep and
cd, faster - delta — git diffs worth reading
- jj — Jujutsu, for the repos where I have stopped pretending git's index is a good idea
- mise — one version manager instead of five
Browser
For my browser, I use Firefox with a user.js file (based on Betterfox) to disable trackers and bloat. Brave is also usually what I would use if I am not using Firefox.
For browser extensions I use:
- uBlock Origin to block ads and trackers
- Duckduckgo Privacy Essentials - Actively protects your data
- I Still don't Care About Cookies - Prevents cookie pop-ups
- Privacy Badger - Automatically blocks hidden trackers
- Decentraleyes - Local CDN access
- Vimium - Vim-like keybindings
- Bitwarden - Password management
Text Editor
I use neovim for text editing as it in my opinion although difficult at first is absolutely worth it.
Document Processing
I use primarily LaTeX which the first document I had ever finished writing was my resume back in 2019.
Services
For email, I use ProtonMail. Yes I know this isn't like being as based as hosting your own email client like Mutt Wizard.
Password Manager
Bitwarden is the best password manager. It does everything you could need a password manager to do, and the premium subscription if you want a few more features is dirt-cheap.
Hosting
This site is currently hosted by Vercel. Previously, I used Vultr with a cheap Debian VPS to host all my projects. Having your own VPS gives you a lot more freedom in hosting your own website instead of using services like Vercel, Netlify, Heroku, AWS.
Domain Registrar
I use Epik to purchase my domains which isn't anything special or particular, this just happens to be what I use.
Applications
For note-taking, I used to use Notion. Now, I am debating switching to Obsidian as it is an offline alternative but I am not sure yet since I find the best note-taking to still be on pen and paper even though I am much faster at typing than I am writing.
For email application, I use Thunderbird. I have my annoyances with it, but it's the best email client there is on Linux.
For RSS feed using a newsboat.
Theme
Color Scheme & Fonts
OneDark everywhere — Atom One Dark in Ghostty, the matching Neovim theme, the same palette in SketchyBar. One theme across every tool matters more than which theme it is; the point is that nothing jars when you move between windows.
Terminal font is JetBrainsMono Nerd Font, patched for icons.
Self-Hosted
One Raspberry Pi, thirty-seven services
Most of what would otherwise be a dozen subscriptions runs on a single Raspberry Pi 5 in my apartment, as Docker Compose stacks behind Nginx Proxy Manager with wildcard TLS. The setup is public at pi-lab.
- DNS — Pi-hole for blocking, resolving through a local Unbound and DNSCrypt rather than a public upstream, so ad-blocking does not just relocate who is watching
- Access — WireGuard for the VPN, Authelia for single sign-on, CrowdSec underneath on the assumption anything reachable gets probed
- Media — Jellyfin with the *arr stack and Calibre-Web
- Documents — Paperless-ngx with OCR, Nextcloud for sync, Syncthing between machines
- Passwords — Vaultwarden, which is why the Bitwarden clients above talk to my hardware and not somebody else's
- The rest — SearXNG, FreshRSS, n8n, Actual Budget, Mealie, Prometheus
Why bother
Every service here is one that either disappeared, got worse, or started charging monthly for something it used to do. Self-hosting is less about the money than about the fact that a thing you run cannot be discontinued from a boardroom.
RAG Stack
Vector Search
Embeddings are stored in Postgres (Neon) with pgvector, queried via a server-side similarity function (match_embeddings) for fast retrieval.
Embeddings
I support two providers: OpenAI (text-embedding-3-small, 768 dims) when OPENAI_API_KEY is set, or Ollama (nomic-embed-text) locally for free, private iteration.
Chat
The site chat endpoint uses OpenAI when configured (primary OPENAI_CHAT_MODEL, then smaller fallbackOPENAI_FALLBACK_CHAT_MODEL), then OpenRouter when configured, then falls back to Ollama locally. It degrades gracefully if neither provider is available.
Ingestion
I keep content ingestion repeatable with scripts like bun run generate-embeddings and bun run generate-tts. That keeps the AI features grounded on real blog content instead of vibes.
This Website
This site is built with Next.js, a React framework that outputs HTML and CSS. The only Javascript in this entire page is for interactive components and navigation. Previously, I used Hugo, a static site generator.
The design philosophy is minimal and focused on content, with an emphasis on performance and accessibility. All images are optimized to WebP format, and the site follows modern web standards for SEO and metadata.