enForged

enForged is your creative writing partner. It helps you write stories with an AI that actually understands the world you've built. Great for fanfiction, original fiction, or any creative writing project.

Build a story universe:

  • Characters, places, factions, and magic systems
  • Relationships between everyone in your world
  • Story events as they unfold

Then write alongside an AI that knows it all. Nothing to install, no account to make, and your work stays private in your browser. You'll just need a key from an AI provider like Claude or OpenAI (or a free local one via Ollama).

⚙ Settings

AI Backend

Claude api.anthropic.com
OpenAI / ChatGPT api.openai.com
Ollama local / self-hosted
Get a key at console.anthropic.com. Keys are stored only in your browser's localStorage and sent only to Anthropic's API.

Google Drive BackupBETA

enForged calls the Google Drive REST API directly using an OAuth access token.

To get a token (free, takes ~1 min):
1. Visit OAuth Playground
2. In Step 1, select Drive API v3 → tick https://www.googleapis.com/auth/drive.file
3. Click Authorise APIs → sign in with your Google account
4. In Step 2, click Exchange authorization code for tokens
5. Copy the Access token and paste it above

Tokens expire after ~1 hour. Refresh by repeating steps 3–5. Tokens are stored only in localStorage.

Context & Token Limits

How many prior exchanges (one of your messages + one AI reply = one exchange) to include as context. Your current message is always sent. Set to 0 to send only your current message - useful when a recent AI reply went off-track. You can also click ⊘ on any single message to skip it: ignoring just the AI's response keeps its matching request, so the AI re-attempts the last prompt. Leave blank to send the full history. The complete conversation always stays visible in the chat.

Appearance

Lexend and Comic Neue are designed for easier reading with dyslexia, ADHD, or low vision.

AI Prompts

Edit the prompts sent to the AI. Leave a field blank to restore the built-in default. Changes take effect on the next AI call.
CO-AUTHOR INSTRUCTIONS (appended to every chat system prompt)
SUMMARY COMPILER · SYSTEM ROLE (AI role when generating Story So Far)
SUMMARY COMPILER · USER INSTRUCTIONS (format & rules for the story brief; use {lorePart}, {existing}, {beats})
AI SEED · STORY-SHAPE SYSTEM ROLE (used when shaping a new story after duplicating a universe)
EPIC CONVERT · ERA SUGGESTER (used by "Suggest Eras with AI" during classic → epic convert)

Shape Your New Story

Source context:

✦ enForged: How to Use

Quick Start

  1. Configure your AI backend: open ⚙ Settings, choose Claude, OpenAI, or Ollama, and paste your API key. Click Test connection to verify it works.
  2. Create a Universe: click + New Universe in the sidebar. Give it a name, fandom/genre, and an optional premise.
  3. Build your Lore Vault: in the Lore Vault tab, click + Add Entry to create characters, locations, factions, magic systems, and more.
  4. Write alongside the AI: open the Chat tab and start co-authoring. Commit good AI responses as story beats to build your narrative record.

The Lore Vault

Lore entries are the world-building backbone of your universe. Every chat message is sent with your lore as context so the AI always knows your world.

FIELDSENT TO AI?PURPOSE
TypeYesCategorises the entry (Character, Location, etc.)
NameYesHow the AI refers to this entity
Core DescriptionYesBrief overview the AI reads first
Type-specific fieldsYesStructured metadata (see below)
TagsYesAdditional keywords for context
RelationshipsYesBidirectional links to other lore entries, each with a label and optional notes describing the connection from both sides
Private NotesNoYour private thoughts, planned twists, spoilers the AI should never see

Canon vs Working Ideas: Canon lore is locked-in fact; the AI must never contradict it. Working Ideas are possibilities treated as plausible but not definitive. Use Working for things you're still developing.

LORE TYPETYPE-SPECIFIC FIELDS
CharacterAppearance, Personality, Motivation/Goals, Dialogue Style, Role in Story
LocationAtmosphere/Mood, Key Features, Significance, Who Frequents It
FactionGoals/Agenda, Values/Ideology, Key Members, Relations to Other Factions
Magic/PowerHow It Works, Limitations/Cost, Who Can Use It, Visual Manifestation
TimelineWhen (in-story), What Happened, Consequences, Characters Involved
RuleThe Rule, Why It Exists, Consequence of Breaking
Writing StyleNarrative Voice, Tone, Prose Style, Pacing, Dialogue Approach
Other(core description only)
Tip: Add a Writing Style lore entry to give the AI a consistent narrative voice. It shapes the tone of every response and is one of the most powerful entries you can create.

Relationships

Any lore entry can be linked to any other via the Relationships section in the edit modal. Each relationship is bidirectional: you define both sides at once so neither entity needs to be edited separately.

  • Your View of Them: the label (and optional notes) this entity attaches to the other (e.g. "Rival: we grew up competing for the same mentor").
  • Their View of You: the reciprocal label (and optional notes) saved automatically to the linked entry (e.g. "Nemesis: she never lets me win").

Both labels must be filled for a relationship row to be saved. When the entry is saved, the linked entity's relationship list is updated silently, so you will see the reciprocal label appear on that entity's card without opening it. Removing a relationship row and saving will also remove the reciprocal from the other entry.

Relationship labels and notes are included in the AI context alongside the entry's other fields, so the model understands the web of connections between characters, factions, and locations.

Tip: Relationship chips on lore cards show the label; hover a chip to see the notes. Canon and Working status applies to the entry as a whole, so use the notes field to flag tentative connections within an otherwise canon entry.

Importing Lore from Another Universe

In the Lore Vault tab, click ↓ Import Lore to cherry-pick individual lore entries from any other universe into the current one. Each universe's entries appear in a collapsible section; select as many as you want across multiple universes and click Import Selected. Imported entries receive new IDs and are fully independent; editing them will not affect the originals.

Story So Far

The Story So Far tab connects two things: the raw beats you write, and the polished summary the AI generates from them.

Story Beats are short factual notes about what has happened: "Rin discovered her quirk was inherited from her father", "The League attacked during exams". Add them manually in the text box, or commit an AI response from Chat using + Add to Beat.

The Summary is compiled by the AI from your beats. Click ✦ Summarise after adding beats. The summary is injected into every chat session; it's how the model knows the current state of your story without re-reading the full history.

Workflow: Chat → something interesting happens → + Add to Beat✦ Summarise → the next chat picks up with full context.

In epic mode, beats are off. The Story So Far summary stays as a hand-edited scaffold; per-scene records live as events on the Timeline tab. See the Epic Mode section below.

Chat & Co-authoring

Every message is sent with your full story context: lore, summary, and recent chat history. The context bar at the top of the chat panel shows what's included; click any chip to toggle it on or off for the next request.

  • + Add to Beat / + Add to Event: classic universes commit the AI response as a beat; epic universes commit it as a timeline event using the metadata the AI emits with every response. ✎ Edit + Add to ... opens an editable form pre-filled from the response.
  • 💡 Ideas block: if the AI appends directional suggestions, they appear collapsed below the response. Use ↩ Adopt to drop a suggestion into your chat input.
  • ⊘ Ignore / Skip: click on any chat message to exclude it from the context sent on the next turn. Useful when an AI reply went off-track and you want a retry.
  • ✦ Summarise button (context bar, classic only): regenerates your summary from the current beats without leaving the chat tab.

Epic Mode

Multi-generational stories with hundreds of lore entries break the classic "send everything every turn" model. Epic mode replaces it with an era-aware retrieval pipeline that runs entirely in your browser.

Convert classic to epic: hover any universe in the sidebar and click the button. The convert dialog creates a non-destructive duplicate (the original classic universe stays put). Optionally click ✦ Suggest Eras with AI to have the model read your beats and propose 2-6 eras with assignments; preview, rename, reassign, then apply.

  • Timeline tab: appears for epic universes. Manage eras (named segments of in-story time) and events (per-scene records replacing beats; each carries a title, body, era, in-story time label, and tagged entities).
  • Era scope on a lore entry restricts which eras it feeds the AI into. A character from the second arc can be hidden when the active era is the first.
  • Pinned lore: entries always included in the AI context regardless of relevance ranking. Plus any Writing Style entry is always included.
  • Active era chip in the chat header: click to change. Determines which lore and events are eligible for the next turn.
  • Retrieval context bar (below the chat): shows exactly which lore and events the pipeline picked for the most recent turn, with a token count and the budget cap. Click to expand.
  • Embedding model: snowflake-arctic-embed-xs (384-d int8), ~22MB, vendored locally. Runs in a Web Worker via WASM. No data leaves your browser for retrieval.
Token budget: defaults to 4,000 tokens. Tune it in ⚙ Settings under Era Mode. Raise it if your turns feel under-contextualised; lower it to save provider cost.

Duplicating a Universe

Hover over any universe in the sidebar to reveal the duplicate button. Clicking it opens a dialog with three modes:

  • Copy everything: duplicates lore, beats, story summary, and chat history. Ideal for branching timelines or experimenting while keeping the original intact.
  • Just lore: migrates all lore to a new universe with a completely blank story. Use this to explore an AU (alternate universe) that shares the same world-building but tells a different story.
  • Lore + AI seed: migrates lore, then opens a dedicated story-shaping chat panel. The AI knows your migrated lore and helps you articulate what's different, who matters, and where this new story begins. When you're satisfied with an AI response, click ✓ Save as Story So Far to set it as the new universe's summary and close the panel.
AI seed context toggles: The story-shaping panel lets you give the AI access to the source universe's original lore and story for reference; useful when the new story is a direct divergence from the original.

AI Prompts

Open ⚙ Settings → AI Prompts to view and customise the five prompts enForged sends to the AI. Leave any field blank to use the built-in default.

PROMPTUSED FOR
Co-Author InstructionsBehaviour rules appended to every chat, e.g. "never contradict canon", "flag invented details"
Summary Compiler · System RoleThe AI's role definition when generating your Story So Far
Summary Compiler · User InstructionsFormat rules for the story brief (EVENTS / STATE / THREADS structure)
AI Seed · Story-Shape RoleThe AI's role when helping you define a new story after duplicating a universe with Lore + AI seed
Epic Convert · Era SuggesterUsed by "Suggest Eras with AI" when converting a classic universe to epic; the AI reads your beats and proposes eras with assignments

Each prompt has two buttons: Clear (empties the field; blank means use the built-in default on the next call) and Default (fills the field with the built-in text so you can read and tweak it). Custom prompts travel with your backup JSON when the Custom AI prompts category is ticked in the export modal.

Data & Backup

Classic state lives in localStorage under enforged_v2_state; epic state (eras, events, scope, pinned) under enforged_epic_state. Vectors live in IndexedDB and are regenerated on demand (not backed up). Everything persists across page reloads but is browser- and device-specific.

The sidebar's Export and Import buttons open per-category modals so you choose what travels with the file:

CATEGORYEXPORT DEFAULTWHAT IT COVERS
Universes✓ tickedAll universes, lore, beats, chat history, and epic timeline data (eras, events, scope, pinned)
API keys & tokens☐ opt-inClaude / OpenAI / Drive token. Keep the file secure
Settings☐ opt-inAI provider, model selection, font, history window, chip defaults
Custom AI prompts☐ opt-inAny prompts you customised in Settings

On import the defaults flip: categories present in the file default ticked so applying everything is the obvious path; untick to skip. Imported universes get fresh IDs and merge alongside existing ones; epic state remaps so eras and events keep their cross-references.

  • This Device: Export downloads a .json file; Import reads one back.
  • Google Drive: add an OAuth access token in Settings → Google Drive Backup. Tokens expire after ~1 hour and need refreshing manually.
  • Import an existing story: use Import → ✦ Generate JSON from existing story for a prompt that converts any existing story text into an enForged import file via any capable LLM (Claude, ChatGPT, Gemini, etc.).

What the AI Receives in Every Request

Classic mode: a flat assembly of every lore entry plus the Story So Far summary plus your customisable instructions.

  • Universe name, fandom/genre, and premise
  • Canon lore: all entries marked Canon (if the context chip is on)
  • Working Ideas: entries marked Working (if toggled on)
  • Story So Far: the AI-generated summary (if toggled on)
  • Co-Author Instructions: your customisable behaviour rules

Epic mode: same shape, but Canon/Working sections are replaced by RELEVANT LORE and RELEVANT EVENTS containing only the items the retrieval pipeline picked for the current turn (era-filtered, cosine-ranked, packed into the token budget). The active era is named at the top. Pinned lore and Writing Style entries are always included. An extra epic-only instruction tells the AI to append a hidden 📌 EVENT: metadata block to every response, which powers the + Add to Event chat button.

What is never sent (both modes): Private notes on lore entries, individual story beats (only the compiled summary), and internal system messages from the chat history.

⚙ Setup Guide

enForged runs entirely in your browser, but it needs an AI backend to do the actual writing. This walkthrough gets you from zero to your first co-authored sentence in a couple of minutes.

Tip: clicking any URL on this page copies it to your clipboard.

1. Pick an AI provider

You'll need exactly one of these. Your API key (or Ollama URL) stays on your device. It's saved to localStorage and sent only to the matching provider over HTTPS.

PROVIDERCOSTNOTES
Claude (recommended)PaidBest prose quality.
OpenAIPaidWidely available.
OllamaFreeRuns locally; quality depends on the model and your hardware.

2. Get an API key

You only need one. Follow the bullet for the provider you picked above. Skip the others.

  • Claude: open console.anthropic.com, sign in, go to API Keys, click Create Key, copy the value (starts with sk-ant-). You'll need to add a small amount of credit before the key works.
  • OpenAI: open platform.openai.com/api-keys, sign in, click Create new secret key, copy the value (starts with sk-). Billing must be set up on your account.
  • Ollama: no key needed; you'll just point enForged at your running instance. Two things to check on the Ollama side: (1) the server was started with OLLAMA_ORIGINS=* ollama serve so this page is allowed to reach it, and (2) you've already pulled the model you want to use. Then open enForged via http://localhost:8080, because Ollama blocks file:// origins even with OLLAMA_ORIGINS set.

3. Configure your AI backend

Pick your provider, paste your key, choose a model, then Save. Click Test connection to verify; a successful response shows ✓ enForged OK (or similar) in monospace text.

If the test fails, the most common causes are: a typo in the key, no billing/credit on the account, or (for Ollama) the server isn't running or CORS isn't configured. Same fields are also available later via the ⚙ Settings panel.

4. Create your first universe

You're ready to write. Click below to open the new-universe dialog: give it a name and an optional premise, and you're off. The How to use enForged guide (linked from the home screen) covers everything past this point: lore, beats, chat, prompts, backups, and (for multi-arc stories) epic mode with an era-aware Timeline tab and an in-browser retrieval pipeline that keeps the AI focused as your world grows.

Optional: Already have a story - simple import

If your world already exists somewhere (a draft, a worldbuilding tool, even a published book), you can seed a universe from it instead of building lore by hand. Almost any source can be turned into enForged JSON via your LLM of choice:

  • Prose drafts from a Word doc, Google Doc, AO3 paste, or notes app: paste the text in.
  • Structured exports from World Anvil (JSON), Notion, Scrivener, and similar tools: paste or upload the file, and the LLM reshapes it into enForged's schema.
  • EPUB or PDF of a manuscript: most chat UIs accept file uploads directly.
  • A popular story the model already knows: just describe it (for example, "build me a universe for The Locked Tomb"). No source file required.

The flow is the same regardless of input:

  1. Copy the import prompt:
  2. Paste it into Claude, ChatGPT, or any LLM. Then either replace [paste your story text here] with your text, attach your EPUB / PDF / JSON file, or replace it with the title of a known story.
  3. Save the model's response as a .json file.
  4. Come back to enForged, click Import → This Device in the sidebar, and pick the file.

The same prompt is also available later from the sidebar's Import section, under ✦ Generate JSON from existing story.

Extraction is approximate. Expect to clean up names, merge near-duplicates, and adjust canon flags before writing. For very short drafts it's usually faster to enter lore manually.

Optional: Google Drive backupBETA

Everything is stored in your browser by default, which means clearing site data wipes your work. If you want an off-device copy, open ⚙ Settings → Google Drive Backup and follow the in-panel instructions for getting an OAuth token from the OAuth Playground. Tokens expire after about an hour and need to be refreshed manually.

This is currently a thin layer over the Drive REST API and the OAuth Playground flow: usable, but rough edges remain. Local Export / Import is the more reliable backup until this stabilises.