No description
  • JavaScript 72.3%
  • SCSS 14.1%
  • HTML 11.1%
  • CSS 1.9%
  • PEG.js 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
cr0w ef3e3fb731
feat(licenses): add licenses page to site
Add a /license/ page explaining how the site's code, writing, and
documentation are licensed, with an attribution table for the vendored
libraries and fonts and a credit for Andy Bell's CSS reset. Link it from
the main navigation between Contact and the Projects folder.

Assisted-by: Crush:kimi-k3
2026-10-16 16:05:04 -06:00
content feat(licenses): add licenses page to site 2026-10-16 16:05:04 -06:00
docs docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
LICENSES docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
sass docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
src docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
static chore: remove kitchen-sink demo page and stale search index 2026-09-24 12:09:38 -06:00
templates feat(licenses): add licenses page to site 2026-10-16 16:05:04 -06:00
.gitignore docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
AGENTS.md docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
build.js docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
bun.lock deps: add terminal-prism and Prism language components 2026-01-05 17:36:32 -07:00
config.toml feat(licenses): add licenses page to site 2026-10-16 16:05:04 -06:00
mise.toml docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
package-lock.json content: rewriting all the project writeups 2026-02-05 09:30:00 -07:00
package.json fix(terminal): resolve scope issues and restore URL/history functionality 2026-01-14 14:48:11 -07:00
README.md docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
REUSE.toml docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
test-fs-structure.js docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00
vite.config.js docs(licensing): add REUSE license metadata 2026-10-16 16:04:54 -06:00

Terminal Portfolio Site

An interactive terminal-themed portfolio built with Zola, WebTUI, and jQuery Terminal. Features dual navigation (tree + shell), virtual filesystem, and progressive enhancement.

Live URL: http://n3st:1111/ (local: 100.99.93.69:1111)


Quick Start

# Install dependencies
bun install

# Development server (builds CSS + serves with Zola)
bun run dev

# Full production build
bun run build

Tech Stack

  • Zola - Static site generator
  • Tera - Template engine (Jinja2-like syntax)
  • Vite - Asset bundler for CSS/JS
  • Bun - Package manager and runtime
  • jQuery Terminal - Terminal emulator interface (v2.45.2, self-hosted)
  • WebTUI CSS - Modular TUI-styled component library
  • Sass/SCSS - Stylesheet preprocessing
  • Peggy - Markdown parsing grammar compiler

Build Pipeline

The build process runs in three stages:

  1. Vite Bundle (bun run build:css)

    • Entry: src/main.js → static/assets/main.js
    • CSS: src/webtui.css → static/assets/webtui.css
    • Tree-shakes WebTUI modules
  2. Zola Build (zola build)

    • Compiles Markdown in content/ → HTML
    • Processes Tera templates
    • Compiles Sass → public/global.css
    • Generates search index and RSS feeds
  3. Manifest Generation (bun run build:manifest)

    • Node script (build.js) parses markdown with Peggy grammar
    • Extracts frontmatter and processes inline formatting
    • Outputs static/content.json filesystem manifest

Repository Structure

birdhouse/
├── config.toml              # Zola configuration
├── package.json             # Dependencies and scripts
├── vite.config.js           # Vite bundler config
├── build.js                 # Manifest generation script
├── content/                 # Markdown content files
│   ├── _index.md
│   ├── blog/
│   └── projects/
├── sass/                    # SCSS stylesheets
│   ├── global.scss
│   └── _terminal-shell.scss
├── src/                     # JavaScript source files
│   ├── main.js              # Entry point
│   ├── webtui.css           # WebTUI imports
│   ├── mobile-navbar.js     # Responsive nav logic
│   ├── terminal-foundation.js   # Terminal implementation (~1400 lines)
│   ├── filesystem-builder.js    # UMD filesystem library
│   └── markdown.pegjs       # Markdown grammar
├── static/                  # Static assets
│   ├── assets/              # Built assets
│   └── vendor/              # Vendored dependencies
├── templates/               # Tera templates
│   ├── base.html
│   ├── index.html
│   └── blog.html
└── public/                  # Zola build output (git-ignored)

Development Commands

Command Description
bun install Install dependencies
bun run dev Full dev build + serve
bun run serve Serve only (skip CSS build)
bun run build:css Bundle CSS/JS only
bun run build:manifest Generate content.json
bun run build Full production build

Architecture

Virtual Filesystem

The terminal implements a virtual filesystem loaded from content.json:

  • Commands: ls, cd, cat, pwd, help, clear, tree, find
  • Features: Tab completion, command history, color-coded output
  • Paths: Use /section/page.md format; _index.md for section indexes

Dual Navigation System

  1. Tree Navigation (left sidebar) - Generated by Zola templates
  2. Terminal Interface (right panel) - Shell commands for navigation

Navigation links include data-terminal-* attributes for synchronization between tree and terminal.

Content Synchronization

  • Clicking nav links auto-executes terminal commands
  • Terminal state syncs with browser history API
  • URL fragments (/#cat /blog/post.md) run commands on load
  • Progressive enhancement: content works without JavaScript

Key Files

File Purpose
src/terminal-foundation.js Terminal shell implementation
build.js Content manifest generator
templates/base.html Main layout with navigation
config.toml Zola and site configuration
src/markdown.pegjs Markdown parsing grammar

Adding Content

New Blog Post

# Create file with TOML frontmatter
echo "+++\ntitle = 'My Post'\ndate = 2025-01-09\n+++\n\nContent here." > content/blog/my-post.md

# Regenerate manifest and rebuild
bun run build:manifest
bun run build

New Section

# Create section index
mkdir content/newsection
echo "+++\ntitle = 'New Section'\n+++" > content/newsection/_index.md

# Add to config.toml nav_items, then rebuild

Notes

  • Dev server binds to 100.99.93.69:1111 (also reachable at http://n3st:1111/)
  • WebTUI box-="double round" renders incorrectly; use one value only
  • Always run build:css before zola build to keep assets in sync
  • jQuery Terminal is vendored in static/vendor/ (no external CDN dependencies)