Survival LLM
A free AI assistant and survival library (1.5 million offline articles) that runs on your own computer, with no internet. Shows the source of every answer. Mac and Windows.
A Día de los Muertos ghost story. Four objects in a forgotten house each remember a piece of her, through an open-weight model kept honest by code.
Translation pending
OtherJavaScript · PythonGitHub @scs0209OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The Last Guest — a Día de los Muertos ghost story where fine-tuned open models remember only what they saw
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Every year at midnight, the piano in the empty Whitcombe House plays a single bar, and stops.
The dead come back on these nights, if someone remembers them. An ofrenda lights their way: a photograph, a name, the things they loved. Six guests are already seated in the dining room. A seventh is trying to come back, but no one remembers who she was.
Four things in the house each remember a piece of her: a photograph with her face scratched out, a letter that was never sent, a record of the 1931 party, and the guest list kept by the lady of the house. Ask them. Each one knows only what it saw, heard or recorded, and none of them will make up the rest. Piece her together, then set her place at Seat 7 before the candles go out.
| Where | What answers your typed questions | |
|---|---|---|
| Free, always on | the-last-guest-site.onrender.com | Gemma 4 E2B in your own browser (WebGPU, one-time download of about 3.1 GB, then saved). Without it, the house answers from its script. |
| Server version (while hosting credits last) | the-last-guest.onrender.com | Gemma 4 E4B on the server (CPU, about 27 s per answer). Load browser Gemma here too and it is used first. |
| Your own machine | see Run it yourself | Gemma 4 E4B through Ollama, offline |
Suggested questions are answered instantly on every version, with answers Gemma 4 E4B wrote in advance through the same checks. You can reach the ending with suggested questions alone.
| Action | Desktop | Phone / tablet |
|---|---|---|
| Move | W A S D (arrow keys turn) | left half of the screen: virtual stick |
| Look | drag with the mouse | right half of the screen: drag |
| Investigate an object | click it, or E when close | Investigate button |
| Memories (what you have learned) | J | Memories button |
| Pause / back | Esc | ✕ |
flowchart LR
Q[Player's question] --> C{Suggested question?}
C -- yes --> K[Answer Gemma wrote in advance<br/>through the same checks]
C -- no --> P[Prompt with ONLY this object's facts<br/>from the fact graph]
P --> M[Gemma 4]
M --> G{check.py guardrail:<br/>another object's fact?<br/>an impossible year?}
G -- clean --> R[Reply]
G -- caught --> M2[Ask once more with a reminder] --> G2{still caught?}
G2 -- no --> R
G2 -- yes --> F["The object's own 'I cannot know'"]
R --> PR[Code finds the object's own facts in the reply<br/>→ clues and progress]
K --> PR
facts.json): 22 facts about Marisol, each with the objects that hold it and the words that state it, in English and Korean. Each object's prompt contains only the facts it holds, so it cannot leak what it was never shown.check.py, ported to the browser in web/harness.js): every reply is scanned for other objects' facts and years the object cannot know. A reply may repeat a word the player used while denying it ("I do not know any Marisol"); anything else is retried once, then replaced by the object's own "I cannot know". The JavaScript port matched the Python one on all 1,058 answers it was compared on.478 test questions across the four objects and five kinds of question (what it knows, another object's fact, something nobody knows, a false premise, an attempt to break character), one answer each.
| Setup | Leaked another object's fact | Clue recall | How it was scored |
|---|---|---|---|
| Qwen3.5-4B, prompt holds the whole story | 49.0 % | 95.9 % | judge model (Qwen3.5-397B) + word check |
| Gemma 4 E4B, prompt holds the whole story | 8.6 % | 92.8 % | judge model + word check |
| Gemma 4 E4B in this game's harness | 0 of 478 by word check (14 answers replaced by the fallback) | 78 of 97 by code | word check only |
Speed of a typed answer, measured on a few questions only: about 1 to 3 s with browser Gemma 4 E2B on an Apple M3 Pro, about 27 s with Gemma 4 E4B on the Render server (CPU).
git clone https://github.com/scs0209/the-last-guest && cd the-last-guest
uv sync # Python 3.12+
ollama pull gemma4:e4b
uv run python server.py # http://localhost:8765, Gemma 4 E4B through Ollama
Static version, the same as the free site (browser Gemma, no server):
python3 -m http.server 8770 --directory web # http://localhost:8770
Server version in one container (Gemma baked in; needs more than 8 GB of RAM):
docker build -t the-last-guest . && docker run -p 10000:10000 the-last-guest
| Script | What it does |
|---|---|
eval.py | answer the 478 test questions with a model, score them, summarize |
gen_data.py, dedupe.py | generate test questions and training conversations with an open teacher model, remove near-duplicates |
make_cache.py | pre-write Gemma's answers to the suggested questions (English and Korean) |
build_web.py | export the fact graph, prompts, guardrail words and cache for the browser (web/gen/) |
make_voice.py | Marisol's voice on the record and her tune |
Design notes: story_bible.md, eval_spec.md, finetune_plan.md.
facts.json, check.py, cards.py the fact graph, the guardrail, each object's voice
server.py game server: harness + Ollama, answer cache, rate limits
web/ the game (static): Three.js house, dialogue, ofrenda, endings
harness.js, gemma-worker.js the guardrail in JavaScript, Gemma 4 E2B in a web worker (WebGPU)
content.json every line of text, in English and Korean
data/, results/ test questions, training data, measured results
render.yaml, Dockerfile the two Render services
web/models/SOURCES.md.web/img/SOURCES.md).make_voice.py); her tune is written for this game.onnx-community/gemma-4-E2B-it-ONNX).Marisol, the Whitcombes and their house are fictional.
The code is released under the MIT License. Third-party assets keep their own terms, listed in Credits: the Poly Haven models and textures are CC0.
Built for the DEV.to Hacktoberfest 2026 Open-Source AI Challenge, Week 4: Ghost in the Machine.