# codebam > codebam — open source in Rust, TypeScript and NixOS. A Wayland compositor, Cloudflare Workers, and writing about Linux. https://seanbehan.ca is the writing and the commercial home of Sean Behan — posts, pages, the résumé, and everything priced or legal (services, products, checkout and the policies that govern them). https://codebam.ca is the handle's portfolio — the open-source project case studies. One repository, one database, two front doors: each origin answers requests for the other's sections with a 301 to the canonical URL, so follow redirects rather than guessing which door serves what. How to fetch this site: - Entries that live in the database answer in three forms of one stored source: the HTML page, a markdown document, and JSON. That is every post (`/posts/`). Append `.md` or `.json` to the entry's URL, or request it with `Accept: text/markdown` or `Accept: application/json`. HTML stays the answer for browsers, for `*/*`, and for any client that does not name a format — there is no user-agent sniffing to trip over. - Everything else is HTML only, and appending a suffix is a 404 rather than a variant. The section pages — the home page, `/about`, `/contact` and `/links`, plus `/services`, `/products` and the legal pages on the writing origin and `/projects` on the handle origin — are hand-written templates with no stored entry behind them; the archive `/posts` and the tag index `/posts/tags` are navigation over the entries. A post's markdown and JSON hang off the post's own URL, never the archive's. The résumé is the one section page that also answers as a document (below). - The markdown forms open with a metadata header (canonical URL, author, published and updated dates, tags, reading time) and carry the body with fenced code and absolute image URLs. The JSON forms hold the same facts as fields, the markdown body in `content`, and the page's heading anchors in `sections`. - Content pages advertise their alternates with `` and this file with ``. - The RSS feed carries the full text of recent posts in `content:encoded`, which answers questions about the corpus in one request rather than ten. - Unpublished drafts appear in no list, feed or file here; a draft's URL still renders if you already hold it, marked noindex. ## Asking with MCP A read-only MCP server answers from the same published content, at https://seanbehan.ca/mcp — Streamable HTTP, POST, no authentication and no session. Its tools are `search_content`, `get_entry`, `list_posts`, `get_resume`, `get_facts` and `ask`; the first five retrieve, and `ask` returns a grounded answer with the source URLs it used. Prefer the retrieval tools when a quote or a URL has to be exact. This is a complete request; a tools/call is answered without a prior initialize: ```bash curl -s https://seanbehan.ca/mcp -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ask","arguments":{"question":"What has Sean written about NixOS?"}}}' ``` ## Writing - [All posts](https://seanbehan.ca/posts): the archive, newest first, with the title search over it. - [Post feed](https://seanbehan.ca/rss.xml): recent posts with full text, HTML. - [Tags](https://seanbehan.ca/posts/tags): the topic index with counts; each tag has its own feed under https://seanbehan.ca/posts/tag/. - [Search](https://seanbehan.ca/search.json): ranked slugs for a query in `?q=`; words are matched over titles, descriptions, tags and bodies. - [Résumé](https://seanbehan.ca/resume.md): the CV in its source markdown — the same file the HTML page, the PDF and the plain text are generated from. The PDF is https://seanbehan.ca/resume.pdf; the plain text is https://seanbehan.ca/resume.txt. ## Work - [Projects](https://codebam.ca/projects): case studies of the software that runs, with what each one had to survive. - [Products](https://seanbehan.ca/products): paid work, with prices. - [Services](https://seanbehan.ca/services): what kind of engagements are taken on. - [Legal](https://seanbehan.ca/legal): the terms, refund, license and privacy policies in one index. - [Contact](https://codebam.ca/contact): the forms and the address. ## Recent writing - [How I survived a DDoS Flood](https://seanbehan.ca/posts/how-i-survived-a-ddos-flood.md): 2026-08-28. Tagged Cloudflare, EmDash, Networking. - [EmDash and Cloudflare Workers](https://seanbehan.ca/posts/emdash-and-cloudflare-workers.md): 2026-08-24. Tagged Cloudflare, EmDash. - [USB Cable Testing on Linux](https://seanbehan.ca/posts/usb-cable-testing.md): 2026-04-15. Tagged Linux, test, USB, Wireshark. - [Secure Boot NixOS UKI Installer](https://seanbehan.ca/posts/nixos-uki.md): 2025-07-06. Tagged NixOS, Secure Boot, Steam Deck. - [Podman Quadlets](https://seanbehan.ca/posts/quadlets.md): 2025-03-28. Tagged containers, Linux, Podman, Quadlet, systemd. - [Email bot](https://seanbehan.ca/posts/email-bot.md): 2024-12-04. Tagged Cloudflare, serverless, TypeScript. - [NixOS Flakes](https://seanbehan.ca/posts/nixos.md): 2024-06-01. Tagged NixOS. - [Cloudflare Workers Telegram Bot](https://seanbehan.ca/posts/cf-workers-telegram-bot.md): 2024-05-15. Tagged Cloudflare, TypeScript. - [Search bar in Sveltekit](https://seanbehan.ca/posts/svelte-search.md): 2023-12-06. Tagged Cloudflare, JavaScript, serverless, Svelte, SvelteKit, TypeScript. - [Auth and Databases in Sveltekit](https://seanbehan.ca/posts/svelte-auth.md): 2023-11-12. Tagged Cloudflare, JavaScript, serverless, Svelte, SvelteKit, TypeScript. ## Optional - [Sitemap for this origin](https://codebam.ca/sitemap.xml): every indexable URL it serves. - [Sitemap for the other origin](https://seanbehan.ca/sitemap.xml): the same, across. - [robots.txt](https://codebam.ca/robots.txt): crawl rules — everything is open apart from the admin, and the few scrapers that take without giving back.