Character sheet + live online table for the Brazilian horror RPG Ordem Paranormal.
The GM sees every sheet and every roll in real time, and pushes images that open on everyone's screen.
English · Português (Brasil)
Este é um conteúdo não oficial, publicado sob a Licença da Comunidade de Ordem Paranormal. Contém material gerado por inteligência artificial.
Unofficial fan content published under the Ordem Paranormal Community License. Contains AI-generated material. No affiliation with the rights holders — see LICENCA.md.
- Complete character sheet — 6 tabs, 28 skills, attacks, abilities, rituals, inventory with load, and HP/SAN/EP maxima calculated automatically from class, NEX and attributes.
- A sheet that checks itself — every change is weighed against the rulebook (v1.3 and Sobrevivendo ao Horror): whatever is out of the rules or still pending shows up on the spot, and NEX gains, path abilities, Transcend, conditions and states apply on their own.
- Guided character creation — a 6-step wizard that enforces the rulebook (origin, class, attribute points and increases, skill quotas, Training Grade) and shows the final numbers before you commit.
- Tap to roll — skills roll
Xd20keep-best, attacks roll test + damage, crits and fumbles flagged. A quick-dice bar accepts2d6+3and the official sheet's/AGIsyntax. - 150-entry bestiary — threats from the books, named NPCs from the published campaigns, allies and extras, all as full stat blocks you import as NPCs in one tap.
- System catalog — all 81 rituals, the full 41-row weapon table and 278 powers/path abilities from both books, insertable straight into the sheet.
- Online table — sheets and rolls mirrored to the GM in ~2 s, a full-screen image board, and a live scene map with draggable tokens. No accounts: players join with a
ORDO-XXXXcode. - Offline by default — sheets live on the device (Hive), export/import as
.json. The online table is optional. - Runs anywhere — Android APK or installable PWA on iPhone, Android and desktop.
The app's interface is in Brazilian Portuguese, the native language of the system.
Bestiary & catalog
| Bestiary (150 entries) | Threat stat block | Abilities in table notation |
|---|---|---|
![]() |
![]() |
![]() |
| 81 rituals | Weapon table |
|---|---|
![]() |
![]() |
Online table
| Create or join | GM's table | Player's table |
|---|---|---|
![]() |
![]() |
![]() |
| Full-screen board | Live GM panel | Map library |
|---|---|---|
![]() |
![]() |
![]() |
Online-table screenshots are real: two live sessions on Firestore — the GM pushed an image and it opened on the player's screen; the published sheet and its rolls landed in the GM panel instantly.
- Player or NPC — the same sheet serves both. NPCs/creatures start in free mode and never go to the online table; the bestiary belongs to the GM.
- Free mode (GM) — the rules toggle in the app bar lifts the rulebook limits. Warnings still show, but nothing blocks: attributes up to 20, skills without quotas, any class/NEX combination. This is how you build creatures, NPCs and characters that have outgrown creation rules.
- 6-step creation wizard that enforces the book: identity → origin → class & NEX → attributes (4 points for agents, 3 for civilians; zero one attribute for an extra point) → skills (origin and class picks pre-checked; you choose
base + Intellect) → review. Each step unlocks the next only when complete, and the last screen shows HP/SAN/EP before creating. Starting above NEX 5% already grants that NEX's attribute increases (20/50/80/95%, up to 5 — up to 3 for the Survivor) and Training Grade (35/70%: veteran +10, expert +15), the path comes from the catalog, and everything is re-checked when you hit Create. After that the sheet is yours and everything becomes free editing. The same two toggles (type and rules) live on the sheet screen: promote a character to NPC, or lift the limits on an existing sheet, whenever you want. - Full sheet in 6 tabs — identity (class/origin/path/rank, nationality, age), NEX, attributes, HP/SAN/EP with auto-calculated maxima (class + NEX + Vigor/Presence, manual override), defense and movement with encumbrance penalty, the 28 skills with training grade, attacks (damage type, crit range and multiplier, reach, special), abilities, rituals, inventory with load (5×Strength) and per-rank item limits, proficiencies, and an About tab (backstory, appearance, first paranormal encounter, phobias, favorites, personality, worst nightmare, notes).
- Picking a class or origin fills the sheet — trained skills, proficiencies and the power/ability come in on their own, with confirmation. Switching offers to remove what the previous one left behind, and a Survivor becoming an agent keeps what they had (Special Training).
- Pending panel — at the top of the sheet (and as a badge in the app bar) everything that is out of the rules or still to resolve: attribute points, skill and grade quotas, path at 10%, powers per NEX, affinity at 50%, rituals per circle, load, rank item limits, proficiencies, stale manual maxima. Each change that creates a new one warns you right away.
- Automatic progression — raising NEX lists what each step gives (class power, path, attribute increase, Training Grade, versatility, affinity); current HP/SAN/EP follow the maxima keeping the damage already taken; path abilities enter and leave by themselves; each paranormal power counts as Transcend and removes that NEX's Sanity.
- Powers catalog — 278 powers and 27 paths (class, general, paranormal, path abilities) in table notation, with prerequisites checked; numeric effects (Defense, HP per NEX, skill bonuses, damage resistance…) apply automatically.
- States and conditions — wounded, dying (3-turn counter → dead), disturbed and going insane come from the resources; the book's 33 conditions apply their penalties to Defense, dice and movement without stacking equal effects; End of scene clears temporaries and conditions.
- Rules applied to rolls — encumbrance and heavy armor −5, missing proficiency −2d20, Strength on melee damage, threat range and multiplier read from the weapon, a crit button that multiplies only the weapon dice; temporary HP absorbs damage first and current values never go over the maximum.
- Casting rituals — spends EP, respects the EP limit, shows the DC and rolls the paranormal cost (Occultism DC 20 + cost; Fear rituals cost permanent Sanity).
- Optional rules — varied ages with age disadvantages, debilitating injuries (stacking on the same attribute) and Playing without Sanity (Determination points), per sheet.
- Table state — mark in combat / dead, and hide HP, Sanity or Effort from the GM panel when the character plays with a secret resource.
- Tap to roll — skills roll
Xd20keep-best (attribute 0: 2d20 keep-worst) + training bonus; attacks roll test and damage. Crits and fumbles flagged. The quick dice bar accepts2d6+3and the official sheet's/AGIsyntax. - Campaign bestiary — 150 ready stat blocks in 16 groups: the books' threats by element (Blood, Death, Knowledge, Energy), people and troops, animals, the named NPCs of Vendeta Oculta 1 & 2, Casos Paranormais and extra missions, plus the Order's allies and extras written for this table. A threat comes complete: VD (challenge rating), category and size, disturbing presence, senses, printed Defense and HP, resistances and vulnerabilities, block tests, every attack with the roll (
3d20+10) and damage, and what each ability does — in table notation. Import everything, one group or one entry; all come in as NPCs in free mode. Re-importing updates the same sheet instead of duplicating it. - System catalog — all 81 rituals (four elements + Fear, 1st to 4th circle) with cost, execution, range, target, duration, resistance, effect and the discente/verdadeiro upgrades; and the full weapon table (41 rows) with damage, crit, range, type and slots, plus armor. Look it up on the spot and drop it straight into the sheet: the ritual arrives fully filled, the weapon becomes an attack with the right skill, damage and crit.
- Local storage — sheets stay on the device (Hive), export/import
.json. No account.
- Create the table, read the code out loud (
ORDO-XXXX) and receive a recovery key. Players join by code, no account (anonymous sign-in). - Live sheets — a player publishes their sheet and everything they mark (HP, SAN, EP, conditions, inventory…) shows in the GM panel within ~2 s — from any tab, even after reopening the app — with combat, dead, dying, wounded, going insane and out of the rules badges, respecting whatever the player chose to hide. A sheet opened from the panel follows the player live too.
- Latest rolls — every roll made on a published sheet enters the table feed instantly: who rolled, what, the dice and the total.
- Image board — the GM sends an image and it opens full-screen on everyone's device: map, NPC portrait, clue. The gallery keeps the campaign's collection between sessions.
- Scene map — a separate live screen inside the table. Floor plans live in a map library of their own, separate from the board gallery: board images pop up in everyone's face, map plans stay up for reference. The GM uploads a plan, picks which one is in play and places tokens: published agents come in with their sheet portrait, bestiary NPCs come in with their crest, and you can add loose tokens (marker, hostage, door). Tapping a token opens size (0.4× to 3× — a Huge creature doesn't fit the same circle as an agent), threat mark and remove. Only the GM moves; players only watch, and whoever leaves the screen comes back to everything in place — positions live in Firestore, not on the device. The Firestore rules guarantee that, not just the UI.
The table architecture is shared with the Mago: A Ascensão app: Firestore + security rules as the single authority, images stored as base64 inside documents (no paid Storage), heartbeat presence, table recovery key.
gabesilvadev.github.io/fichario-do-outro-lado — works on iPhone, Android and desktop with nothing to install. On iPhone open it in Safari and use Share → Add to Home Screen to turn it into an app.
Download the latest APK from Releases and install it (allow "unknown sources" once). It is signed with the project's release key, so every new version installs over the previous one without losing your sheets.
No local Flutter install needed — everything runs through Docker:
docker compose up -d
docker compose exec flutter flutter pub get
# web with hot reload at http://localhost:8093
docker compose exec flutter flutter run -d web-server \
--web-port 8093 --web-hostname 0.0.0.0
# Android APK
docker compose exec flutter flutter build apk --release
# → build/app/outputs/flutter-apk/app-release.apk
# install / update on a phone with USB debugging enabled
docker run --rm --privileged -v /dev/bus/usb:/dev/bus/usb -v "$PWD":/app -w /app \
ghcr.io/cirruslabs/flutter:stable \
adb install -r build/app/outputs/flutter-apk/app-release.apk
# static web build (host the build/web folder anywhere)
docker compose exec flutter flutter build web --releasedocker compose exec flutter flutter testThe site at https://gabesilvadev.github.io/fichario-do-outro-lado/ is the build/web folder published on the gh-pages branch:
docker compose exec flutter flutter build web --release \
--base-href /fichario-do-outro-lado/
cd build/web && git init -b gh-pages && git add -A \
&& git commit -m "web build" \
&& git push -f git@github.com:GabeSilvaDev/fichario-do-outro-lado.git gh-pagesFor the online table to work on the site, the gabesilvadev.github.io domain must be listed under Authentication → Settings → Authorized domains in the Firebase console (one-time setup).
The ordem-paranormal-mesa project is up and wired to the app:
| Item | State |
|---|---|
| Firestore | created in southamerica-east1 (São Paulo) |
| Authentication | anonymous sign-in enabled |
| Security rules | published (the contents of firestore.rules) |
| Android app | com.gabesilvadev.ordem_paranormal registered (legacy internal id: changing it would force a clean reinstall and wipe on-device sheets) |
| Web app | registered |
| Credentials | lib/firebase_options.dart + android/app/google-services.json |
Nothing to do: creating a table in the app already writes to Firestore.
If you change the rules, republish them — from the console (Firestore → Rules → Publish) or the CLI (firebase.json and .firebaserc are in the repo):
npx firebase-tools login
npx firebase-tools deploy --only firestore:rules --project ordem-paranormal-mesafirestore.rules is the system's only security layer: only table members publish sheets, the owner writes their own and the GM reads it; rolls only in your own name; gallery and board are GM-only; the table key sits in a document nobody can read.
dart pub global activate flutterfire_cli
flutterfire configure --project=<your-project> --platforms=android,webThen enable Authentication → Anonymous, create Firestore and publish the rules in the new project.
The app is signed with its own key (android/ordem-paranormal.jks). Without it, Flutter signs releases with the debug key, which changes on every machine and container — Android then refuses the next install with INSTALL_FAILED_UPDATE_INCOMPATIBLE, forcing an uninstall that wipes the device's sheets.
With a fixed key, every new build installs over the previous one and players lose nothing. Bump version: in pubspec.yaml on each release (0.2.0+2 → 0.2.1+3).
key.properties and the .jks are in .gitignore: back both up. Lose the key and the only way out is publishing with a new one — and everyone has to uninstall before updating.
lib/
├── main.dart
├── theme.dart Ordem Paranormal theme (dark, purple/gold)
├── firebase_options.dart ordem-paranormal-mesa credentials
├── data/dados_op.dart classes (in code) + skills, origins,
│ ranks (assets)
├── models/
│ ├── ficha_op.dart the sheet (Map + HP/SAN/EP/load math)
│ ├── normalizar.dart repairs imported/old sheets on load
│ └── rolagem.dart dice engine (Xd20 best/worst, expressions)
├── regras/ the rules engine
│ ├── pendencias.dart what is out of the rules or pending
│ ├── efeitos.dart origin, powers, conditions summed up
│ ├── condicoes.dart the book's conditions and penalties
│ ├── poderes.dart powers/paths catalog model
│ └── opcionais.dart age, injuries, Determination
├── store/ficha_store.dart sheets in Hive + mirror observer
├── screens/
│ ├── home_screen.dart Sheets | Table tabs
│ ├── bestiario_screen.dart the ready cast (asset) → device sheets
│ ├── licenca_screen.dart seal, notices and privacy
│ ├── wizard_screen.dart creation wizard (6 steps)
│ ├── poderes_screen.dart pick a power from the catalog
│ └── ficha_screen.dart the sheet in 6 tabs, edit and read
├── widgets/ portrait, HP/SAN/EP counters, image viewer,
│ pending panel
└── mesa/ the online table
├── mesa_service.dart interface (contract = firestore.rules)
├── mesa_firestore.dart real implementation
├── sessao_mesa.dart mirror + presence alive in any tab
├── espelho_ficha.dart sheet → table with a 2 s window
├── ponte_rolagens.dart roll → table feed
├── ouvinte_mural.dart GM image opens by itself
├── imagem_mural.dart shrinks images to fit a document
├── ouvinte_mapa.dart new map opens on everyone's screen
├── codigo.dart ORDO-XXXX, readable out loud
├── chave_mesa.dart table recovery key
└── telas/ table tab, GM panel, gallery, board,
scene map (draggable tokens)
Only mechanics and names, no book text: 28 skills with base attribute, 26 origins (what each one trains and its power's effect), 5 ranks with per-category item limits — in assets/data/*.json — and the 4 classes with their HP/EP/SAN formulas per NEX, which live in code (lib/data/dados_op.dart): an asset failing to load would silently drop the maxima to the current value.
Powers and paths (assets/catalogo/poderes.json for the core book, poderes_sah.json for Sobrevivendo ao Horror) carry the effect in table notation plus a machine block (efeitos) the sheet applies by itself.
Power and ability effects are written in table notation — 2 PE → +5 em Ciências ou Investigação. 1×/cena. — authored here, not copied. The license allows the system's names and terminology and forbids reproducing book text; see LICENCA.md.
# 1. reads YOUR PDFs and extracts mechanics only
python3 ../../Ordem/App-Mestre/ferramentas/extrair_ameacas.py # threats
python3 ../../Ordem/App-Mestre/ferramentas/extrair_rituais.py # rituals
python3 ../../Ordem/App-Mestre/ferramentas/build_regras.py # weapon table
# output: Ordem/App-Mestre/dados/*-cru.json — LOCAL files, in .gitignore
# 2. merges those numbers with the hand-written text
# (ferramentas/notacao_ameacas.py and ferramentas/notacao_rituais.py)
python3 ferramentas/gerar_catalogo.py # rituals + weapons
python3 ferramentas/gerar_bestiario.py # bestiary (uses the catalog)The bestiary depends on the catalog: every caster comes with its rituals inside, one by one, with cost, execution, range, duration, DC and effect. That covers threats described by range ("all Death rituals up to 3rd circle" → the 15), by choice ("pick 2 of 1st circle" → the 24 possible, with a note to choose) and by closed list (the 6 rituals Giordano uses to escape in VO1). A test fails any entry that mentions casting and arrives without a list.
ameacas-cru.json contains book excerpts and therefore is not distributed; what ships in the app is numbers + original notation. A test checks entry by entry (test/bestiario_test.dart): every threat needs printed HP, Defense, category and at least one attack or ability, and every attack needs the roll it uses.
The formulas were checked against the official sheet at fichasop.com: a Combatente at NEX 35% with Vigor 3 and Presence 2 gives HP 65 · SAN 30 · EP 28 on both. test/regras_op_test.dart locks those numbers.
Fichário do Outro Lado is free fan content, made by a player for their own table, published under the Ordem Paranormal Community License v1.0 in the free fan content → virtual sheets for VTTs category. It is not an official product and has no partnership, approval or endorsement from anyone connected to Ordem Paranormal. The Ordem Paranormal universe belongs to Rafael "Cellbit" Lange.
Terms of use, credits, privacy (LGPD) and how each license condition is met: LICENCA.md.




















