Introducing Gavos 1.0: A Command Line for gavinj.net Source
Markdown source
1---2title: "Introducing Gavos 1.0: A Command Line for gavinj.net"3date: "2026-05-24"4published: true5tags: ["gavos", "blog", "command-line", "javascript", "php", "codex", "search", "tools"]6author: "Gavin Jackson"7excerpt: "Gavos 1.0 adds a retro command line interface to gavinj.net, turning article search, navigation, source viewing, IPython, network tools, and a few useful Unix-style workflows into something playful and practical."8---910# Introducing Gavos 1.0: A Command Line for gavinj.net11121314I had a fairly simple idea: what if my blog had a useful command line?1516Not a fake terminal that only prints a joke and then runs out of ideas. Not a decorative "hacker" overlay that looks interesting for five seconds and then does nothing. I wanted something that actually helped me move around the site, search articles, inspect content, and run a few useful tools.1718That idea became **Gavos 1.0**.1920It is a retro-style console built into gavinj.net. **Press the backtick key**, and a black-and-green terminal drops down from the top of the page. From there, the site starts to feel a little less like a blog and a little more like a tiny Unix system made out of posts, pages, tags, and tools.2122That is extremely unnecessary.2324It is also exactly the kind of unnecessary that makes a personal website feel personal.2526## Why Add a Console to a Blog?2728The practical reason was search.2930The site already had normal navigation, tags, post pages, and a search interface. But I kept thinking about how much of my working life happens in terminals. If I want to find something, I reach for `grep`, `find`, `less`, `history`, tab completion, and muscle memory. Those tools are fast because they are composable.3132So the first version of the idea was modest:3334```sh35search ubuntu36```3738or maybe:3940```sh41find linux42```4344But once the console existed, it was hard not to keep going.4546If articles have paths, then `ls` should list them. If `ls` lists them, then `ls | grep ubuntu` should work. If an article has Markdown source, then `cat`, `less`, `head`, `tail`, and `wc` should work. If tags are part of the site, then they should behave like directories. If there is a command line, it should have history, tab completion, manual pages, and a prompt that shows where you are.4748That is how Gavos grew from "a quicker search box" into a small command environment.4950## Core Features in Gavos 1.05152The public feature set in Gavos 1.0 now includes:5354- **Console access**: open the console with the backtick key, close it with `exit`, Ctrl+D, or the close button, and clear the screen with `clear`.55- **Help and documentation**: use `help`, `?`, and `man` to discover commands and read short manual pages.56- **Virtual navigation**: move around the site with `pwd`, `cd`, `ls`, and `tree`.57- **Article and page discovery**: search paths, titles, tags, dates, articles, and standalone pages with `find`, `tags`, and `grep`.58- **Direct navigation**: use `open` to jump to articles, pages, or tag result views.59- **Source viewing**: use `cat`, `less`, `head`, `tail`, and `wc` against article and page source.60- **Pipelines**: combine commands with pipes, including `grep`, `head`, `tail`, `wc`, and `sort`.61- **Shell comfort**: use command history, `!!`, `!NUMBER`, Ctrl+R reverse history search, tab completion, clickable output, and a prompt that shows the current virtual directory.62- **IPython in the browser**: start a Pyodide-backed IPython session with `python` or `ipython`, then return to Gavos with `.exit`.63- **Network and web tools**: run browser-safe versions of `host`, `nslookup`, `ping`, `traceroute`, `whois`, `certcheck`, and `curl -I`.64- **Utility commands**: use `date` for AEST and other time zones, `diceware` for passphrase generation, and `top` for a terminal-style view of popular articles.65- **State persistence**: keep console output, history, and current virtual directory available across page loads in the same browser session.6667## The Tiny Filesystem6869Gavos treats the site like a tiny filesystem.7071The prompt shows a fake current directory:7273```sh74gavinj:/posts>75```7677From there, the familiar commands work:7879```sh80pwd81ls82cd /pages83cd /tags84tree /85```8687Articles live under `/posts`, standalone pages live under `/pages`, and tags live under `/tags`. The illusion is intentionally small, but it is surprisingly useful. A blog already has structure; the console just gives that structure a command-line shape.8889An `ls` of posts prints entries in a Unix-like long listing format, including permissions, owner, group, date, path, and title. The post paths are clickable, so the output is not only decorative. You can scan it like terminal output and still use it like a web page.9091Tags behave similarly. You can list them, search them, move into them, or open a tag result page directly:9293```sh94tags95tags linux96cd /tags/linux97open linux98```99100That last one opens the normal blog tag view, so the console does not replace the site. It gives the existing site another way to be used.101102## Search That Feels Like Search103104The console has a few different ways to find things.105106For quick filtering, there is `grep`:107108```sh109ls | grep ubuntu110```111112For more structured searching, there is `find`:113114```sh115find /posts -tag linux116find . -name ubuntu117find /pages -name resume118```119120The search is not trying to be a giant external search engine. It is more like a site-local discovery tool. It searches article paths, titles, tags, dates, standalone pages, and other metadata that already belongs to the blog.121122There is also tab completion for paths, so you do not need to remember full slugs. Start typing an article path, hit Tab, and the console helps finish it.123124## Reading Posts From the Console125126One of my favourite parts of Gavos is that posts can be treated like files.127128For example:129130```sh131cat ubuntu-to-red-hat-enterprise-linux-2026132less ubuntu-to-red-hat-enterprise-linux-2026133head -20 ubuntu-to-red-hat-enterprise-linux-2026134tail -20 ubuntu-to-red-hat-enterprise-linux-2026135wc ubuntu-to-red-hat-enterprise-linux-2026136```137138That works for standalone pages too:139140```sh141cat resume142open resume143```144145This is the kind of feature that would make no sense on most websites and complete sense on a Markdown-based technical blog. The article source is already there. Gavos just exposes it in a way that feels natural if you live in terminals.146147`less` behaves like a pager rather than just dumping text into the console. You can scroll up and down, use Page Up and Page Down, and press `q` to return to the prompt.148149Pipelines work as well:150151```sh152cat resume | head -20153cat ubuntu-to-red-hat-enterprise-linux-2026 | wc154ls | grep linux | sort155```156157It is not a full shell, but it borrows enough of the grammar to feel familiar.158159## Command-Line Polish160161The small details make the console feel much more real.162163Gavos includes:164165- command history166- `!!` and `!42` style history expansion167- Ctrl+R reverse history search168- tab completion for commands, paths, pages, tags, and article slugs169- persistent console state between page loads170- clickable paths in command output171- `man` pages for the published commands172- `help` and `?` for quick discovery173- Ctrl+D and `exit` to close the console174175None of those are individually huge, but together they change the feel of the feature. A command line without history or completion feels like a toy. A command line with just enough memory starts to feel like a place.176177## A Real IPython Interpreter178179The most ambitious feature is:180181```sh182python183```184185or:186187```sh188ipython189```190191That starts an in-browser IPython environment using Pyodide. It supports multi-line Python input, tab completion, auto-indentation, and `.exit` to return to the Gavos shell.192193This is wildly overpowered for a blog console, which is part of the appeal. Sometimes I want a scratch Python environment quickly. Now the site has one.194195It also fits the spirit of the project. Gavos is not only navigation. It is a small toolbox.196197## Useful Network and Web Tools198199Because this is a technical blog, it felt right to include a few tools I actually use.200201Gavos includes browser-safe versions of familiar network commands:202203```sh204host gavinj.net205nslookup gavinj.net206ping gavinj.net207traceroute gavinj.net208whois gavinj.net209certcheck gavinj.net210curl -I https://www.gavinj.net211```212213Some of these use small PHP endpoints on the server side where the browser cannot do the job directly. For example, `curl -I` needs a proxy because browsers do not expose raw response headers in the same way a terminal does, and certificate inspection needs server-side help to retrieve public TLS certificate details.214215The goal is not to replace a real terminal. The goal is to make the blog console useful enough that it earns its place.216217There are also a few general-purpose tools:218219```sh220date221date --help222diceware -n4 -d-223top224top -n 25225```226227`date` shows the current AEST time by default, with options for other time zones. `diceware` generates passphrases from the EFF Diceware word list using browser cryptographic randomness. `top` reads the site's access-log-derived popularity data and renders the most viewed articles in a terminal-style bar chart.228229Again, unnecessary.230231Again, useful.232233## How We Built It234235The best part of this project was the way it grew through collaboration.236237I did not sit down with a complete specification for Gavos 1.0. The first idea was closer to "can we add a search bar?" Then the search bar moved around the navigation, gained a keyboard shortcut, became a slide-out control, and eventually sparked the idea of a drop-down command console.238239From there, it became a steady back-and-forth:240241- add the console242- make the prompt feel right243- add real commands244- make search work from every page245- make pages searchable as well as posts246- add tab completion247- make `less` behave like `less`248- keep console state across page loads249- make article paths clickable250- add manual pages251- wire in IPython252- add network tools253- clean up behaviour when navigating away254- make tags, pages, and articles feel like one coherent content system255256That is where Codex was useful. Not because it magically knew what Gavos should be, but because it could keep up with the iteration.257258I could describe a behaviour in plain language:259260> When I run `ls`, make it look like a Unix file listing, but use my article titles and dates.261262or:263264> When I type `cat resume`, pages should work the same way articles do.265266or:267268> Ctrl+R should behave like a proper reverse history search.269270Then we could make the change, test it locally, notice the rough edges, and refine it. The workflow felt less like generating a finished product and more like pairing on a feature that kept revealing what it wanted to become.271272That style of development suits a personal site. There is room for taste. There is room for whimsy. There is room to say "this is objectively silly, but I like it" and then make it work properly anyway.273274## What Gavos Is Not275276Gavos is not trying to be a secure remote shell, a server admin console, or a replacement for a real terminal.277278It is a website interface.279280That matters. Some commands are simulated. Some are backed by carefully scoped endpoints. Some are browser-side conveniences. The Python interpreter runs in the browser, not on the server. The filesystem is virtual. The article source comes from the same Markdown content that powers the blog.281282That boundary keeps the feature fun without turning it into an operational liability.283284## Why I Like It285286Gavos makes the site feel more like mine.287288The normal web interface is still there. You can read posts, click tags, use navigation links, and never open the console. Nothing important depends on knowing commands.289290But if you are the sort of person who enjoys terminals, there is now another layer waiting underneath the page. It rewards curiosity. It makes the archive more playful. It turns the blog into something you can poke at.291292That is one of the things I still love about personal websites. They do not have to be optimised only for conversion, engagement, or a clean product funnel. They can contain small odd features that exist because the person who made the site thought they would be fun.293294Gavos 1.0 is one of those features.295296It started as an idea for faster search and turned into a tiny command line for the whole site.297298I am very glad it exists.299