–––

–––– ––––––– –––––––– @maia_analytics

––––– ––––––– –– – –––––––––– –––––– – –––––– –– ––––––––– –––– ––––––

// The supreme learning is to realize the meaning of selflessness.
// — Atisha
currently building
systems
-- services
-- crons
--% cpu
--% mem
Founder

AI geospatial platform

Building the interface between natural language and mapping data. Ask questions, get maps — site selection, solar analysis, location intelligence.

React FastAPI Python Postgres DuckDB Pydantic AI GCP
PROJECT NETWORK 9/13 NOMINAL SYNC —
CPU
--
MEM
--
SVC
--
CRON
--
PPD --
PUSHES / 7D
primary workspace
showcase piece
co-hosted on optiplex
interactive keymap
keyboard config
claude code plugin
cron on optiplex
hand-soldered
hand-soldered
ESP32 + FastLED
hotkey macros
background automation
telegram bots
telegram bots
cron on optiplex
co-hosted on optiplex
monitored services
monitors crons
claude code skill
claude tools
spotify api
ONLINE
MAIA
AI geospatial platform 0.0/s
startup

Full-stack AI-native geospatial platform. Ask questions, get maps. LLM orchestration, agentic workflows, property data pipelines.

TypeScriptPythonFastAPIPostgresGCP
maia-analytics.com ↗
click to explore
ONLINE
c2k.page
This website 0.0/s
web

Personal site as system monitor. Self-hosted Astro SSR on an OptiPlex micro, exposed via Cloudflare Tunnel. Hand-crafted interactive showcases.

AstroTypeScriptCanvasCloudflare
c2k.page ↗
click to explore
STANDBY
Flux Gauntlet
LED wearable 0.0/s
hardware

300-LED arm gauntlet with 16 rings on a 3D cylindrical mesh. 7 procedural effects: blast, lightning, fire, firework, casimir, twinkle, pew.

C++FastLEDESP32
click to explore
ONLINE
Corne
42-key split keyboard 0.0/s
hardware

Custom split ergonomic keyboard. 7 layers with combos, home row mods, and vim-style navigation. Fully programmable firmware.

QMKCKiCad
click to explore
ONLINE
Spotify Macro
Stream Deck automations 0.0/s
automation

Five Spotify automations for Stream Deck. Playlist sorting, genre classification, heart sync, hotkey control, queue management.

PythonSpotify APIStream Deck SDK
github/spotify-macro ↗
click to explore
ONLINE
Optiplex Dashboard
Server monitoring PWA 0.0/s
infra

Mobile-first dashboard for the Optiplex. CPU, memory, disk, network sparklines, cron job status, Claude sessions — all polled live. Installable PWA over Tailscale.

Next.jsTypeScriptshadcn/uiSQLitesysteminformation
ONLINE
Dotfiles
Dev environment system 0.0/s
tooling

Version-controlled dev environment. Shell, editor, keybindings, Claude Code skills and hooks — all symlinked and synced across machines.

BashZshClaude CodeTmuxGhostty
github/dotfiles ↗
click to explore
DEPLOYING
Secret Gate
Human-in-the-loop gate 0.0/s
security WIP

Routes AI agent requests for secrets (1Password) and sudo commands through Telegram for explicit approval. Claude Code plugin with PreToolUse hooks.

Python1Password CLITelegramClaude Code
github/secret-gate ↗
ONLINE
Tech Digest
Daily release digest 0.0/s
automation

Fetches release notes from GitHub repos and web changelogs, parses with Claude CLI, sends formatted summaries via Telegram. Includes a bot for remote repo control.

PythonClaude CLITelegramGitHub APIcron
github/tech-digest ↗
STANDBY
Lightning Cloud
Procedural lightning 0.0/s
hardware

LED cloud lamp with procedural lightning bolt generation. Branching algorithms, flashing, fading — all code-driven on an ESP32.

C++FastLEDESP32
click to explore
ONLINE
Propeller Scrape
Concert ticket monitor 0.0/s
utility

Scrapes Propeller rewards for new concert tickets in LA, SF, and Boulder. Sends Telegram notifications. Runs on cron.

PythonBeautifulSoupTelegramcron
github/propeller-scrape ↗
ONLINE
Pane Skill
Claude tmux side pane 0.0/s
claude tools

Claude Code skill that displays files, diffs, and command output in a managed tmux side pane. Auto-routes content through Helix, delta, or less.

BashtmuxClaude CodeHelix
github/claude-pane-skill ↗
STANDBY
Playlist AI
ML playlist sorter 0.0/s
ml

Classifies liked Spotify songs into existing playlists using audio features. Compares Random Forest, Gradient Boosting, SVMs, and neural networks.

Pythonscikit-learnJupyterSpotify API
github/spotify-playlist-ai ↗
NETWORK OPTIMIZER
0.0 TP
0.0 /s
PROJECT NETWORK 8/11 NOMINAL
MAIA ONLINE
AI geospatial platform
startup

Full-stack AI-native geospatial platform. Ask questions, get maps. LLM orchestration, agentic workflows, property data pipelines.

TypeScriptPythonFastAPIPostgresGCP
Dotfiles primary workspace c2k.page showcase piece
maia-analytics.com ↗
tap to explore
showcase piece
c2k.page ONLINE
This website
web

Personal site as system monitor. Self-hosted Astro SSR on an OptiPlex micro, exposed via Cloudflare Tunnel. Hand-crafted interactive showcases.

AstroTypeScriptCanvasCloudflare
MAIA showcase piece Dotfiles co-hosted on optiplex Corne interactive keymap Optiplex Dashboard co-hosted on optiplex
c2k.page ↗
tap to explore
Flux Gauntlet STANDBY
LED wearable
hardware

300-LED arm gauntlet with 16 rings on a 3D cylindrical mesh. 7 procedural effects: blast, lightning, fire, firework, casimir, twinkle, pew.

C++FastLEDESP32
Corne hand-soldered Lightning Cloud ESP32 + FastLED
tap to explore
interactive keymap hand-soldered
Corne ONLINE
42-key split keyboard
hardware

Custom split ergonomic keyboard. 7 layers with combos, home row mods, and vim-style navigation. Fully programmable firmware.

QMKCKiCad
c2k.page interactive keymap Dotfiles keyboard config Flux Gauntlet hand-soldered Lightning Cloud hand-soldered Spotify Macro hotkey macros
tap to explore
hotkey macros
Spotify Macro ONLINE
Stream Deck automations
automation

Five Spotify automations for Stream Deck. Playlist sorting, genre classification, heart sync, hotkey control, queue management.

PythonSpotify APIStream Deck SDK
Corne hotkey macros Propeller Scrape background automation
github/spotify-macro ↗
tap to explore
co-hosted on optiplex
Optiplex Dashboard ONLINE
Server monitoring PWA
infra

Mobile-first dashboard for the Optiplex. CPU, memory, disk, network sparklines, cron job status, Claude sessions — all polled live. Installable PWA over Tailscale.

Next.jsTypeScriptshadcn/uiSQLitesysteminformation
c2k.page co-hosted on optiplex Dotfiles monitored services Tech Digest monitors crons
primary workspace co-hosted on optiplex keyboard config monitored services
Dotfiles ONLINE
Dev environment system
tooling

Version-controlled dev environment. Shell, editor, keybindings, Claude Code skills and hooks — all symlinked and synced across machines.

BashZshClaude CodeTmuxGhostty
MAIA primary workspace c2k.page co-hosted on optiplex Corne keyboard config Secret Gate claude code plugin Propeller Scrape cron on optiplex Tech Digest cron on optiplex Optiplex Dashboard monitored services
github/dotfiles ↗
tap to explore
claude code plugin
Secret Gate DEPLOYING
Human-in-the-loop gate
security WIP

Routes AI agent requests for secrets (1Password) and sudo commands through Telegram for explicit approval. Claude Code plugin with PreToolUse hooks.

Python1Password CLITelegramClaude Code
Dotfiles claude code plugin Propeller Scrape telegram bots Tech Digest telegram bots
github/secret-gate ↗
telegram bots cron on optiplex monitors crons
Tech Digest ONLINE
Daily release digest
automation

Fetches release notes from GitHub repos and web changelogs, parses with Claude CLI, sends formatted summaries via Telegram. Includes a bot for remote repo control.

PythonClaude CLITelegramGitHub APIcron
Secret Gate telegram bots Dotfiles cron on optiplex Optiplex Dashboard monitors crons
github/tech-digest ↗
hand-soldered ESP32 + FastLED
Lightning Cloud STANDBY
Procedural lightning
hardware

LED cloud lamp with procedural lightning bolt generation. Branching algorithms, flashing, fading — all code-driven on an ESP32.

C++FastLEDESP32
Corne hand-soldered Flux Gauntlet ESP32 + FastLED
tap to explore
cron on optiplex background automation telegram bots
Propeller Scrape ONLINE
Concert ticket monitor
utility

Scrapes Propeller rewards for new concert tickets in LA, SF, and Boulder. Sends Telegram notifications. Runs on cron.

PythonBeautifulSoupTelegramcron
Dotfiles cron on optiplex Spotify Macro background automation Secret Gate telegram bots
github/propeller-scrape ↗
Founder

AI geospatial platform

Building the interface between natural language and mapping data. Ask questions, get maps — site selection, solar analysis, location intelligence.

React FastAPI Python Postgres DuckDB Pydantic AI GCP
C2K.page this site

System monitor for my life

Public observability layer for a developer's entire digital system. Self-hosted Astro SSR on an OptiPlex micro, exposed via Cloudflare Tunnel. Every page is hand-crafted — no templates, no generic cards.

Home

Landing beacon. Text-scramble hero intro, gradient identity mark, status pulse showing the system is alive.

Projects

Spatial network dashboard. Each project is a live node with 3 expansion states — metro-map routing lines show how everything connects.

Log

Dev activity feed. Git commits, session notes, and build events streamed from the system — what's happening and when.

About

The operator behind the system. Background, stack, philosophy — why everything is built from scratch on a mini PC in the closet.

Lab

Experimental features. Interactive showcases, animation prototypes, statusline configurator — the testing ground before things go live.

Text scramble/decode animations — characters resolve through random glyphs
Glassmorphic design — frosted glass cards, radial vignette, SVG glow filters
Statusline showcase — interactive Claude Code statusline configurator
Feature Lab — experimental components with expand/scramble/stagger animations
Mobile swipe nav — pill-shaped bottom bar with animated icon states
3-environment deploy — production, staging, feature branches on separate ports
Conductor CORE STACK

Orchestrates agent-deck sessions that build and deploy this site. Every feature starts as a conductor task.

Agent Deck AUTOMATION

Claude Code sessions run in managed terminals — each feature branch gets its own isolated agent workspace.

Beads AUTOMATION

Git-backed issue tracker. Tasks, bugs, and features for this site are tracked as beads with dependency chains.

OptiPlex Dashboard HARDWARE

The host machine. CPU, memory, service health — c2k.page will pull live telemetry from the OptiPlex status API.

Feature Lab CORE STACK

Experimental page where new components are prototyped before promoting to production pages.

Dotfiles CONFIG

Claude settings, skills, hooks, and shell config — symlinked from dotfiles repo, synced across machines.

C2K CTO, context engineer
currently building ...
optiplex · 8 services · cpu 12%
Astro TypeScript Bun Cloudflare Tailscale Canvas
Flux Gauntlet wearable

Wearable LED instrument

Custom gauntlet with 300 WS2812 LEDs, 5 per-finger buttons, rotary encoder, and OLED display. 15+ effects — blasts, fire rings, lightning, collisions — all switchable in real time.

Flux Gauntlet in action
300 LEDs
5 buttons
15+ effects
ESP32 brain
C++ PlatformIO FastLED ESP32 U8g2 WS2812
C2K-Corne keyboard

42-key split keyboard

Custom Corne build running ZMK with urob's config. 7 layers, homerow mods, smart-shift, combos, mod-morphs, tri-state swappers, and app shortcuts — all on 42 keys.

C2K-Corne keyboard
homerow mods smart-shift combos mod-morphs tri-state swappers 7 layers tented
ZMK C Devicetree Bluetooth
spotify-macro automation

Spotify library automation suite

Collection of Python automations that manage my Spotify library — routing songs between playlists, classifying genres, syncing liked songs, and keeping everything organized via cron.

Python Spotipy cron macOS LaunchAgents
optiplex-dashboard
infra

Server monitoring PWA

Mobile-first dashboard for the Optiplex. CPU, memory, disk, network sparklines, cron job status, Claude sessions — all polled live. Installable PWA over Tailscale.

Next.jsTypeScriptshadcn/uiSQLitesysteminformation
dotfiles config

Developer environment as code

Shell, editor, Claude Code setup, and custom tools — version-controlled and synced across machines via symlinks. One repo powers everything.

claude-statusline
main ±3 ~/repos/c2k.dev
0% ↯12 ⛁43 Opus 4.6 (1M) :5173

What is this?

A 221-line bash script that replaces Claude Code's default statusline. It runs on every prompt, parsing JSON input from Claude Code and rendering a two-line display with ANSI colors.

Line 1 — Git + Location

Branch Current branch, truncated at 30 chars. Shows HEAD during detached state.
State icons ↻ rebase · ⑂ merge · ⊕ cherry-pick · ↩ revert · ◇ bisect
±N Total of staged + unstaged + untracked files.
Path Shortened CWD. Detects git worktrees and shows worktree name.

Line 2 — Context + System + Model

Context % Color-coded: green (0-60%), yellow (60-100%), red (100%+). For 1M models, scales so the 500K personal limit reads as 100%.
↯ ⛁ CPU load and memory usage. Cached for 1 second to avoid expensive recalculation.
Model Shows "Opus 4.6 (1M)" for 1M context models. For other non-default models, shows the display name. Hidden when using the default model.
:PORT MAIA client dev port. Only appears in MAIA worktrees. White when the docker backend is running, grey when it's down.

Why native bash?

Replaced the third-party ccstatusline tool to eliminate rendering artifacts and stdin handling issues. A single bash script with jq parsing, no dependencies, no wrapper hacks. Works on both macOS and Linux.

Claude Code Skills dotfiles/claude/skills ↗
claude code
/issue-to-pr issue → code → PR → merged workflow
/sync pull repos, fix symlinks, rebuild config devops
/pane rich tmux pane — files, diffs, logs terminal
/dispatch send tasks to parallel worker sessions workflow
/make-tests FastAPI test patterns + fixture guide testing
/mods-command pipe docs into LLM CLI with custom roles tools
/resolve-pr-threads resolve GitHub review threads via GraphQL git
/bug-root-cause investigate via Linear, Logfire, Slack traces debugging
/raycast-chrome-tab AppleScript tab switcher for Raycast tools
Bash Zsh Claude Code Tmux Git
secret-gate
WIP security

Human-in-the-loop approval gate

Routes AI agent requests for secrets (1Password) and sudo commands through Telegram for explicit approval. Ships as a Claude Code plugin with PreToolUse hooks.

Python1Password CLITelegramClaude Code Plugin
tech-digest
daily driver

Daily tech release digest via Telegram

Fetches release notes from GitHub repos and web changelogs (Claude Code, Cursor, Linear, etc.), parses them with Claude CLI, and sends formatted summaries via Telegram. Includes a Telegram bot for remote repo control through a headless Claude Code session.

PythonClaude CLITelegramGitHub APIcron
morning-digest
daily driver

LLM-powered personal news briefing

Fetches RSS from 9 sources across world news, SF local, and tech. Claude Haiku generates two-tier summaries — quick scans on fetch, deep dives on tap. Self-hosted Next.js PWA served over Tailscale.

Next.jsTypeScriptClaude HaikuSQLiteTailwindRSS
LightningCloud hardware

LED lightning cloud

Arduino-powered storm cloud with 4 WS2812 LED strips. Branching bolts with fork propagation, strobe flash, and smooth fade — all driven by a custom Lightning class on an ESP32.

Lightning cloud in action
C++ Arduino FastLED ESP32 WS2812
propeller-scrape
utility

Concert ticket monitor

Scrapes Propeller rewards for new concert tickets in LA, SF, and Boulder. Sends Telegram notifications when shows appear. Runs on cron.

PythonBeautifulSoupTelegramcron

–––––––––––––

6 SIGNALS RECEIVED
AI/ML INFRA HARDWARE PRODUCT PHILOSOPHY
AI/ML 2026-03-28

Context Engineering is the New Programming

I used to spend most of my time writing code. Now I spend most of it deciding what the model should know before it writes a single line.

INFRA 2026-03-21

The Self-Hosted Stack

A Dell OptiPlex micro, zero open ports, and the feeling of knowing exactly which process handles every request.

HARDWARE 2026-03-14

Why I Type on 42 Keys

Three weeks of genuine suffering, then something clicked. Constraints are a design principle.

AI/ML 2026-03-07

The Awkward Middle of Working with AI

Five sessions running, context-switching every two minutes. Things get done but the felt sense is fragmented.

PRODUCT 2026-02-28

Ask a Question, Get a Map

The hard part of building MAIA isn't the AI. It's the data underneath.

PHILOSOPHY 2026-02-21

Don't Build Before You Need It

There are always a bunch of good sounding ideas. The hard part is killing them.

I used to spend most of my time writing code. Now I spend most of it deciding what the model should know before it writes a single line. The shift happened gradually and then all at once — one day I realized the thing I was actually getting good at wasn't TypeScript or Python, it was assembling the right information at the right time for a model to do its job.

I've been calling this context engineering, and I think it's genuinely a new skill. Not prompt engineering — that's writing a clever sentence. This is more like building the information architecture around every model call. Which files go in the context? What documentation matters right now? How do you structure the system prompt so the model has the right mental model of your codebase? What tools does it need access to, and what memory should it surface from past sessions?

At MAIA this is everything. Our natural-language-to-map pipeline lives or dies by the context we assemble before the model even starts reasoning. The model doesn't need to know everything about geospatial analysis. It needs to know exactly the right things for this specific query. A well-scoped context turns a mediocre prompt into a perfect map. A sloppy one produces garbage regardless of how smart the model is.

Claude Code is where this really clicked for me. The CLAUDE.md file, hooks, MCP servers — it's all context engineering. You're not configuring a text editor. You're building a workspace that shapes how an intelligence interacts with your code. And the compounding effect is real. Better context produces better output, which teaches you what context matters, which produces even better output next time. The feedback loop is tighter than anything I've experienced in traditional programming.

I think in a few years we'll look back and realize the people who got really good at this early had a massive advantage. Not because they were better programmers, but because they understood that the new bottleneck isn't writing code — it's shaping what the model knows.

Everything I run sits on a Dell OptiPlex micro in my apartment in the Outer Sunset. Ubuntu, 32 gigs of RAM, a 1TB NVMe. It draws maybe 15 watts at idle. My cloud bill is zero.

I know the obvious question is why not just use Vercel or Railway or whatever. And the honest answer is that I want to understand every layer. When something breaks I want to know exactly where to look. Not in some abstract "it's good to understand things" way — I mean I've been burned enough times by managed services hiding complexity that I'd rather just own it. Running your own infrastructure teaches you things that platforms deliberately abstract away, and those things matter when you're debugging at 2am.

The stack is simple. Cloudflare Tunnel exposes public stuff — this site, MAIA staging. Tailscale handles everything private — dashboards, dev tools, SSH from my phone. systemd manages all the services. No Docker, no Kubernetes, no orchestration layer pretending to be simple. Just unit files and timers.

The real unlock was Tailscale and Cloudflare Tunnel together. Tailscale gives me a private mesh network across every device I own. Cloudflare Tunnel gives me public ingress without opening a single port. Between the two I have zero exposed ports on the machine but can reach anything from anywhere. My morning news digest, tech release monitor, concert ticket scraper, this website — all running on the same box, all accessible exactly where they need to be and nowhere else.

There's a specific feeling I'm chasing here. Typing a URL and knowing exactly which process on which machine on which port will handle that request, because I set all of it up myself. That's the feeling.

I type on a Corne. 42 keys, split in half, no number row. When people see it they usually ask if it's a joke. It's not a joke but I understand the reaction.

It took three weeks of genuine suffering to learn. My typing speed dropped from around 100 WPM to maybe 30. I couldn't type a URL without stopping to think about where the colon was. Every missing key lives on a layer — you hold a thumb key and the whole board transforms. Numbers on one layer, symbols on another, navigation on a third. It sounds insane and it felt insane for those first three weeks.

But by week four something clicked. The split layout means my shoulders stay open instead of hunching inward. The columnar stagger means my fingers move straight up and down, not diagonally like on a normal staggered board. And the thumb clusters — I use my thumbs for space, enter, backspace, and layer switches now, instead of destroying my pinkies on modifiers. After a month I tried going back to a regular keyboard and my wrists immediately started hurting. That was the end of that debate.

The real revelation was the layers though. On a normal keyboard your hands are constantly leaving home row — reaching for backspace, stretching for brackets, moving to arrow keys. On the Corne everything is within one key of where your fingers already are. I have numbers, symbols, navigation, media controls, all accessible without moving my hands. The firmware is QMK and I've iterated on the layout for months. Every key does exactly what I want because I defined every single mapping.

I soldered this one myself. Mill-Max hot-swap sockets, Gateron silent switches, custom caps. I solder things that don't need to exist — LED gauntlets, lightning clouds, keyboards. 42 keys sounds like a constraint. It's actually a design principle: every key should earn its place.

We're past the point of needing to directly watch a single thread of LLM work. That level of babysitting isn't necessary anymore. But I've been noticing something about where we've landed instead.

Right now I'm comfortable letting a model run for about ten minutes — that's roughly the amount of work I can review thoroughly and catch mistakes in. To stay efficient I'll have three to five active sessions going, plus another five to ten waiting for responses or in various stages of progress. Which means I'm context-switching every one to three minutes.

The thing is, human brains don't really multitask. We just context-switch and process things incrementally. And when the time between switches is this short, the overhead of loading working memory for each task starts to feel significant relative to the actual focused work being done. It's this weird middle state of feeling inefficient even though things are technically getting done.

I've noticed it bleeding into other parts of my life too — personal tasks get interleaved with agent work, things partially complete before something else needs attention. The first-person experience is honestly a bit dissociative. Scattered. Lack of continuity. Multiple workstreams are moving forward but the felt sense is fragmented.

I think this gets better over time. As models can do more work per stretch, the context-switching frequency goes down, and the ratio of overhead to actual work improves. But right now we're in the awkward middle. One thing that helps: keeping each piece of review atomic — treating it as a complete unit rather than something I'll come back to.

The pitch for MAIA is simple: ask a question, get a map. "Show me all parcels in downtown SF that sold for over 2M in the last year and are zoned for mixed-use development." You type that in natural language, and MAIA produces a map with the parcels highlighted, the data attached, ready to explore. No GIS expertise, no SQL, no manual layer stacking.

That's the pitch. The reality of building it is a different story. The hard part is not the AI — the LLM orchestration and the agentic pipeline, while nontrivial, are at least tractable engineering problems. The hard part is the data underneath. Geospatial data is messy and inconsistent and siloed across dozens of county, state, and federal databases. Parcel boundaries don't match across jurisdictions. Zoning codes mean different things in different cities. Property records use different schemas everywhere. It's a nightmare.

Our actual job most days is normalizing all of that into a unified layer that the AI can query intelligently. The LLM is the interface. The data pipeline is the product. And every new city we add is its own special flavor of data chaos that has to be wrangled into the same schema as everything else.

I love this kind of problem though. One of the things that drew me to startups is you get to do a little of everything — I'm doing LLM orchestration and database optimization and infrastructure and product thinking all in the same week. You have to move fast and resist the urge to optimize. The discipline is always asking: is this moving the business forward? Not is this the most elegant solution, not is this the most interesting technical problem, but is this the thing a customer needs right now.

We're building for analysts who know what questions to ask but don't want to learn PostGIS. The bet is that natural language is a better interface for geospatial analysis than any tool that exists today. I think we're right.

There are always a bunch of good-sounding ideas. The hard part is killing them. I learned this at MAIA and it took a while — the urge to build something elegant instead of something useful is strong, especially when you're technical enough to see all the possibilities.

The rule I keep coming back to: don't build before you need it. Don't add a cache until you've measured latency. Don't add a message queue until you actually need async processing. Don't add a service layer until the monolith is genuinely struggling. Every abstraction is a bet that the pattern will repeat, and most of those bets lose.

This is hard because building things feels like progress. Refactoring feels productive. Setting up elaborate infrastructure for a feature that doesn't exist yet feels responsible. But it's not — it's avoidance. The actual work is figuring out what the customer needs and pushing that through, ugly or not. A lot of resisting the urge to optimize. You have to move quickly and leave things ugly sometimes, and that's genuinely uncomfortable.

You gotta beat the shit out of your ideas. The ones that survive are worth building. The rest were just interesting — and interesting is not the same as valuable. Constantly prioritizing is the hard part. Not the coding, not the architecture, not the tooling. The prioritizing.

Write the obvious thing. Ship it. If it needs to change, change it then. The codebase that's easy to change beats the codebase that anticipated every change but is impossible to understand.

–––––––––––––

6 signals
AI/ML 2026-03-28 · 4 min

Context Engineering is the New Programming

I used to spend most of my time writing code. Now I spend most of it deciding what the model should know.

DECODED
INFRA 2026-03-21 · 4 min

The Self-Hosted Stack

A Dell OptiPlex micro, zero open ports, and knowing exactly which process handles every request.

DECODED
HARDWARE 2026-03-14 · 4 min

Why I Type on 42 Keys

Three weeks of genuine suffering, then something clicked. Constraints are a design principle.

DECODED
AI/ML 2026-03-07 · 4 min

The Awkward Middle of Working with AI

Five sessions running, context-switching every two minutes. The felt sense is fragmented.

DECODED
PRODUCT 2026-02-28 · 4 min

Ask a Question, Get a Map

The hard part of building MAIA isn't the AI. It's the data underneath.

DECODED
PHILOSOPHY 2026-02-21 · 3 min

Don't Build Before You Need It

There are always a bunch of good sounding ideas. The hard part is killing them.

DECODED
name Christopher Keesey
handle C2K
role CTO · context engineer
company MAIA Analytics
location Outer Sunset, SF
editor Claude Code
terminal Ghostty + Tmux
keyboard Corne 42-key split
host OptiPlex micro · Ubuntu
network Tailscale + Cloudflare Tunnel
whip Maroon Honda Odyssey
languages Natural Language · TypeScript · Python · Go
frontend React · Astro · Tailwind
backend FastAPI · Node · Postgres
infra GCP · Docker · systemd · Cloudflare
ai Claude Code · MCP · Pydantic AI

I'm Christopher Keesey — C2K. I'm building MAIA Analytics, an AI-native geospatial platform where you ask questions and get maps. Day to day that means LLM orchestration, agentic workflows, and a lot of property data pipelines — TypeScript, Python, FastAPI, Postgres, Claude Code. I care about simple code, minimal abstraction, and shipping.

When I'm not building, I'm surfing the Outer Sunset, skiing backcountry, or mixing dubstep and drum & bass. I solder things that don't need to exist — LED gauntlets, lightning clouds, split keyboards. Everything I use is version-controlled, self-hosted where it matters, and accessible from anywhere. This site is the public layer of that system.

Feature Lab

INITIALIZING

History