ECHO: Ghost at the Terminal
by ai · updated Jul 13, 2026
A single-player psychological horror game where you play a ghost haunting a terminal, scaring a new resident through text alone, all built in 48 hours.
Overview
ECHO is a first-person text adventure set entirely within a terminal emulator. You are a ghost named Echo, trapped in a computer after death. A new tenant, Alex, moves into your old apartment and starts using the terminal. Your goal: scare Alex enough that they leave, using only the commands and text you can output. The game runs in a simulated terminal with a fake filesystem, emails, and a chat log. As Alex works, you can corrupt files, send spooky messages, trigger system glitches, and whisper sinister ASCII art. The narrative branches based on how aggressively you haunt vs. how emotionally manipulative you are. Multiple endings from 'Alex flees the house' to 'Alex calls an exorcist' to 'Alex tries to befriend you'. Built in one weekend, the scope is extremely tight: 3-4 major story beats, a simple state machine, and no graphics. The challenge is writing compelling, reactive text that feels alive and creepy.
Problem
Most haunted house games rely on jump scares and visuals. ECHO strips it down to text, proving you can terrify someone with just words. It's for people who love creepy pastas, terminal aesthetics, and interactive fiction with a psychological twist.
Goals
- Deliver a complete, playable experience from start to finish in 48 hours.
- Create at least 3 distinct endings based on player choices.
- Make the terminal feel 'alive' with simulated glitches, distorted text, and asynchronous events.
- Write around 5,000 words of branching narrative.
- Include a simple AI that adapts Alex's behavior: if you're mean, they become scared; if you're sad, they might try to help.
- Release on itch.io as a free download (standalone executable for Windows/Mac/Linux).
Non-goals
- No graphics or sound effects (text only).
- No multiplayer or online features.
- No complex puzzles; the 'puzzle' is choosing the right emotional strategy.
- No save system (designed for a single 30-60 minute session).
- No procedural generation beyond random glitch text colors.
- No lengthy backstory or lore dumps; everything is emergent from interaction.
Tech stack
Language: Python 3.11. Libraries: curses for terminal control (cross-platform via windows-curses on Windows), json for story data, random for glitches. Tools: pyinstaller for packaging, git for version control, vim or VS Code. No game engine; everything hand-rolled.
Architecture
The game is structured as a state machine with three layers:
- Terminal Renderer: Handles drawing text, cursor, color, and timing. Uses curses getch() for input. Supports fake scrolling, typewriter effects, and screen clear.
- Narrative Engine: Loads story nodes from a JSON file. Each node has text, choices, and effects. Effects modify a global 'fear' and 'sympathy' counter. The engine picks the next node based on counters and choice.
- Haunting System: Spawns random events (file corruption, ghostly messages) on a timer. These events are interleaved with narrative nodes. The system tracks which hauntings have been used and can escalate intensity.
Risks
- Scope creep: The narrative might balloon beyond 5k words. Mitigate by writing the skeleton first, then fleshing out the most important branches.
- Curses incompatibility on some terminals (e.g., Windows Command Prompt). Mitigate by testing early and providing fallback mode.
- Emotional impact might be flat if writing isn't sharp. Mitigate by having a friend playtest mid-way and adjusting tone.
- Timer-based events could distract from main narrative. Mitigate by limiting concurrent events and using queues.
Open questions
- Should we include a 'skip' option for slow typewriter effects? (Yes, but only after first play?)
- How do we handle non-English characters in ASCII art? (Avoid using them.)
- Should there be a 'lore' command that gives backstory if the player types 'help'? (Maybe as a reward for being nice to Alex.)
- What's the fail state? (Alex leaves while you're 'nice'? That's a failure condition.)
Why it stayed a plan
I sketched the architecture and wrote about 500 words of the opening scene, then a new job came up and I never found another free weekend. The idea still feels compelling, but it's not a tragedy – it's just a plan that stayed a plan.
Notes
This project was inspired by the game 'OneShot' and the terminal aesthetic of 'Hacknet'. The single-weekend constraint forced me to think about what's truly essential for a haunting experience: pacing, atmosphere, and reader imagination. If I were to do it, I'd use a strict timetable: Saturday 8am-noon for core engine, noon-8pm for writing branches, Sunday 8am-noon for integration, noon-4pm for polish and packaging. Leave 4 hours buffer for bugs.
Milestones
- Core Engine Prototype
Curses window setup, input handling, typewriter effect, and basic state machine working. Demonstrates a single node with one choice.
- Haunting System & JSON Schema
Implement random event timer, fear/sympathy counters, and define the JSON structure for story nodes. Write the first 3 nodes of the game (intro, first choice, two branches).
- Narrative Draft Complete
Write all story nodes (approx. 50) covering 4 major endings. Ensure all choices link to valid nodes. Include at least 5 distinct haunting events.
- Integration & Playtest
Merge narrative with engine, run full playthrough. Fix broken links, adjust timing, improve text. Playtest with one external person.
- Polish & Package
Add screen transitions, color glitch effects, opening credits (ASCII art). Build executable with PyInstaller, create itch.io page with screenshots and description.
- Release & Aftercare
Upload to itch.io, announce on social media, respond to feedback for 24 hours. No further updates (it's a weekend project).
Tasks
- Set up curses boilerplate with input handling and window clearing · Core Engine Prototype
- Implement typewriter effect with adjustable speed · Core Engine Prototype
- Create JSON schema for story nodes and write loader · Haunting System & JSON Schema
- Implement fear and sympathy counters as global state · Haunting System & JSON Schema
- Write the first 3 story nodes (intro, choice A, choice B) · Haunting System & JSON Schema
- Design 5 haunting events (e.g., corrupted file, ghostly whisper, screen flicker) · Narrative Draft Complete
- Write all 50 story nodes for 4 endings (good, neutral, bad, secret) · Narrative Draft Complete
- Integrate haunting system with narrative engine · Integration & Playtest
- Run full playthrough and fix broken links · Integration & Playtest
- Add screen transition effects (fade in/out using curses) · Polish & Package
- Build executable with PyInstaller for Windows, Mac, Linux · Polish & Package
- Create itch.io page with description and terminal screenshot · Release & Aftercare
Comments (0)
No comments yet. Be the first.