shog
shog is a personal portfolio served as an SSH application.
Note: This project is mostly vibe-coded!
Instead of sending someone to a traditional website, shog opens a small terminal-native experience built with Wish and Bubble Tea.
The current version focuses on a simple, readable flow: an introduction page, project showcase pages, and a foundation that can later grow into blog and contact views.
Why
Personal sites tend to collapse into the same visual template. shog takes a different route: lightweight, interactive, and intentionally text-first.
The goal is not novelty for its own sake. It is to create a portfolio that:
- feels personal instead of generic
- works naturally in a terminal
- keeps the content front and center
- can expand into projects, writing, and contact information over time
Current Features
- SSH server powered by Wish
- Terminal UI built with Bubble Tea and Lip Gloss
- Three tabs: About, Projects, and Blog
- Project and blog index views with detail pages
- Keyboard controls for switching tabs, browsing indexes, reading detail pages, and opening help
- Minimal project structure that is easy to customize
Getting Started
Prerequisites
Run locally
./scripts/fetch-project-readmes.sh
go run .
By default, the SSH server listens on 0.0.0.0:23234.
In another terminal:
ssh localhost -p 23234
The app will generate a local SSH host key on first run. That key is ignored by git and should remain local to the machine running the server.
Configuration
shog currently supports two environment variables:
SHOG_HOST sets the listen host
SHOG_PORT sets the listen port
Example:
SHOG_HOST=127.0.0.1 SHOG_PORT=23234 go run .
Application content is file-backed:
content/app.toml controls the app title and blog placeholder
content/about.md provides the About tab body
content/projects.urls lists GitHub repositories to vendor into the Projects tab
content/blogs/ holds markdown blog posts, including Hugo-style content files with title, date, tags, and description front matter
Controls
left, h, tab: previous tab
right, l, shift+tab: next tab
1, 2, 3: jump directly to About, Projects, or Blog
j, k: move selection in index views or scroll in detail views
enter: open the selected project or blog post
esc, backspace: return from a detail view to its index
n, p: next and previous project or blog post inside a detail view
up, down: scroll in detail views
space, f: page down
b: page up
g: top
G: bottom
?: toggle the help screen
q or ctrl+c: quit
Project Structure
.
├── app/ Bubble Tea model and content loading
├── content/ Embedded app content and vendored project READMEs
├── main.go Wish server entrypoint
├── scripts/ Content fetch helpers
├── TODO.md Planned roadmap and next steps
└── makefile Basic build and formatting commands
Roadmap
Near-term priorities:
- replace placeholder content with real bio and project details
- improve styling for a wider range of terminal sizes
- add a contact-oriented page or footer
- document deployment for serving the app publicly over SSH
Planned future direction:
- blog index and post navigation
- richer project metadata and layout
- tests for navigation and rendering
- CI and release automation
Customization
Most of the behavior lives in app/model.go, while the content/ directory drives the visible content.
For a personal deployment, the usual next steps are:
- Replace
content/about.md with your actual introduction.
- Edit
content/app.toml to set the app title and blog placeholder text.
- Add repository URLs to
content/projects.urls, then run ./scripts/fetch-project-readmes.sh.
- Drop Hugo markdown posts into
content/blogs/.
- Adjust styling in
app/model.go to match your tone.
- Deploy the app on a host with port
22 or another SSH-accessible port.
License
This project is available under the terms of the MIT License.