An old-school text adventure straight out of 1985. https://halfstreet.io
  • TypeScript 92.3%
  • CSS 4.5%
  • Astro 3.1%
Find a file
2026-05-17 23:35:13 -05:00
docs/superpowers docs: implementation plan for bug reporting 2026-05-17 23:02:46 -05:00
public fix(ui): polish terminal options and assets 2026-05-10 07:00:22 -05:00
src chore: obsidian docs 2026-05-17 23:35:13 -05:00
.gitignore chore: standalone Halfstreet repo scaffolding 2026-05-09 11:36:19 -05:00
.woodpecker.yml feat(world): expand Halfstreet content slices 2026-05-12 14:48:19 -05:00
astro.config.mjs feat(world): expand Halfstreet content slices 2026-05-12 14:48:19 -05:00
LICENSE chore: standalone Halfstreet repo scaffolding 2026-05-09 11:36:19 -05:00
package-lock.json feat(ui): add bug reporting integrations 2026-05-17 23:34:17 -05:00
package.json feat(ui): add bug reporting integrations 2026-05-17 23:34:17 -05:00
README.md Open source markdown authoring workflow 2026-05-13 17:59:13 -05:00
tsconfig.json chore: standalone Halfstreet repo scaffolding 2026-05-09 11:36:19 -05:00

Halfstreet

A gothic text adventure. Second person, present tense, sparse — never explains.

Style anchors: Le Fanu's Carmilla, Shirley Jackson's The Haunting of Hill House, M.R. James's ghost stories.

Played at halfstreet.io.

Stack

  • Astro static site
  • TypeScript engine — pure (no DOM, Date, Math.random, or console)
  • World content authored in markdown (rooms, items, encounters, endings) under src/world/
  • Vitest for tests

Development

npm install
npm test          # engine + world tests
npm run dev       # local dev server
npm run build     # type-check + production build

Make Your Own Game

Halfstreet is currently meant to be forked as a complete Astro app, not consumed as a separate engine package. To make a new story, replace the markdown vault in src/world/ and keep the TypeScript runtime in place.

Start with:

  • src/world/game.md for the title, starting room, starting inventory, ending priority, opening art, help text, and end text.
  • src/world/parser.md for command vocabulary and aliases.
  • src/world/rooms/, src/world/items/, src/world/encounters/, and src/world/endings/ for story content.
  • src/world/mechanics/ and src/world/actions/ for configurable rules and interactions.
  • src/world/ui.md for page metadata, footer links, and UI feature switches.
  • src/world/templates/ for starter files.

Run npm test after changing world files. The loader validates wikilinks, required sections, frontmatter shape, and references between rooms, items, encounters, endings, mechanics, and actions.

Releases

The footer build number comes from Woodpecker's pipeline number and increments on each CI build. The package version is an intentional release label.

Use one of these from a clean worktree when you are ready to cut a release:

npm run release:patch  # fixes, typo corrections, small polish
npm run release:minor  # meaningful playable additions or mechanics
npm run release:major  # disruptive changes after 1.0.0
git push --follow-tags

Each release script updates package.json and package-lock.json, creates a release commit, and tags it.

Layout

  • src/engine/ — parser, dispatcher, encounter logic
  • src/ui/ — terminal renderer, theme, chips
  • src/world/ — Obsidian-friendly authoring vault
  • src/pages/index.astro — entry page

Design docs

  • docs/superpowers/specs/halfstreet-bible.md — content bible (canonical world)
  • docs/superpowers/specs/2026-05-08-mystery-text-adventure-design.md — engine/UI architecture
  • docs/superpowers/specs/halfstreet-followon-notes.md — pending engine work before authoring more rooms
  • docs/superpowers/specs/2026-05-09-mystery-markdown-migration-design.md — markdown content migration design
  • docs/superpowers/plans/2026-05-09-mystery-markdown-migration.md — migration plan that was executed

License

GPL-3.0-or-later. See LICENSE.