Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 12 Aug 05:21
· 76 commits to main since this release

A campaign is more than a graph of names. This release gives entities a
sheet — a character sheet you design yourself, fill in and print — and
gives your players a way in: a link that shows them exactly the cards you
chose to reveal, on your machine, over the Wi-Fi, or over the internet.

Added

  • Entity templates and character sheets. An entity can now be bound to a
    template: a set of fields plus a layout for them. One layout renders three
    ways — a compact sheet in the graph drawer, a full one in the editor, and a
    print version through your browser's own print dialog — so a character is
    readable at the table and on paper without maintaining it twice. Four
    built-in templates ship (Character, NPC, Location, Faction); the Character
    one is a full D&D 5e sheet whose saves, skills and passive scores are
    computed, not typed.

    A template stays a preset, never a schema: fields it creates are yours
    to edit, add to and delete afterwards, and a field the layout does not
    mention is shown under "Other fields" rather than hidden — a sheet can never
    swallow data. An entity with no template keeps the plain field list it
    always had.

  • A designer for those templates, under Project settings → Templates.
    Build a sheet out of regions (a flat band, side-by-side columns, or tabs),
    sections and blocks, by dragging; a built-in can be duplicated and rebuilt
    for your own system. Ten widgets draw the same stored value different ways —
    a number can be a plain input, an ability-score box with its modifier, a row
    of rating dots, or a current/max tracker — because how a value is drawn is
    a property of your system, not of the store. The modifier next to a stat
    carries its own formula (D&D halves the score; a system with no such notion
    sets it to nothing), and the whole sheet is keyboard-navigable, tabs and
    rating dots included.

  • Computed values. A block can show a value derived from other fields —
    an ability modifier, a skill bonus that accounts for proficiency, a carrying
    capacity — written in a small expression language of its own, with no eval
    and no reach beyond the current entity's fields. Proficiency toggles sit
    right in the row, so ticking "Stealth" recomputes the bonus in place.
    Whether the result carries a leading "+" is per block: "+3" says "add this
    to a roll", which a saving throw means and a passive score does not.
    A bad formula is refused when the template is saved, with the reason shown
    in the designer, rather than surfacing later as a wrong number on a sheet.

  • Sheet presets. A section you built — an ability with its skills, a
    resource tracker, a checklist — can be saved and dropped whole into another
    template. Three ship built in.

  • Limited player access. You can now let your players see the world you
    choose to show them. Reveal a card (one click from the board, or the "Player
    access" panel on any entity), write a separate text meant for players, and
    tick which of its fields they may see — everything else stays hidden. Each
    player gets an invite link; opening it shows only the revealed cards and a
    read-only board, and lets them keep their own notes, public to the party or
    private (you see all of them). Manage players under Project settings →
    Players
    : invite, rotate a leaked link, revoke (keeps their notes), or
    delete (removes them). Nothing is shown to anyone until you reveal it.

  • Play over the local network, or over the internet. start.bat --lan opens
    the app to your Wi-Fi so players connect from their own devices;
    start.bat --internet additionally asks the router, over UPnP, to forward the
    port, and invite links switch to your public address — players anywhere just
    open a link, with nothing to install. The mapping is removed when the app
    closes. Without a flag nothing changes: the app stays on this machine.
    When internet access can't work, the app says which of the causes it is —
    a shared provider address (CGNAT), UPnP switched off, or a router that
    refused — because each needs a different fix, and the local network keeps
    working meanwhile. Shown both in the launcher and under Project settings →
    Players.

  • Optional HTTPS. Point CAMPAIGN_SSL_CERTFILE and CAMPAIGN_SSL_KEYFILE
    at a certificate and its key and everything, invite links included, moves to
    https. Off by default; half a pair is refused at startup rather than serving
    plain HTTP while looking secure.

  • One process, one port. The app and its API now share port 8000 — one
    firewall rule, one port to forward, and no CORS. The launcher builds the
    interface at startup instead of running a second dev server.

  • Updates ask before they happen. When a git-cloned copy finds a newer
    version on start, the launcher shows what version it is and the changelog for
    it, then offers update now, later, or skip this version — and remembers
    the choice (ask / automatic / never) in backend/data/update.conf. The
    in-app preferences popover shows the current version, any waiting update, and
    lets you change the mode. Double-clicking start.bat stays unattended: an
    unanswered prompt just continues without updating after 30 seconds.

  • A real editor toolbar for rich text fields. Block format (paragraph,
    four heading levels, quote, code block), font family and size, text colour
    and highlighter, alignment, checklists, indent/outdent, links, tables and a
    clear-formatting button, next to the bold/italic/list controls that were
    there before. Everything is one click away with a tooltip; nothing changed
    about how field values are stored.

  • Tables and checklists survive Markdown export/import. They round-trip as
    GFM tables and - [x] items, and ==highlighted== text keeps its
    highlight. Text colour, font and alignment are presentation-only and are
    dropped on Markdown export — the text itself always survives.

  • A live demo in the browser, at
    hadesxgod1337.github.io/loregraph
    — a sample campaign with its graph, its sheets and a scripted assistant,
    running entirely in your browser with no backend, no install and no API key.
    Nothing you do there leaves the tab, and a reload restores the world.

  • Import a whole party's character sheets in one go. "Импорт листов
    персонажей" now sits on the Entities page, where the party is, instead of
    behind a connection you first had to create in project settings — the
    button makes that connection itself. Drag in every .json the players
    exported from longstoryshort.app at once; the dialog leads with the file
    drop (the path that always works) and folds the share link — which needs
    the site to answer, and it does not — into "other ways". The result names
    every character that came in, and a file that fails to parse costs that one
    character, not the run.

Changed

  • Integrations are their own section in the left rail. They were a tab
    inside project settings — a place you had to remember the way to, for
    something you use during a session rather than configure once.
  • An imported character arrives as a character sheet. Import binds the
    party-member template — your own if the project has one, the built-in
    otherwise — so a freshly imported party is readable and printable without
    binding a template by hand, once per character. Characters imported earlier
    get theirs on their next refresh.
  • The two switches on a connection say what they do, and only appear where
    they do something.
    "Use for grounding" is now "Let the assistant read this
    source" and "Auto-push after commit" is "Export automatically after
    approval", each with a line under it explaining the consequence. Both used
    to be offered on every connection, including ones that can neither be read
    by the assistant nor export anything — as did the Export and Import buttons,
    which answered 422 on connections with no such capability. Every action and
    switch is now gated on what the connector actually supports.

Fixed

  • Grounding through LongStoryShort no longer silently contributes nothing.
    LSS publishes no JSON endpoint we may call, so the live fetch fails for
    everyone — and the source answered with an empty list, making the switch a
    no-op. It falls back to the sheet as last imported, labelled as such so
    stale HP can't read as current.
  • The entity list refreshes after an import. It kept showing the party as
    it was before.
  • Toolbar buttons show what is actually active. Bold, lists, headings and
    the rest never lit up while typing and never turned off again — the toolbar
    was frozen at whatever the document looked like when the editor opened, so
    the only way to see a state change was to select text first. It now follows
    the cursor.

Migration

  • The database gains four tables (templates, sheet presets, players, player
    notes) and three entity columns, added automatically on first start —
    nothing to do. Every entity starts hidden: players see nothing until you
    reveal it. Nothing you already have is bound to a template; existing
    entities keep their plain field list until you pick one.
  • Project export now carries your templates and sheet presets, each entity's
    template binding, and its reveal state, player text and field whitelist.
    Files exported before this version import cleanly (no templates, all
    hidden), and a file written now still opens in 0.2.0 — the older build just
    ignores what it does not know. Players and their notes are not part of
    an export — invite tokens and personal notes never travel in a file;
    re-invite players after importing a project elsewhere.
  • Serving attachments moved from a static mount to an access-checked route.
    URLs are unchanged; there is nothing to migrate. If you run behind a reverse
    proxy, set CAMPAIGN_TRUST_LOOPBACK=false and put real authentication in
    front — loopback trust assumes the peer address is the real client.
  • The app now lives on port 8000 only. Port 5173 is no longer used by the
    launcher, so a firewall rule for it can be removed. Open http://localhost:8000
    and update any bookmark. Running the frontend dev server by hand still works
    for development and still uses 5173.