Skip to main content
ChangelogDashboard

Changelog

Alle Versionen und Änderungen an Roster Raven.

v1.2.0
2026-10-30

OPR rules 3.6.0 support. Army Forge switched every army book to 3.6.0 on 2026-10-29 and only serves the current version, so Roster Raven now keeps 3.5.3 and 3.6.0 side by side: version slots per army, version choice on import, a rules version per match and tournament, and the 3.6.0 core rules in the Combat Calculator. 3.5.3 matches play exactly as before. Also new: melee morale in the Calculator, custom objective scoring and several scoring fixes.

Added
  • Rules version everywhere: every army, spell, match and tournament carries an OPR rules version. Armies imported before the update stay on 3.5.3 with their old points, stats and upgrades; new imports come in as 3.6.0. Spells are stored per version.
  • Version slots per army: an army can hold a 3.5.3 and a 3.6.0 list at the same time. Switch the active version on the army page. A missing version can be added by importing the updated Army Forge list into the same army, or by automatic conversion, which lists every unit, upgrade and weapon that could not be carried over (only about half of the 3.5.3 upgrade options still exist in 3.6.0). Photos stay with the army.
  • Version choice on import: the preview suggests a version from the list's save date (text exports use their header) and shows units and points of the chosen version. Old share links are hydrated from an archived 3.5.3 copy of the army books, so they import again. A list that is already in the app can be attached as a new version, replace one version, or become a new army.
  • Match and tournament version: match setup offers a rules version with a warning when the armies differ; each army plays with its slot for that version. Tournaments pin one version and only accept armies saved in it.
  • 3.6.0 rules in the Combat Calculator: Skirmish without the Wound Effect Table (Tough(X) kills at X wounds, morale like Full-Scale); Impact before melee; Counter optional and blocked while Fatigued; Brace; unmodified 6s of Fatigued units no longer trigger special rules; Parry dice before defense; Assault weapons usable in shooting and melee; Aircraft -1 to hit; Indirect without the moved penalty; new numbers for Artillery, Entrenched, Unstoppable, Disintegrate, Destructive, Shatter, Sergeant, Slayer, Ravage, Hazardous, Furious and the Lucky family; renamed rules (Fracture, Spell Resistance, Anti-Cover, Piercing Charge, Piercing Marksman and more) are recognized.
  • 3.6.0 casting: casting once per activation before attacking (warning with an explicit override) and Spell Amplifier +1.
  • Melee morale in the Combat Calculator: after a melee the side that took more wounds takes a Morale Test, with Fear per version, rout at half strength and No Retreat. This applies to every profile with morale, including 3.5.3 Full-Scale.
  • Rules reference per version: /rules has a 3.6.0 / 3.5.3 switch (3.6.0 by default); in-match rule texts follow the match version and use the official 3.6.0 core rule texts.
  • Demo Game for 3.6.0: 450 points per army in 3.6.0, 150 points in 3.5.3.
  • Custom objective scoring: the basic match setup now offers 1 to 6 objectives and a third scoring option, "Custom format", next to "Per round" and "End of game". Custom format sets your own VP for holding an objective each round, seizing it, objectives in the enemy deployment zone, holding it at game end, a majority bonus and a bonus when the opponent holds none. This covers mission cards and home-made formats without reproducing any paid mission text. Trigger: Reddit feedback asking for 1, 2 and 6 objectives and for "points for seizing, points for holding".
  • Deployment zones on objectives: when a format scores objectives in the enemy zone differently, each objective gets a zone toggle (Mid, side A, side B) below the tracker.
Fixed
  • Old share links import again: since the Army Forge update, lists saved before 2026-10-29 failed with "Unexpected data format" because the hydration used the 3.6.0 books. If units of a list do not exist in the chosen version, the error now says so.
  • Smaller match bundle: the rule database is no longer shipped to the browser on the match and rules pages.
  • No "Log in" tab while signed in: the bottom bar briefly switched to the guest tabs with "Log in" when the browser session was empty for a moment (for example while the access token refreshed). It now only switches to guest mode on an actual sign-out.
  • Tournament scenarios now score their printed values: Scenario 1 (2 VP per objective plus 2 VP majority), Scenario 2 (1 VP own zone, 2 VP enemy zone per round) and Scenario 3 (2 VP per objective plus 2 VP if the opponent holds none) were all counted as 1 VP per objective. The results and the VP synced into tournaments now match the mission text.
  • Bonus VP survive a reload and count everywhere: manual bonus VP were dropped when the match page was reloaded, could not be entered in end-of-game scoring, and were ignored when the home page, statistics and army pages decided the winner. They are now kept, available in every scoring mode, listed in the result breakdown and counted by one shared VP helper (src/lib/objective-scoring.ts).
  • Re-ending a match cannot double-count objectives: objective scores are now recomputed from the round history instead of being added up in place, so "Back to Match" followed by ending again always gives the same result.
  • AI difficulty now applies: the difficulty chosen when creating an AI match (Manual, Easy, Normal, Hard) was dropped when the match sheet loaded, so AI dice always rolled as Normal. The choice is now kept for the whole match. The in-match auto/manual dice toggle was not affected.
  • Army points match the imported units: for Army Forge lists with upgrades the current army book no longer knows, the army showed the point total Army Forge had stored (for example 400 pts) instead of the sum of the units actually imported (220 pts). Import preview and army pages now show the imported total; the "Incomplete" warning for those upgrades stays.
v1.1.1
2026-09-27

Patch after the trailer launch. Guests now see a public start page and the rules reference without an account, light mode loads without hydration errors, and the tactical grid is visible again. An audit of tester data since September uncovered four Army Forge import bugs, all fixed: grouped "2x" units and multi-faction lists in the text export, silently lost upgrades, and Caster values from upgrades.

Added
  • Public start page without an account: guests no longer land on the login form at / but on a landing page in the Feldkonsole style: claim, two actions (create account, open rules reference), trailer, then the match as the backbone of the page (import, deployment, rounds 1 to 4, result) with instrument excerpts from the real match sheet, an overview of tournaments, rules, team/FFA, demo game, PWA and statistics, a clear free vs. paid statement and a closing call to action. Signed-in users still see the cockpit. Trigger: Reddit feedback on the trailer launch ("without an account you can't see anything").
  • Click-to-load trailer: the YouTube video (youtube-nocookie.com) only loads after a click on a locally stored poster, no request goes to Google before that. The privacy policy now lists YouTube under "External services".
  • Rules reference without an account: /rules is reachable for guests (src/proxy.ts). The bottom nav shows guests only Home, Rules, Tournaments and Login instead of tabs that would have redirected to the login. The layout server passes a cookie-based guest hint so the bar is already correct on first paint.
Fixed
  • Light mode without hydration errors: the theme provider read localStorage in the useState initializer, so for light-mode users the sun/moon icon in the bottom nav differed from the server HTML on every page (React hydration mismatch). The state now starts server-identical as "dark" and picks up the stored choice after mount. An inline script in <head> sets the light class before the first paint so there is no dark flash (suppressHydrationWarning on <html>).
  • Tactical grid visible again: the page wrappers min-h-screen bg-page (38 places) painted opaquely over the Feldkonsole grid on body, so it had not been visible on any page since the design pass. The wrappers no longer have their own background. Overlays, sticky bars and input fields keep bg-page.
  • Import: "2x" units from the Army Forge text export: Army Forge merges identical units in the copied text into one line such as "2x Blood Pact Regulars [10] ... | 210pts", where size and points apply per copy. The parser created only one unit, so a test list was missing two units worth 335 points. Every copy is now imported separately, without "2x" in the name. The unit count in the list header is accepted in both counting styles.
  • Import: lists from several army books in the text export: with a header like "Havoc Brothers (v3.5.3), Saurian Starhost (v3.5.3)" a mixed name ended up as the faction in the database, and the spell lookup in the match found no spells for the casters. The first army book now counts as the faction.
  • Import: warning for upgrades that cannot be found: if a selected upgrade option matched no option in the army book Army Forge currently serves, its weapons, rules and points were dropped without notice. The import preview now shows an "Incomplete" badge and lists the affected units with a hint to save the list again in Army Forge (findUnresolvedUpgrades in src/lib/army-forge-hydrate.ts).
  • Import: Caster from upgrades adds up: upgrades such as "Enlightened Mage (Caster(1))" on a model with Caster(3) were stored as a second Caster rule, a second identical Caster(1) was dropped entirely, and spell tokens only used the first value. Caster now stacks per source like Tough and Transport, and a joined hero keeps its own value.
  • Import: text export stores short system codes: the text import now writes gf, gff, aof and aofs like the link import instead of grimdark-future and so on. The list ID stays unchanged, so re-importing an older list is still recognized as a duplicate.
  • Import page without hydration errors: the how-to box read localStorage during server rendering, so every first visit to the import page caused a React hydration mismatch. It now reads its state in the browser via useSyncExternalStore and can be dismissed for the current visit even when storage is blocked.
v1.1.0
2026-09-16

First release after the stable release. The Feldkonsole design pass is finished on every surface (match creation, live join, onboarding, auth), tablets in landscape show both armies side by side, light mode runs entirely on theme tokens, and a full audit of all 432 rules in the rule database wired up 49+ combat rules that were not connected before. Plus four fixes that had only lived on a release branch: weapon replacements on import, photo upload and delete without a database timeout, upload progress, and the Ko-fi documentation.

Added
  • Progress display for unit photo uploads: the upload shows real percentages instead of an indeterminate waiting state, with its own phase for compressing before the upload.
  • One-click return to the running match: once an active match has been opened on the device, the bottom nav shows a green "Back to match" bar with the match name on every other page (Rules, Armies, Stats, Tournaments, Home) that leads straight back to the table. The hint lives only in localStorage (rr-active-match), never becomes part of the MatchState or a live session, disappears when the match is finished or deleted, and expires on its own after 24 hours without a visit.
  • Dual-army view for tablets in landscape: from 1024px width the match view (classic and team) shows both armies side by side instead of tabs. The focused column is fully interactive ("Active" badge), the other serves as a read-only reference ("Reference" badge) with full stats, weapons and rules. Solo players switch focus by clicking the column header, in online matches the focus stays fixed on your own side. Below 1024px (phone, tablet in portrait) the existing tab view is unchanged, and FFA keeps its tab navigation.
  • Rule coverage wave (Combat Calculator): full audit of all 432 rules in the rule database against the in-game wiring, followed by five fix packages:
Changed
  • Wide-screen layout for home, army overview and army detail (from 768/1024px): the three routes were capped at 512px while the match view goes full width from 1024px. Home: container up to 1024px from lg, Battle Report and Armies side by side in two columns from lg (a missing section takes the full width), Quick Actions go from 2 to 4 columns, Command Deck and status bar stay full width. Army overview: two-column card grid from 768px, wider container from 1024px, the empty state stays single-column and centered. Army detail: units in a two-column grid from 1024px, like the dual-army view. Below 768px nothing changes.
  • Feldkonsole design pass (phase 4: match creation, join flow, onboarding, auth): army picker with mode choice as console tiles with mono label and square LED, army cards with a left status rail and selection LED, all start CTAs as notch buttons in display type with dark text on a color fill, help popovers as bracket panels, and a square beginner checkbox. Live join flow (1v1 and FFA): top bar with live session label, title in display caps, host and roster panels with corner brackets and ready LEDs, join as a notch CTA. Waiting lobbies replace the round spinner with a pulsing square LED (respects prefers-reduced-motion). Onboarding: welcome wizard with segment tracker, section index ("01 //") and notch CTA, language prompt and username dialog as bracket panels with LED selection. Auth pages: wordmark in display type like on the home page, form in a bracket panel, submit as a notch. Account menu with a drawn person icon instead of a Unicode glyph. The hardcoded own-match hint on the join page now uses locale keys (de/en).
  • Emoji and dingbat cleanup (Feldkonsole): the last emoji and dingbat glyphs in the match view (dice, wind, sparkle, burst and shield emoji in the spell modals, crossed swords on the attack buttons and the calculator toggle, the flag at mission and side missions, the lightning bolt for open effects, stars on the Shaken toggle) are replaced by stroke SVG icons in the console style or a square LED (src/components/icons/console-icons.tsx). Decorative sparkle glyphs are hidden from screen readers, and plain close buttons now carry an aria-label.
  • Feldkonsole design pass (phase 3: remaining surfaces and FFA): Combat Calculator with modal titles in condensed display, hit and wound readouts in display type, all primary CTAs as notch buttons with dark text on teal, and modifier toggles with a square LED. All page top bars (Armies, Import, Stats, Rules, Tournaments including Organizer/Register/Tables, Changelog, Legal) and page headlines consistently in condensed display uppercase, stats tiles in display type, and standard accent CTAs app-wide in the notch style. FFA view: side color rail on the left of unit cards (red destroyed, green activated, otherwise the player color), square active LED with glow, headlines, scores and player banners in display type. The hardcoded "left" in the side tab is replaced by the new locale key ffa.leftShort (de/en).
  • Feldkonsole design pass (phase 2: match view): unit cards in the match now carry a colored status rail on the left (green activated or activating, red wound roll or destroyed, violet Shaken), the activation LED and wound pips are square in the console style, and the crossed-swords placeholder glyph is replaced by an SVG. The round counter shows a segment tracker (filled blocks per round, current round with glow) in a corner-bracket panel. The sticky score bar shows army names in condensed display with the side color as a top edge (teal for side A, violet for side B, consistent with the objective colors), and the army tab switcher uses the same active indicator as the bottom nav. Contested objectives show a multiplication sign instead of the crossed-swords dingbat (emoji fallback risk on Android). Unit cards on the army detail page get stat readouts in display type with column dividers.
  • Feldkonsole design pass (phase 1): Raven Command gets its own tactical form language instead of the generic web app look. Global: all corners sharp (Tailwind radius tokens set to 0, rounded-full stays for LEDs and avatars), a subtle tactical grid as page background, a teal signal line at the top of the screen, new fonts (Big Shoulders as display font for headings and wordmark, IBM Plex Mono for data and labels, both self-hosted via next/font), section headers in condensed display with an optional section index (02 //), and new utilities .brk (corner brackets) and .notch (chamfered CTA corner). Home dashboard: Command Deck as a console panel with header bar, readout strip (matches, active, armies) and notch CTA, Battle Report and Armies as grouped panels with a status rail instead of single cards, Quick Actions as bracket tiles with SVG icons. Bottom nav: stroke SVG icons instead of Unicode glyphs, active tab with an accent top edge and gradient, mono labels, theme toggle with a drawn sun/moon icon. Dark and light mode tuned together.
  • Rules in the bottom nav instead of the guide toggle: the rules reference (/rules) is now its own tab in the bottom nav and reachable at any time, even mid-match. The old permanent "Guide" toggle was removed from the nav. The beginner guide is now an opt-in option at match creation (checkbox above the army choice, for all modes except demo, which has its own coach). The choice is frozen per match on first open (beginner-mode-{matchId} in localStorage, like the match notes), so starting a later game with a different setting no longer changes running matches. As before it is purely local, never part of the MatchState and never broadcast in live sessions.
Fixed
  • Combat Calculator: Good Shot and Bad Shot work, hit/AP/defense modifiers stack: printed Good Shot (+1 to hit when shooting, 12 occurrences in the army books) and Bad Shot (-1, 2 occurrences) had no consumer in the Combat Calculator and did nothing. They now apply in the shooting branch, like Good Fighter in melee. Bad Shot goes through the penalty path so Unstoppable ("ignores all negative modifiers to this weapon") cancels it like any other penalty. On top of that, the modifier readers returned on the first matching effect: a +1 buff and a -1 debuff on the same unit never cancelled out, two Piercing marks did not stack, and two Defense debuffs counted once. Attacker hit, target mark hit, target mark AP and defense debuff now add up all matching effects, in the normal attack and in Strike Back, and show each effect with its own label in the modifier list. The selection and sign logic lives as pure functions in src/lib/effect-modifiers.ts with its own tests (npm run test:effect-modifiers).
  • Rule text: `Quick Shot` is not a hit bonus: the curated fallback text claimed "+1 to hit when shooting". Officially the rule reads "This model may shoot after using Rush actions" in all four systems. Rule and aura text corrected.
  • Import: weapon replacements with plurals ending in `-es` work again: the name normalization stripped es at the end of a word, turning "Firepowder Rifles" into firepowder rifl, which never matched the weapon "Firepowder Rifle". Replace upgrades on every weapon whose singular ends in -e failed: the old weapon stayed and the replacement kept a count of 1 instead of inheriting the count of the removed weapon. Now only a single s is removed.
  • Unit photos: upload and delete no longer hit the database timeout: the units table carries several OR-combined RLS policies (owner, shared match, tournament, organizer), and PostgreSQL evaluated their subqueries even when reading a single own row, which blew the statement_timeout. The route now checks ownership explicitly via unit, army and user ID with two primary key lookups.
  • Light mode: match view and Combat Calculator use theme tokens throughout instead of fixed Tailwind colors: 346 raw palette colors (red/green/amber-*) in the match view, Combat Calculator, FFA view and tournament surfaces switched to raven-red/raven-green/amber. All 10 hover:text-white (unreadable on light backgrounds) switched to hover:text-ink. text-white on teal CTAs switched to command ink, and on tinted chips and highlights to text-ink (saturated violet/red fills and photo overlays deliberately stay white). Modal overlays moved from bg-black/NN to bg-page/NN, hardcoded press and hover hex values to active:bg-active and hover:text-accent/80, and two double-encoded close/check glyphs in the restore flow were repaired.
  • Hydration error with German language fixed: client components were always rendered in English on the server and switched to the localStorage language during hydration, so every page view with German selected caused a React hydration error and a full client re-render. The root layout now reads the cookie locale and passes it as initialLocale to the LocaleProvider, which adopts it hydration-safely via useSyncExternalStore (localStorage wins after mount so accounts from before the cookie keep their stored choice, including a one-time cookie migration). <html lang> now carries the actual language instead of a fixed en.
  • FFA view respects light mode: hardcoded dark hex values (cards, borders, text colors) in the FFA view replaced by CSS variables, and hover:text-white (unreadable on light backgrounds) by hover:text-ink. The six player identity colors deliberately stay fixed, they work on both themes.
  • Read-only view is really read-only: in online matches guests could remove or toggle the opponent's active effects and flip Limited weapon markers. The effect buttons and the Limited toggle are now bound to the control permission, and the information stays visible.
v1.0.0
2026-08-18

First stable release. Roster Raven is battle-tested after the 2026-07-04 tournament field test, and the Ko-fi monetization layer goes live: one-time **Raven Supporter** (player-premium for life) and **Organizer** unlocks plus a 12-month **Cloud Pass**, all via Ko-fi Shop items mapped by buyer email. The core loop — Army Forge import, match tracking and the Combat Calculator — plus all rules and correctness stay free for everyone. Every account created before this release keeps lifetime Supporter + Cloud for free.

Added
  • Entitlements backbone (M0) + Ko-fi webhook (M1) — new entitlements table (supporter/cloud/organizer) with RLS, has_entitlement() helper and a kofi_events audit log; POST /api/kofi/webhook verifies the Ko-fi token, maps Shop Orders to Supporter/Organizer unlocks and Memberships to the Cloud entitlement by buyer email, idempotent per message. The Cloud Pass is a 12-month shop item (early renewals extend the running period). Requires KOFI_VERIFICATION_TOKEN, KOFI_SUPPORTER_CODES, KOFI_ORGANIZER_CODES, KOFI_CLOUD_CODES env vars.
  • Free-tier limits (announced with 1.0, cost-coupled) — free accounts keep up to 5 armies (enforced via RLS insert policy; existing armies above the limit stay fully usable) and unit photo uploads require the Cloud entitlement (existing photos stay visible and deletable). Friendly localized messages in import, army duplication and unit photo upload. Grandfathering: every account existing before the migration gets lifetime Supporter + Cloud for free.
  • Language prompt on first visit — instead of assuming German, a one-time prompt asks for the interface language and stores the choice in localStorage. It renders nothing server-side, so no flash appears in the HTML. Signed-in users change the language in their profile from now on; the footer toggle stays available for guests on public pages, where no profile exists.
  • Quick attack in the match view — a shorter path alongside the full attack flow.
  • Army Forge share-link hint on import — explains the known Army Forge behaviour where older share links keep returning stale API data after list changes, including the two ways out (duplicate the list, or use Share as File).
Changed
  • Match unit list sorted by points (descending) — units in the match view are now ordered from most to least expensive, so heroes and heavy hitters sit at the top instead of following the Army Forge import order. Applies to classic, team and FFA matches. In team matches the army grouping stays intact: units are sorted by points *within* each army, so the army sub-headers keep working. Reserve/Ambush units keep their previous order, and the sorting is purely visual — wound, heal and kill actions still target the correct unit.
  • Default locale is now English — follows from the new language prompt: DEFAULT_LOCALE and the translation fallback chain switched from German to English. Users with a stored preference are unaffected.
  • Legal pages updated for commercial operation — Impressum and privacy policy now name Gladrex Interactive – Alexander Kreitner (Einzelunternehmen) as the operator instead of the private person, note the absent commercial register entry and VAT ID (§ 27a UStG), and use hello@gladrex.com as contact. The cited law was still the TMG, which was replaced by the DDG in 2024 — references are now § 5 DDG and §§ 7–10 DDG.
  • "Log action" is now "Resolve attack" — the label describes what the button actually does. Leaving a running battle asks for confirmation; the last state is stored locally and is not lost.
  • Service worker cache bumped to `roster-raven-v4` — public PWA assets changed since v3; without the bump installed clients keep serving the old cache.
  • Hero/parent rule dedupe extracted — the logic that de-duplicated Hero/Tough when merging joined heroes with their parent unit moved out of save-army.ts into dedupeJoinedHeroParentRules in army-rule-normalizer.ts, next to the other normalizers and now covered by tests. Additional regression tests for the hydrate paths.
Fixed
  • Locally unsynced match progress is no longer overwritten on re-entry — mounting the match route called saveMatchSnapshot and wrote the server state over a potentially newer local one, which mattered after offline progress. initializeMatchSnapshot still refreshes metadata every time, but leaves state and savedAt untouched while the existing snapshot is marked dirty; only a clean snapshot is replaced outright.
v0.9.8
2026-07-04

Tournament-day release: pre-event hardening plus fixes and improvements driven directly by live feedback from the 2026-07-04 tournament.

Added
  • Live objective bonus VP — manual bonus VP (e.g. Scenario 4 kills near objectives) can be tracked live during a match; they count toward the running and final score and flow into tournament result sync.
  • Solo tracker for drop-in matches — players can start a solo tracker for their own army from the tournament match view when facing a walk-in opponent who doesn't use the app.
  • GF/GFF ranged rules wired into combat — Targeting Visor / Cyber-Eyes (+1 to hit shooting over 9") and Sturdy / Safety Gear (+1 Defense vs shooting over 9") now apply in the Combat Calculator (normal and Rending/AP-on-6 defense paths) and are mirrored in the Manual Log; Darkborn / Shadow Operative added to shrouding reminders; morale tests surface Banner, Musician, Hold the Line and War Chant hints alongside Fearless/Hero. Both German and English.
Changed
  • Combat Calculator enabled by default — the toggle now starts enabled, and Quality/Defense stats on unit cards are larger and accent-colored so they are not overlooked.
  • Standings tiebreaker order is now TP → VP → DP → SoS — standings table columns reordered to match.
  • Tournament description collapsed by default — the public tournament view collapses long descriptions so pairings and standings stay above the fold.
  • Army lists hidden from other participants while registration is open — on the public tournament page, registered players' army lists are only visible to the organizer and to the player themselves while registration is still open. Other participants see the player name but not the list, preventing pre-event scouting of opponents' lists. List data is withheld server-side, so it never reaches the page payload. Lists become public for everyone once registration is closed (and stay public while the tournament is running or finished). Both German and English.
  • Confirmation prompts for irreversible organizer actions — "Finish tournament", "Force complete round", and "Mark as dropped" now ask for confirmation before they run. Guards against an accidental tap finishing a tournament on the day — finishing is irreversible and permanently blocks all further result corrections. Both German and English.
  • Service worker cache bumped to `roster-raven-v3` — forces installed PWAs to purge stale cached assets (app shell, icons, manifest) and re-fetch on the next deploy, so attendees don't run an outdated build at the tournament.
Fixed
  • Withdraw registration now actually works — withdrawing from a tournament had no effect: the button showed "Withdrawing…" and then returned to the unchanged registration view. The tournament_players table had no row-level-security DELETE policy, so the delete silently removed zero rows without an error. Added DELETE policies (player can withdraw their own registration before the tournament starts; organizer can remove players from their own tournament) and made the server action surface a real error instead of a silent success when no row is deleted.
  • Lucky Boost over 9" — when a model with Lucky shoots or charges an enemy over 9" away and also has Lucky Boost, Lucky's extra hits now trigger on unmodified 5-6 instead of only 6. The over-9" toggle now appears for this case in both shooting and melee charge, with a reminder banner in the Combat Calculator.
  • Tough(X) Wound Effect knock-out threshold — a model with Tough(X) is now only Knocked Out on a Wound Effect total of 5+X (e.g. 8 for Tough(3)) instead of a flat 6.
  • Standings player names truncated — the standings grid gave the name column only ~64px, so names showed as "Ayc…"; stat labels moved into a single header row and columns tightened, giving names ~90px more room, with full names on hover.
v0.9.7
2026-06-25

Combat rule accuracy pass driven by a full audit of all 433 rules in the database. 49+ previously unhandled combat-affecting rules now surface as hit/AP modifiers, manual log hints, or cross-unit state — reducing the gap between app and rulebook before the 2026-07-04 tournament.

Added
  • Rule coverage audit tool (npm run audit:rules) — scans all 433 rules across AoF/AOFS/GF/GFF databases against 19 gameplay source files, alias-normalizes duplicates, and reports confirmed references vs. potential gaps. Available as a maintainer script.
  • Hit modifier rules wired — Good Fighter (+1 to hit in melee), Melee Evasion (-1 vs melee attackers), Machine-Fog / Screened (-1 over 9"), Buccaneer variants (shoot-over-9 penalty on target), Changebound Boost (melee hit bonus) now apply to attack and strike-back hit rolls in the Combat Calculator.
  • AP bonus rules wired — Piercing, Ranged Slayer, Melee Slayer (vs Tough 3+), and several conditional over-9"/charge AP rules now contribute to the attacker's AP in the Combat Calculator.
  • Unpredictable family unified — Unpredictable, Unpredictable Fighter, and Unpredictable Shooter each apply the correct scope-gated AP + hit-target penalty in attacks and strike-back, with a visible reminder banner in the Manual Log.
  • Heavy Impact recognized — previously generated 0 dice; now heavyImpactRating() detects the rule, adds correct Impact dice and applies AP(1) on Impact hits in defense. Manual log surfaces the combined Impact hint (Impact + Heavy Impact).
  • Vengeance marker tracking — when an enemy Vengeance unit is destroyed, the killing unit gains VEN×N markers (N = models of the destroyed unit). Enemies attacking that unit get +N to hit (lower hit target, minimum 2+). Amber VEN×N badge on unit cards with tooltip. State persists in UnitState.vengeanceMarkers across rounds and live sessions.
  • Aura-granted Counter bug fix — Counter phase now triggers when the rule is granted via an active aura/buff effect, not only when printed on the unit directly.
  • Manual log: Ravage hint — the Manual Log now shows Ravage rating and expected wound bonus when the attacker has Ravage.
  • Manual log: conditional AP hints — Melee Slayer, Shatter, and Tear trigger a hint when attacking a Tough(3)+ target, reminding the player to apply conditional AP before wounds.
  • Manual log: extra-hit/attack reminders — Sergeant (extra hit on 6 in melee), Brutal Fighter (extra hit on 6 melee), Relentless / Point-Blank Surge (extra hit on 6 shooting), Predator / Predator Shooter (extra attack roll on 6) added to the "roll extra" hint block in the Manual Log.
  • Manual log: target defensive reminders — Fortified, Guarded, Entrenched, Versatile Defense, Fortified Growth, and Defensive Growth now surface defensive reminders before final wound entry.
  • Manual log: activation-choice buff hints — Versatile Attack and Watchborn remind the player to pick attack or defense mode before resolving the roll.
  • Manual log: attacker conditional reminders — 11 rules (Precision Frenzy Growth, Ambushing Piercing Shot, etc.) now generate per-attack reminders when their condition may apply.
  • Grounded Precision / Grounded Stealth — added to GROUNDED_TERRAIN_RULES with correct mechanic types (hit / defensiveHit) so they surface correctly in terrain-condition reminders.
  • Scrapper defense reroll 6 — added to DEFENSE_REROLL_SIX_RULES; Manual Log includes the reroll reminder.
Fixed
  • Ignores Cover via active aura — attackerIgnoresCover() now checks active buff effects in addition to printed weapon/unit rules; aura-granted cover-ignore no longer leaves players with incorrect defense AP.
  • Tournament army list: weapon duplication — units with both weapons and loadout fields no longer show duplicate weapon entries; unitWeapons() prefers loadout when present.
  • Tournament army list: ArmyBookItem container names — weapons nested inside ArmyBookItem containers (e.g. "Horde of Rats" wrapping "Sling") now show the actual weapon name instead of the container label.
  • Tournament army list: base cost vs. total cost — unit cost now includes selected upgrade costs (collectSelectedUpgradeCost), matching the displayed cost in Army Forge.
  • Predator / Predator Shooter — added to EXTRA_ATTACK_ROLL_RULES with correct attackScope so the extra-attack-on-6 path handles melee-only and shooting-only variants correctly.
v0.9.6
2026-06-22

Beginner Mode, Searchable Rule Reference, and Rule Database populated from all four OPR systems. Helps new players learn OPR at the table; gives every player quick access to exact rule text without leaving the app.

Added
  • Beginner Mode — global toggle in the bottom nav (text pill, turns green when active). When enabled, a coaching panel appears during unit activation showing the four core OPR actions (Hold / Advance & Shoot / Rush / Charge) with a role-based recommendation derived from the unit's weapon loadout (melee → Charge, shooting → Hold/Advance & Shoot, hybrid → both). Works in classic, team, and FFA matches. State is localStorage-only and never broadcast to opponents in live sessions.
  • Searchable Rule Reference (/rules) — page aggregating all app-known special rules from AoF, AOFS, GF, and GFF, searchable by name or description. System filter chips narrow results to one game system. Core actions are pinned at the top. Linked from the home dashboard and the beginner coaching panel. Now backed by the full rule database: 522 rules, faction-specific aura text, and army-book exact descriptions.
  • Rule Database populated — all four OPR systems — army-book JSON for all 186 official armies (GF 47, GFF 53, AoF 40, AOFS 46) extracted and merged into the rule database: 1782+ faction rule occurrences for AoF/AOFS; 282 GF spells and 318 GFF spells; 400 aura entries across AoF/AOFS; GF/GFF rules catalog extended to 355/353 entries with exact effect text. Reproducible pipeline: scripts/Download-OPR-ArmyBooks.ps1 → scripts/extract-rules.mjs → scripts/merge-rule-database.mjs.
  • Home dashboard: Rule Reference quick action — direct link to /rules on the command cockpit.
  • Guided AOFS 150pt Demo Game — teaching mode for exactly two Age of Fantasy: Skirmish armies at 150 points. Coach cards explain the first activation for each side, the four base actions, first shooting, first melee and Strike Back, first Shaken/Fatigued state, and the first round change.
Fixed
  • Scrollbar layout shift — toggling the beginner panel (or any content that crosses the viewport-height threshold) no longer causes a horizontal jump. scrollbar-gutter: stable on html permanently reserves scrollbar space app-wide.
  • Beginner toggle active state — replaced emoji icon (whose color CSS cannot target) with a styled text pill matching the locale toggle; turns teal-green with a filled background when enabled.
v0.9.5
2026-06-18

Community-feedback polish and Solo/Co-op AI improvements from real table testing. This release makes combat tracking smoother, reduces app/book switching, and makes Solo AI more complete.

Added
  • Minimizable Manual Log — the combat log entry flow can be collapsed instead of cancelled, allowing players to check unit cards, weapons, and rules mid-attack.
  • Clickable rule tags in Manual Log — relevant unit and weapon rules are shown during combat logging and open their rule text/reminders, including rules such as Rending, Deadly, Crack, and Purge.
  • AI spell-cast auto-rolls — AI casters automatically roll their spell-cast die when AI dice are enabled, using the selected AI difficulty. Manual mode keeps the roll player-controlled.
Fixed
  • Embarked activation no longer forces disembark — activating a transported unit keeps it embarked until the player deliberately disembarks it.
  • Reserve/Ambush deployment flow hardened — deployment controls more reliably persist units as deployed instead of leaving them hidden in match state.
  • Combat Calculator labels — duplicate units retain their [A] / [B] match labels, and Shaken/Fatigued statuses appear directly in combat-flow unit names.
Improved
  • Solo/Co-op AI consistency — AI dice automation now covers both combat and spell casting, reducing manual bookkeeping.
  • Manual combat clarity — the log surfaces the unit and weapon rule information needed while resolving attacks.
v0.9.4
2026-06-01

Tournament hardening continuation plus rules-accuracy additions. Focused on pre-tournament readiness for 2026-07-04.

Added
  • Player self-withdrawal — players can now withdraw their own registration during registration_open from the public tournament page. A red button appears in the registration status card; the record is deleted and the slot opens up.
  • Opponent submission hint — the result form now shows a teal notice when the opponent has already submitted a result and is waiting for the other side, prompting them to enter their own version.
  • Army system filter on registration — the army picker on the registration page now only shows armies compatible with the tournament's game system. Incompatible armies are hidden with a note; an error state is shown if no compatible army exists yet.
  • More clickable rules + combat integration — army-book buff abilities (Casting Buff, Defense Buff, Precision Shooter Buff, Fortification Buff, and any … Buff rule such as Cursed Undead Boost Buff) now show their reminder text on tap, with descriptions matching the exact Army Forge wording. Weapon/unit rules Aircraft, Ignores Cover, Anti-Tank, Hard to Hit (Hard-to-Hit), and Camo Netting are now described and wired into the combat calculator: Ignores Cover skips the cover AP bonus, Hard to Hit/Camo Netting apply the over-9" -1-to-hit Stealth penalty, and Anti-Tank flags non-Tough targets as invalid in the target picker.
  • Spell tokens modify the cast roll — spending nearby caster tokens in the cast popup now applies +1 to the cast roll per token (per the OPR rule), shows the running bonus, and records the modified result. The dice buttons highlight the effective target.
  • "Once per activation" abilities prompt on activation — activating a unit now surfaces the unused-ability popup for any once-per-activation ability, including … Buff abilities (e.g. Precision Shooter Buff, Defense Buff, Fortification Buff) where you can immediately pick the friendly target within 12", plus non-targeted once-per-activation reminders. Breath Attack is excluded as it keeps its dedicated flow.
Fixed
  • `TournamentResultForm` dead `myRole` prop — the prop was declared in the type but never used; removed to keep the interface clean.
  • Error banner on public tournament page — query-param errors (e.g. from a failed withdrawal) are now surfaced as a red banner at the top of the tournament card.
  • Casting Buff is a buff — applying a … Buff ability now defaults to your own side (not the enemy), and an active Casting Buff on a caster lowers its Roll to Cast threshold by 1 (e.g. 4+ → 3+).
  • Caster Group no longer mistaken for a targeted effect — the targeted-effect detector now requires an explicit friendly/enemy target, so passive mechanics like Caster Group's group-caster selection no longer prompt on activation.
Internal
  • tsc --noEmit passes cleanly with zero errors.
v0.9.3
2026-05-31

Tournament-Day Hardening release. Focus on dispute resolution visibility, type correctness, and pre-tournament code confidence.

Added
  • Dispute visibility in organizer dashboard — when a tournament match has conflicting player submissions (result_status = "disputed"), the organizer now sees an amber banner above the result form showing exactly what each player submitted (result type, DP, VP) so disputes can be resolved at a glance.
  • i18n: `tournaments.organizer.disputedTitle` — new key in DE/EN for the amber dispute header.
Fixed
  • `editTournamentAction` null guard — server action now includes an explicit early-return for the rare case where the tournament row is null inside the closure, eliminating the TypeScript false-positive and matching the outer notFound() guard.
  • `submitPlayerResult` computed-key type error — replaced [updateCol]: cleanedSubmission (computed string key) and Record<string, unknown> spread with explicit conditional submission fields so Supabase's strict update type accepts the payload without index-signature conflicts.
  • `tournament-actions.ts` string→union type casts — mapTournament, mapTournamentPlayer, and mapTournamentMatch now explicitly cast raw DB string columns to their domain union types (TournamentSystemType, TournamentStatus, TournamentVisibility, TournamentPlayerListStatus, TournamentMatchStatus, TournamentResultType). Redundant Record<string, unknown> hacks removed for columns that are now present in the freshly regenerated types.
  • `syncLinkedMatchResult` stale `db` reference — renamed to supabase after the previous as any cleanup commit.
  • `createTournamentMatch` stale `as any` — tournament_match_id is now present in the regenerated Supabase types; the eslint-disable and as any cast removed from match-actions.ts.
  • `submitPlayerResult` missing null guard — added explicit check for player_a_id / player_b_id being non-null before querying tournament_players.
  • `canUpdateTournamentRegistration` type mismatch — existing.list_status now cast to TournamentPlayerListStatus at the call site.
  • `TournamentSystemType` and `TournamentMatchStatus` missing imports — added to the tournament-actions.ts import block.
Internal
  • tsc --noEmit passes cleanly with zero errors across all tournament and match files.
v0.9.2
2026-05-23

Major rules-accuracy, import, and UX release from real-device feedback, community bug reports, and continued combat calculator hardening.

Added
  • Toggleable active effects — buffs and debuffs on unit cards can now be temporarily disabled (●/○ toggle) without removing them; disabled effects are excluded from all combat calculator and manual log calculations while remaining visible with strikethrough styling.
  • Nearby caster token management — the spell cast popup now shows all friendly casters with their current token counts, and allows directly spending or restoring tokens via +/− buttons without leaving the cast flow.
  • Army Forge import fallbacks — import now accepts Share-as-File JSON and pasted JSON text, and hydrates raw Army Forge save data from the Army Book when Share links are stale after list edits.
  • Mask-safe PWA icons — Android/Apple install and splash assets now use a centered raven-shield mark instead of the wide wordmark.
  • Vercel Web Analytics — production usage analytics are installed alongside Speed Insights.
Changed
  • Upload performance — army and unit photos are compressed client-side before upload and displayed through Next Image Optimization.
  • Route performance — public/static routes bypass the auth proxy where safe, dashboard counts are lighter, and match-detail photo/spell fetches run in parallel.
  • Combat wording — on-6 and Defense-1 labels now explicitly say unmodified/natural results so modifier-aided hits are not confused with trigger rolls.
Fixed
  • Army Forge weapon replacement upgrades — replace-variant upgrades now use fuzzy singular/plural target matching (e.g. "Gatling Cannons" removes weapon "Gatling Cannon"), and propagate the removed weapon's count to the replacement gain so multi-model units get correct weapon counts.
  • Army Forge text export hero import — the text-export parser now correctly handles | Joined to: blocks, splitting hero and parent units with proper joinToUnit/selectionId linkage instead of skipping them.
  • Army Forge import validation — malformed Share URLs now show the specific invalid-link message instead of the generic missing-source fallback.
  • Samsung/Android splash crop — the PWA manifest no longer uses the wide logo as the maskable icon, preventing the Roster Raven wordmark from being cut off during app launch.
  • Hit & Run Fighter Aura — pre-game aura setup now grants Hit & Run Fighter with the correct in-game reminder: after being in melee, the unit may move up to 3".
  • Mobile aura text overflow — expanded aura/effect descriptions now wrap inside narrow Android viewports.
  • Skirmish Wound Effect overkill — Wound Effect rolls now include overkill wounds when a hit exceeds the target model's Tough threshold.
  • Manual Log defensive target reminders — targets with Stealth, Evasive, Shielded, or defensive AP-reduction rules now surface reminders before final wound entry.
  • Manual Log damage-rule reminders — attacks with Deadly, Blast, or Hazardous now remind players to account for wound multiplication, hit multiplication, AP(4), and self-wounds before entering final wounds.
  • Manual Log Poison/AP-on-6 reminders — attacks with Poison, Rending, Crack, or Destructive now remind players to resolve auto-wounds or separate AP-on-6 defense pools before entering final wounds.
  • Manual Log hit-6 reminders — attacks with extra-hit or extra-attack-on-unmodified-6 rules now remind players to include those rolls before entering final wound totals.
  • Manual Log Defense-1 reminders — attacks with Shred, Warbound, Destroyer, Infected, Badlands Hunter, or melee Bloodthirsty Fighter now remind players to account for unmodified Defense 1 effects before entering final wounds.
  • Manual Log Defense-6 reroll reminders — attacks with Bane, Bane when Shooting, Lacerate, Bestial, or Mischievous now remind players to re-roll unmodified Defense 6s before entering wounds, including scope-aware shooting-only handling.
  • Manual Log Regeneration ignore — attacks with Bane, Bane when Shooting, Crack, Destructive, Disintegrate, Lacerate, Rending, or Unstoppable no longer offer Regeneration wound-ignore counters in manual logs.
  • Combat Calculator Strike Back Evasive/Unstoppable — Strike Back attacks now apply the original target's Evasive hit penalty, while Unstoppable weapons ignore negative hit modifiers such as Evasive, Stealth, Indirect moved penalties, and hostile hit debuffs.
  • Combat Calculator Strike Back Limited weapons — Strike Back now disables already-used Limited melee weapons and marks Limited weapons as used once they are selected for Strike Back, even if the attack causes no hits.
  • Combat Calculator impaired melee lock — Fatigued/Shaken melee attacks now stay locked to 6+ even when the selected weapon has Reliable, Precise, or other hit bonuses.
  • Combat Calculator aura-granted defense rules — Stealth/Evasive modifiers and Stealth/Regeneration target badges now also respect active aura/effect grants, not just printed unit rules.
  • Combat Calculator Impact after Counter — Impact dice now use the charger's surviving model count after Counter casualties instead of the pre-Counter model count.
  • Combat Calculator Counter resource use — if Counter destroys the charger before it attacks, Limited weapons, Precision Tags, and target marks are no longer consumed as if the attack happened.
  • Combat Calculator Blast cap — Blast(X) attacks now cap their hit multiplier by the target's remaining models, ignore Cover in defense calculations, and multiply Poison auto-wounds like other hit pools.
  • Combat Calculator Poison grants — Poison now works when granted by active effects or target marks, not only when printed directly on the weapon.
  • Combat Calculator AI Strike Back defense — AI auto-defense against Strike Back now fills AP-on-6/Rending defense dice as well as normal defense dice.
  • Combat Calculator Strike Back hit breakdown — Strike Back results now explicitly show extra hits from unmodified 6s instead of only folding them into the total hit count.
  • Combat Calculator Strike Back Blast — Strike Back hit pools now apply Blast(X) the same way normal attack hit pools do.
  • Combat Calculator Strike Back mark rules — Strike Back attacks now use the same granted attack-rule path as normal attacks for target-mark effects such as Rending in melee and Furious.
  • Combat Calculator Strike Back conditional AP — Strike Back attacks now apply conditional AP rules such as Shatter, Tear, and Disintegrate against the original attacker.
  • Combat Calculator Strike Back weapon quality — Strike Back attack rolls now honor Reliable and Precise on the selected melee weapon instead of only using the defender's base Quality.
  • Combat Calculator Defensive Frenzy symmetry — Defensive Frenzy defense markers now apply consistently to Impact, AP-on-6/Rending, and Strike Back defense rolls instead of only normal defense pools.
  • Combat Calculator AP-on-6 defense — AP-on-6/Rending defense pools now use the same confirmed long-range defensive AP reduction as normal defense pools, and AP details show the effective AP after Cover and automatic AP reduction.
  • Combat Calculator Hazardous AP — Hazardous now resolves as AP(4) instead of incorrectly stacking as AP(+4), including Strike Back attacks.
  • Combat Calculator Hazardous reminders — natural 1s on Hazardous hit rolls are now counted across primary and extra attack dice and shown as self-wound reminders.
  • Combat Calculator Deadly resolution — Deadly(X) wounds are now applied model-by-model so excess wounds do not spill into other models, with explicit reminders in the attack flow.
  • Wound resolution tests — Deadly/Tough wound-packet behavior now has focused regression coverage outside the Combat Calculator UI.
v0.9.1
2026-05-20

Fast follow-up from continued real-table testing after the AoF Skirmish pass.

Added
  • AI dice control — in-match toggle to switch AI rolls between automatic and manual, persisted per match
  • AI Wound Effect auto-rolls — AI-side Wound Effect Table checks now auto-roll when AI auto-dice are enabled
Fixed
  • Strike-back after melee misses — melee attacks with zero hits now continue to strike-back instead of ending the combat flow
  • Strike-back CTA clarity — no-hit melee flow now labels the next step as Strike Back instead of Done
  • Final objective scoring — ending a match now always snapshots the current round objectives, preventing false 0:0 results in End Game and Basic scoring modes
  • Counter destruction edge case — if Counter destroys the charging attacker, the combat calculator now applies Counter and ends combat instead of continuing into a dead attack
v0.9.0
2026-05-19

Rules-accuracy and UX fixes from a full real AoF Skirmish test match.

Added
  • Interactive Counter phase in the combat calculator when charging a unit with Counter
  • AI proximity guidance — target recommendations now prioritize units that have already been involved in combat and remind the player to choose reachable targets
  • Back to Match from the result screen for correcting final objective scoring before re-ending the game
Changed
  • Combat calculator unit names now use match-state names, including duplicate suffixes like [A]/[B]
  • Fatigued melee handling now shows a warning and applies the 6+ melee-hit baseline for fatigued attackers
  • Precision-style aura buffs now feed their hit modifiers into the combat calculator when assigned during pregame setup
Fixed
  • Melee fatigue propagation — combat calculator melee results now fatigue the involved attacker and defender like manual combat logs do
  • Final objective flow — matches with objectives prompt before ending so players can verify final scoring
  • Counter casualties — Counter casualties reduce the charging unit's attack dice before its main attack
v0.8.0
2026-05-18

Release-readiness hardening ahead of 1.0.

Added
  • Social sharing baseline — global Open Graph/Twitter metadata, branded static preview image, and shareable match-result summaries with native share plus clipboard fallback
  • Route resilience — segment-level error boundaries and loading skeletons for the highest-traffic pages
  • Accessibility baseline — skip link, visible focus rings, labels for icon-only controls, and larger tiny interactive labels
  • Faction rankings — aggregate win-rate view on the stats page
  • Combat calculator automation — long-range AP reduction now applies automatically for rules with an explicit over-9" shooting condition (Guardian, Primeborn, Ballistic Vest)
Changed
  • Combat calculator availability — enabled for every supported system; removed the old beta feature gate
  • Tournament presentation — removed preview/WIP messaging now that the implemented Swiss flow includes linked matches, player result submission, SoS standings, rematch avoidance, bye history, and tournament-day tooling
  • Next.js 16 routing convention — migrated middleware.ts to proxy.ts
  • Release truth — docs, version metadata, and changelog now reflect the current product state
Fixed
  • Release blockers — cleared lint failures, aligned rules-coverage expectations with the implemented corpus, and bypassed stale fetch caching during Army Forge imports
v0.7.0
2026-05-16

Free-for-all matches and Tournament Mode v2.

Added
  • Free-for-all mode — 3–6 players can play one match with rotating activations, per-side VP tracking, and ranked final results
  • Linked tournament matches — generated rounds create real Roster Raven matches whose results can sync back into the tournament
  • Player result submission — both players can submit independently; matching submissions confirm automatically, disagreements become disputes
  • Player tournament hub — “My Tournaments” shows current matches, result status, and direct match links
  • Tournament-day tooling — synchronized round timer, live table status board, projector view, QR code, standings export, and public tournament discovery
Changed
  • Swiss standings — standings now sort by TP → SoS → DP → VP → name
  • Pairing intelligence — rematches are avoided when possible and prior byes are deprioritized for future byes
  • Tournament UX — organizer and participant flows gained stronger defaults, clearer dashboards, and faster access to current results
v0.6.0
2026-05-14

Team Play — local multiplayer matches with 2+ armies per side.

Added
  • Team match mode — new "Team" option in the army picker lets you build matches with multiple armies per side; select any number of your armies for Side A and Side B independently
  • Team control toggle — choose between Shared (any teammate can activate any unit on their side) and Strict (each player activates only their own army's units) when creating a team match
  • Army sub-headers in match view — team matches display army name dividers between each army's units within a side, so you always know which units belong to which army
  • Combined points and names — team sides show combined army names ("Army 1 + Army 2") and summed point totals in the match header
  • N-sided match architecture — new MatchStateV2 data model supports arbitrary armies per side; existing classic matches continue to work unchanged through an automatic compatibility layer
  • match_participants table — new database table tracks which armies are on which side for team matches, with full RLS policies
v0.5.3
2026-05-14

Tournament list viewing, scenario PDF uploads, and an AI difficulty module for Solo/Co-op mode.

Added
  • Approved army list viewing — on any public tournament page, each approved participant row can be expanded to show the full army list from their registration snapshot: unit stats, weapons, special rule badges, and a link to the original Army Forge list
  • Tournament scenario PDF upload — organizers can upload PDF documents (scenarios, rule packs, mission sheets) to a tournament; participants see a document list with download links on the public tournament page
  • AI difficulty module — when creating a Solo/Co-op AI match, a four-option difficulty picker appears: Manual (player rolls all dice physically), Easy (AI dice skew toward low results), Normal (uniform distribution), and Hard (AI dice skew toward high results)
  • AI auto-roll — in Easy/Normal/Hard modes, the AI side's attack, impact, and defense dice are automatically rolled and pre-filled in the combat calculator; an amber banner marks each auto-rolled step so players can still review results before confirming
v0.5.2
2026-05-14

GF/GFF rules support wired into the UI, plus a wound display fix for high-Tough units.

Added
  • GF/GFF rules in combat calculator — Infected, Badlands Hunter, Devout, Berserker, Bloodborn, Clan Warrior, Psychotic, Guardian, Primeborn, Ballistic Vest, and Runner are now recognized by the combat calc for their respective mechanical effects
  • System-aware rule descriptions — getRuleDescription() now returns the GF/GFF-correct rule text for rules with system variants; tooltips in GF/GFF matches show the right wording
  • Caster Group system-variant display — the Caster Group description adapts per system (GFF: "this model counts as Caster(1)", GF: "pick one model, Caster(X)")
  • GF No Retreat fullscale morale — units with No Retreat now redirect to the No Retreat prompt in fullscale matches, using the fullscale dice formula (modelsRemaining × effectiveTough − accumulated wounds); skirmish formula unchanged
  • GFF spell scaling badges — when casting a GFF spell, the overlay shows structured badges for target count ("up to 3 enemy units"), hit count, and AP value parsed from the spell description
  • GFF aura pregame support — GFF aura rules (Regeneration Aura, Stealth Aura, Fast Aura, Rapid Rush Aura) trigger the pregame unit picker when present
  • GF/GFF rule master data — 103-test-covered module covering master rules, rule variants, aura scopes, spell scaling, profile catalog, and lookup helpers for all GF and GFF rule families
Fixed
  • Wound tracker overflow on mobile — units with Tough > 8 (e.g. T18, T24) now show a compact health bar with a numeric wounds/tough counter instead of rendering dozens of individual dots that overflowed the unit row
v0.5.1
2026-05-14

AI Activation Announcement for Solo mode plus two bug fixes.

Added
  • AI Activation Announcement overlay — when rolling for the next AI activation in Solo/Co-op mode, a dramatic full-screen overlay appears showing the selected unit name and photo, its role badge, the suggested action with target, top two priority targets with scoring reasons, and tactical hints
  • Toggleable AI scoring breakdown — the overlay includes a collapsible table showing all scored enemy units with individual scores and the factors that contributed to them (defense, model count, cost, activation state, stealth, shaken status)
  • Army photo fallback in overlay — if no unit photo is uploaded, the overlay now shows the army photo instead; the image block is hidden entirely when neither is available
Fixed
  • Unit name truncation on transport vehicles — names were being squeezed to a single character ("B" instead of "Big Titan") when many context badges (transport capacity, AI role, threat level, effects) competed in the same flex row; badge rows are now split so the name always has full width
  • i18n label and clickable spell rule badges — corrected tap-to-cast label key and made spell rule badges in cast modal properly interactive
v0.5.0
2026-05-12

Tournament Mode v1 is now released on master as an organizer-driven event mode. It is marked as WIP/Preview in the app because the mode is already usable, but more tournament-day features are planned.

Added
  • Tournament creation — organizers can create public-link tournaments with game system, points limit, round count, round length and list approval settings
  • Player registration — logged-in players can register through a tournament link and submit an Army Forge share URL
  • Immutable tournament list snapshots — submitted lists are imported, validated against system and points limit, and stored as stable tournament snapshots
  • Organizer list review — organizers can approve, reject or request changes for submitted lists before the event starts
  • OPR classic pairings — round 1 random pairings, odd-player byes, later-round TP groups with DP ordering, and lowest-ranked bye assignment
  • Organizer result entry — organizers enter result type, DP and optional VP; TP is calculated automatically from win/draw/loss/bye
  • Tournament standings — standings use TP first and DP second, with VP stored only as display context
  • Public tournament pages — public overview shows tournament info, approved participants, pairings, results and standings
Notes
  • Tournament Mode is marked as WIP/Preview in the app and does not yet include live tournament matches, player-submitted results, rematch avoidance or VP-based ranking.
v0.4.0
2026-05-11

AoF/AOFS rules, spell parsing, aura scopes, and match-flow rule support.

Added
  • AoF/AOFS rules data foundation — added structured metadata for key Age of Fantasy and Age of Fantasy: Skirmish rule families without merging same-name rules globally
  • System-aware spell handling — spells are now treated by gameSystem + faction + name, preventing same-name spells from overwriting different faction/system variants
  • Spell parser module and tests — spell parsing moved into a reusable library with AOFS parser coverage for multi-target buffs, mark spells, model-target spells, trigger rolls, terrain effects, and movement control
  • Target-mark spell support — mark spells such as Hunter's Strike now attach context to the marked target and only apply when attacking that unit
  • Skirmish aura scope protection — AOFS pregame auras keep their selected-unit scope, while AoF "this model and its unit" auras remain separate
  • Restore and utility flows — Reanimation, Reanimation Aura, Mend/Repair-style healing, and Grounded Reinforcement are now represented as helper flows or reminders where full automation would be unsafe
  • Spell token automation — Spell Accumulator now refreshes tokens automatically at round start when the caster is not Shaken; Spell Conduit remains a distance reminder
  • Armybook regression fixtures — added concrete regression tests for Fire Ball variants, AOFS Tear/No Retreat, aura scope separation, duplicate daemon spell blocks, and the 32 AoF + 35 AOFS batch catalog
Changed
  • Combat calculator rule handling — expanded structured handling for Shielded, Surge/Lucky/Ferocious, Royal Warrior/Primal/Predator Fighter, Crack/Destructive/Rending, Shred/Warbound/Destroyer, Slayer, Bane/Lacerate/Bestial/Mischievous, No Retreat, and related conditional effects
  • Rule reminders — Grounded, Spell Conduit, terrain-condition, range-control, caster-token, and faction-specific reminder rules now appear more consistently in match flow without forcing unsupported automation
Fixed
  • AoF/AOFS rule separation — Tear, Shatter, No Retreat, aura scopes, faction-specific boosts, and duplicated spell names no longer collapse into a single global interpretation
  • Mark spell consumption — on-use target marks are consumed after the relevant attack, including strike-back cases
  • Offensive spell triggers — AP, Crack, Hazardous, trigger-on-1/6 notes, and multi-target spell hits are parsed and surfaced more reliably
v0.3.2
2026-05-10

Pregame aura assignment and spell flow polish.

Added
  • Skirmish pregame aura setup — AOFS-style auras such as Precision Fighter Aura are now assigned before the game starts, matching their rule text
  • Aura target selection — aura sources receive their own aura automatically, and eligible friendly units can be selected during setup
  • Persistent aura marks — assigned auras are shown as clickable active marks on the affected units and can be expanded for rule details
  • Transport tracking v1 — transports can start with passengers, show occupied capacity, manage embark/disembark state, and remind players about 6" exit placement and destroyed-transport tests
Changed
  • Aura timing — Skirmish auras that must be picked before the game are no longer handled as normal round effects
  • Spell parser foundation — spell trigger notes now use language-neutral parser tokens before being rendered in the UI
Fixed
  • Spell trigger localization — English spell dialogs no longer show German text like "On 6: Sondereffekte"; trigger notes now follow the active app language
  • Transport import ratings — Army Forge rules such as Transport now keep capacities from rating, label, or rated rule names, and cumulative Transport upgrades are combined instead of losing extra space
  • Custom unit upgrade rules — rules granted through custom Army Forge upgrade gains, such as Big Titan Transport(11), are now imported and shown in the app
v0.3.1
2026-05-09

Solo tracking and player identity foundation for tournaments and leagues.

Added
  • Solo Tracker mode — matches can now be started with only your own army. Objectives, activations, wounds, spell tokens, reserve/ambush handling, rule pills, and match notes remain available without creating or displaying an opponent side
  • Player usernames — new user profile foundation with unique usernames, including reserved-name protection and case-insensitive uniqueness for future tournament, league, pairing, and invitation flows
  • Username gate — users without a profile are prompted on the dashboard to choose a unique username before continuing
  • Solo match storage — solo tracker sessions are stored as matchMode: "solo" with no army_b_id, instead of using a dummy opposing army
Changed
  • Match creation flow — added Solo Tracker as its own mode alongside Local, Solo/Co-op AI, and Live Session
  • Solo match UI — opponent score cards, opponent tabs, combat calculator, and manual combat logging are hidden in solo tracker sessions
  • Stats handling — global stats ignore solo tracker sessions so tournament-style win/loss analysis remains based on actual opposing-army matches
  • Army history — solo tracker sessions appear neutrally in an army's match history without counting as wins, losses, or draws
  • Local maintenance — reset and rematch actions now preserve solo tracker state correctly
v0.3.0
2026-05-08

Offline-ready local matches, PWA support, and Ratmen combat rules.

Added
  • PWA & Offline Match Mode
  • Progressive Web App — Roster Raven can now be installed on mobile and desktop as a standalone app with dark theme and home screen icon
  • Service Worker — caches app shell and static assets (NetworkFirst for pages, CacheFirst for JS/CSS/images) so matches load even with flaky network
  • Offline match play — all match data (armies, units, weapons, rules, spells, state) is cached in IndexedDB when a match page loads. Wound tracking, activations, objectives, spells, combat log, round changes, and AI helper all work offline
  • Auto-sync on reconnect — when connection returns, the latest local match state is automatically pushed to the server
  • Connection status indicator — green/red/amber dot in the round counter bar shows Online, Offline, or Unsynced status. Manual "Sync now" button for unsynced changes
  • Live Session offline warning — if connection drops during a shared match, a red banner warns that realtime sync is paused while local actions continue to be saved
  • Ratmen Combat Rules
  • Unpredictable Fighter — D6 die picker in the combat calculator modifiers step: roll 1-3 grants AP(+1), roll 4-6 grants +1 to hit. Only appears for melee attacks with Unpredictable Fighter units
  • Evasive — +1 to hit penalty applied to both melee and ranged attacks against Evasive targets
  • Hazardous — AP(+4) added to weapons with Hazardous, with dedicated hasHazardous flag for defense calculation
  • Melee Slayer — AP(+2) when charging against targets with Tough(3)+
  • Ratmen special rules — Scurry, Scurry Boost, Quick Readjustment, Repel Ambushers, Defense Debuff, Takedown Strike, Reinforcement added to rules dictionary
  • Live Session Improvements
  • View-only unit cards — the opponent can now expand unit cards and open rule pill tooltips on the other side to check stats, weapons, and rules
  • Locked action buttons — Wound, Heal, Kill, Attack, Log, Precision Tag, Shaken, and spell token buttons are visually locked (greyed out, pointer-events-none) for the non-controlling side
  • Locked inline prompts — Wound Effect Roll, Targeted Wound Effect, and Tough Threshold removal buttons are now also locked for the opponent
  • No cross-side effects — "Apply as Effect" button in rule pills is hidden when viewing the opponent's units, preventing accidental cross-side effect creation
  • View-only label — small "View only" hint appears at the top of expanded opponent unit cards
Changed
  • PWA metadata — layout.tsx now includes Web App Manifest link, theme-color, apple-web-app, and viewport meta tags
v0.2.7-beta
2026-05-07

Combat Calculator rules, AI mode upgrades, Counter flow, and i18n polish.

Added
  • Combat Calculator: Impact — charging units with Impact roll extra dice (2+ to hit), reduced by Counter models. Separate defense pool at base defense (no AP)
  • Combat Calculator: Counter warning — prominent banner when charging a Counter unit, with manual resolution guidance
  • Combat Calculator: Ravage & Thrust — charging modifiers that improve hit target and AP
  • Combat Calculator: Fearless & Hero aura — morale step shows re-roll hints for Fearless units and Hero aura range reminder
  • Combat Calculator: Retaliate — strike-back prompt shows auto-hit calculation for Retaliate units
  • Combat log viewer — collapsible panel during active matches with round filter tabs, per-side wound/kill totals, and color-coded entries (newest first)
  • Manual Log: combat rule hints — Impact dice, Counter warning, Retaliate auto-hits, and Fearless reminders shown when selecting a melee target
  • Manual Log: Counter sub-modal — clicking the Counter hint opens an interactive popup to resolve the Counter unit's strikes-first attack before the main attack proceeds
  • Manual Log: active effect descriptions — all active buffs/debuffs on attacker and defender shown with full description, no hover needed (mobile-friendly)
  • AI: specific action text — activation helper shows "Charge → Unit Name" / "Shoot → Unit Name" / "Engage → Unit Name" based on role and top target
  • AI: threat badges — optional per-match toggle showing which player units are AI priority targets (TARGET #1 in red, TARGET #2 in amber)
  • AI: round recap — round-change summary includes AI combat stats (wounds dealt / kills / losses)
  • Ambush deployment setup — before the roll-off, players with Ambush units choose which to hold in reserve (round 2+) and which to deploy immediately, matching OPR's optional Ambush rule
Changed
  • Mission Setup: Basic tab default — the Basic (custom) tab is now the default left tab, Tournament moved to the right
  • Full i18n coverage — replaced all remaining hardcoded English strings in match-table, unit-card, and combat-flow with translation keys (Kills, Wounds, Mission, Objectives, Deployment, Hits, Melee, Quality, Defense, Tough, Models, Weapons, Rules, Special Rules)
  • Counter/Impact/Retaliate detection — now checks both unit.rules and weapon.specialRules, fixing units like Skeleton Guard with Cursed Spear where Counter is on the weapon
v0.2.6-beta
2026-05-07

AI mode enhancements, combat log improvements, and UX fixes.

Added
  • AI role overrides — the auto-detected combat role (Melee/Range/Hybrid) can now be manually overridden per unit via a tappable role selector in the AI panel. Overrides persist across rounds (localStorage)
  • AI role badges — each AI unit card shows a compact role badge (MEL/RNG/HYB) so combat roles are visible at a glance without rolling
  • AI tactical hints — after rolling, the AI panel shows relevant special rules (Scout, Ambush, Fast, Stealth, Flying, Caster, Tough, Regeneration, Strider) with short tactical guidance for the suggested unit
  • AI target prioritization — a weighted scoring system evaluates enemy units by defense, remaining models, point cost, activation state, stealth, and shaken status. The top 2 recommended targets are shown with reason tags
  • Attacker weapons in Log Action — the Log Action modal now shows the attacking unit's weapons (filtered by ranged/melee mode) with name, range, attacks, AP, and current count, so players don't need to close and recheck their unit
  • Wound Effect prompt in Log — in Skirmish local/AI matches, after logging wounds that trigger the Wound Effect Table threshold, a Shaken/Destroyed prompt appears immediately instead of requiring manual resolution on the defender's unit card
Changed
  • Shooting renamed to Range — the AI role label now reads "Range" instead of "Shooting", consistent with the RNG badge on unit cards
Fixed
  • Tab-switch scroll — switching army tabs during a match now scrolls back to the top of the unit list
  • AI activation scroll — after rolling and activating a unit in AI mode, the view scrolls to the activated unit card
  • Duplicate activation reminders — Combined Units where parent and hero share the same special rule (e.g. Guerilla) no longer show duplicate reminders
v0.2.5-beta
2026-05-06

Match UX polish: rematch, round reminders, match notes, and small fixes.

Added
  • Rematch button — after a match ends, a rematch button creates a new match with the same armies and fresh state. Shows a loading animation to confirm the click. Preserves AI mode settings for AI matches
  • Round-change summary — a modal appears after each round transition showing spell token recharges, fatigue clears, Growth bonus activations, and Ambush/Reserve units that are now deployable. Color-coded by category
  • Private match notes — collapsible notes section in the active match view. Saved locally per match (localStorage), never synced via broadcast, so notes stay private in shared live sessions. Notes are shown read-only in the result screen after the match
  • Auto-expand on activation — unit cards now automatically expand when activated, showing full details and action buttons immediately
Fixed
  • AI helper not showing — the AI Activation Helper was invisible on the AI side tab because matchMode and aiSide were dropped during match state hydration
  • Strike Back decline button — the "Decline" button in the Strike Back modal now uses amber styling instead of gray, making it clearly interactive instead of looking disabled
v0.2.4-beta
2026-05-06

Solo/Co-op AI mode and activation UX improvements.

Added
  • Solo/Co-op AI mode — matches can now be created with an AI-controlled opponent. The AI side gets a dedicated activation helper that rolls a D6, splits available units into two sections, classifies each unit by combat role (Melee, Shooting, Hybrid), and suggests the next activation with priority and action guidance
  • Auto-expand on activation — unit cards now automatically expand when activated, showing full details and action buttons immediately
Fixed
  • AI helper not showing — the AI Activation Helper was invisible on the AI side tab because matchMode and aiSide were dropped during match state hydration
v0.2.3-beta
2026-05-04

Combat-flow polish, Full-Scale Takedown hardening, and tablet usability improvements.

Added
  • Gated Combat Calculator toggle — the Combat Calculator can now be enabled globally with COMBAT_CALC_ENABLED=true or for selected accounts through comma-separated COMBAT_CALC_USER_ALLOWLIST e-mails or user IDs
Changed
  • Tablet-friendly popups — unit target lists in manual logs, effects, and spells now expand with the popup instead of using small inner scrollbars
  • Visible zero-wound logs — manual Combat Log entries now show 0W, so missed ranged attacks can still be confirmed and reviewed in the log
Fixed
  • Full-Scale Takedown wound order — targeted hero and special-model wounds now carry onto the final model before remaining wounds are applied, preventing overfilled Tough tracks
  • Combined Unit custom names — imported Combined Units now merge parent and child custom names, so joined leaders keep their custom names in the app
  • Destroyed units cannot strike back — the Combat Calculator now checks the defender's post-attack state before offering Strike Back
  • Zero-wound ranged logs — ranged manual logs can be submitted even when no wounds were caused
v0.2.2-beta
2026-05-03

Full-Scale rules hardening, reserve deployment tracking, and safer manual wound logging.

Added
  • Army short codes — armies can now store a custom 3-letter code used for objective and compact match labels, avoiding collisions like two armies starting with "The"
  • Takedown model selection — manual Combat Log attacks with Takedown can now choose removed special-weapon or hero/upgrade models; the selection persists so weapon counts update correctly
  • Reserve / Ambush deployment panel — units with Ambush, Reserve, or Reserves now start outside the normal activation list and can be deployed from a dedicated panel once their available round is reached
  • Reinforcement return tracking — destroyed units with Reinforcement-style rules move into the reserve panel as ready-to-return units instead of staying in the normal activation flow
  • Defensive wound prevention in manual logs — targets with Regeneration, Self-Repair, Reanimation Aura, Nimble, or matching custom prevention rules now get a defensive-effect counter when wounds are logged against them
Changed
  • Manual Combat Log is wounds-only — the Kill counter was removed from the popup to avoid accidental model removal; model losses now come from the wound resolver
  • Smart weapon count removal — standard weapons are reduced first as normal models die, while special weapons and hero weapons stay available until their owning models are actually removed
  • Localized reserve and effect UI — newly added reserve, deployment, defensive-effect, and Full-Scale morale texts now use DE/EN translations, including proper German umlauts
Fixed
  • Lint errors cleared — the project lint command now exits successfully again, leaving only non-blocking warnings
  • Full-Scale morale trigger — ranged/general morale no longer fires after every wound; it only triggers when casualties bring the unit to half starting strength or below
  • Combined Unit Tough wound tracks — multi-model units with Tough now show wound bubbles for the active Tough model before the final hero model is reached
  • Combined Unit hero Tough separation — troop Tough and hero Tough stay separate, including older imported matches where both values could appear on the wrong rule group
  • Defensive effects timing — Reanimation Aura, Self-Repair, and similar effects can now be applied when a unit receives wounds, not only when that unit activates or attacks
  • Reserve English text — the English match UI no longer displays German reserve/deployment text
v0.2.1-beta
2026-05-02
Added
  • Combined Unit support — Full-Scale armies using Combined Units in Army Forge are now correctly merged into a single unit on import (e.g. 2×5 models → 1×10), so they behave as one unit in matches. Existing armies must be re-imported to apply.
  • Combined Unit hero visibility — when a hero joins a unit, the combined name shows both (e.g. "Tactical Grunts + Grunt Leader"), hero weapons are grouped separately, and hero rules are displayed with violet dashed badges
  • Hero Tough tracking — when a combined unit's last model standing is the hero, the hero's Tough value is used for wound tracking instead of the parent's (e.g. hero has Tough(3) but parent unit has none)
  • Duplicate unit name prefixes — units with identical names (e.g. two "Tactical Grunts") now show [A], [B] prefixes for disambiguation in matches
  • Dynamic weapon count scaling — weapon counts scale proportionally as models are lost (e.g. 8 Pulse Rifles → 4 at half strength); hero weapons keep their original count
Changed
  • Sort button removed — the unit sort toggle in match view has been removed to simplify the interface
Fixed
  • Full-Scale wound tracking — Manual Log now correctly removes models for units without Tough (1 wound = 1 kill); previously wounds were silently accumulated without effect
  • Full-Scale game system profile — all Full-Scale matches previously used Skirmish wound mechanics; fixed profile resolution from gameSystemType string
  • Combined Unit Tough handling — hero Tough is no longer applied to the entire unit; instead it is shown as a tagged rule so normal models still die at 1 wound as expected
  • Combined Unit wound display — Tough badge and wound dots now correctly reflect heroTough when the last model is the hero of a combined unit
  • Auto-remove on Tough threshold — wound button now automatically removes the model when wounds reach the Tough value, instead of only accumulating
  • Contested objectives color — contested objectives now use a distinct amber/orange color (#d4a017) instead of the same violet as Player B
  • Unit/army photos not loading — switched signed URL matching from path-based to index-based for reliability with newer Supabase SDK versions
  • Data leakage on new accounts — new users could see other players' armies and matches due to overly broad shared-match RLS policies; listing queries now explicitly filter by user
  • Import hint direction — step 3 text said "paste above" but the input field is below; corrected in DE and EN
  • Meta description typo — changed "für" to "for" in the site-wide description shown when sharing links
v0.2.0-beta
2026-05-01

Shared Live Sessions — play matches with a friend in real-time via share link.

Added
  • Shared Live Sessions
  • Live Session mode — new match creation option: pick your army, get a share link, opponent joins with their own army and account
  • Waiting Lobby — host sees share link with copy button, auto-detects when opponent joins via Supabase Realtime Broadcast
  • Join Flow — /matches/join/[token] route: see opponent's army, pick your own, system compatibility enforced
  • Real-time Sync — all match state changes broadcast instantly to the other player via Supabase Realtime
  • Role-based Controls — host controls Army A, guest controls Army B; action buttons disabled for opponent's units
  • Host-only Match Management — starting side selection, mission/scenario setup, objectives, next round, and end game restricted to host
  • Session Info Banner — explains roles at match start (dismissible), so players know what they can control
  • Share Token Lifecycle — token generated on lobby creation, invalidated on match end
  • Other
  • Fatigued status banner — automatically shown on units after melee combat (attacker on initial strike, both units after strike-back), resets at round start, translated badge (DE: ERMÜDET / EN: FATIGUED)
  • Bug Report link — mailto link (gl4dr3x@gmail.com) in footer on Home, Login, and Signup pages
Changed
  • Changelog switched to English — all entries now in English, changelog page updated accordingly
  • Smart activation switching — after activating a unit, only switch to the other side if they still have units to activate; stay on current side otherwise
v0.1.3-beta
2026-05-01
Added
  • Changelog page (/changelog) — all versions and changes publicly visible, Raven Command design, no auth required
  • Changelog link in legal footer on the Home Dashboard
Changed
  • Ranged/Melee toggle in manual Combat Log: ranged option only visible when the unit has a ranged weapon, otherwise automatically melee
v0.1.2-beta
2026-04-30

i18n Language Switcher and full translation of all UI strings for DE/EN.

Added
  • i18n / Language Switching
  • DE/EN Language Toggle in Bottom Nav and Auth pages
  • Full Match UI Translation — all ~90 strings (activation, effects, weapons, rules, spells, spell casting, objectives, roll-off, game end, MVP, casualties, side missions)
  • Bilingual Missions System — all 8 tournament scenarios (Skirmish + Full-Scale) in DE + EN
  • Server Component Locale — cookie-based, router.refresh() after language switch for instant update
  • TypeScript-enforced Translations — keyof typeof de ensures all keys exist in both languages
Changed
  • Language Toggle now shows current language (DE/EN) instead of target language — more intuitive
  • Growth effect description uses translated round label
  • Missions API (getMissionsForSystem, getMission) accepts optional locale parameter
v0.1.1-beta
2026-04-30

Beta hardening after Discord announcement: error handling, onboarding, legal pages, morale system, and melee flow.

Added
  • Morale System
  • Full-Scale Morale: Quality test after casualties, failure = Shaken. Melee loser at half strength = Rout.
  • Skirmish Morale: Quality test at round end when >50% units dead. Already Shaken + failure = Rout.
  • Melee / Strike-Back
  • Ranged/Melee toggle in manual Combat Log (all systems)
  • Strike-Back Flow: After melee → counter-attack input → wounds applied
  • Full-Scale: Wound comparison → loser → Morale test, at half strength → Rout
  • Skirmish: Strike-Back with Fatigued hint for Shaken units (only hit on 6+), no morale comparison
  • Onboarding
  • Welcome Wizard — 3-step modal for new users (Import → Opponent → Start match)
  • Import Hint — "How it works" guide on the Import page (dismissible once)
  • Auto-scroll to save button after successful import
  • Legal & Compliance
  • Impressum (§5 TMG) — privately operated by Alexander Kreitner
  • Privacy Policy (GDPR) — registration data, Vercel, Supabase, cookies
  • Impressum + Privacy accessible from Login/Signup without auth
  • Legal footer on Login, Signup, and Home Dashboard
  • Error Handling
  • German error messages for Auth (Login, Signup, Rate Limits)
  • Match creation: explicit error messages for missing armies, system mismatch
  • Custom 404 page and global Error Boundary in Raven Command design
  • "Session expired" notice only for actual expired sessions
  • Auto-Login after registration (when email confirmation is disabled)
Changed
  • Robust error translation with case-insensitive substring matching (instead of exact match)
  • Bottom Navigation hidden on Auth and Legal pages
Fixed
  • Missing umlauts on various pages (Übersicht, einfügen, verfügbar, Überschreiben)
  • Wizard reliably appears after registration (always mounted, isNewUser prop)
  • Import page auto-scrolls down to save button after validation
  • "Noch keinen Account?" grammar correction
v0.1.0-beta
2026-04-30

First public beta release, announced in the German OPR Discord.

Added
  • Core Features
  • Army Forge Import — paste share URL, army is loaded and validated server-side. Duplicate detection with overwrite option, unit photos preserved on re-import.
  • Unit Cards with photo upload (square crop, Supabase Storage, zoom view)
  • Table View — tab-based on mobile, wound tracking, special rules inline, photo zoom
  • Match System — Round Counter, Wound Effect Table (Skirmish), Shaken/Kill/Heal
  • Caster & Spell Token Tracking — accumulated per round (max 6), +/− controls
  • Spells Database — faction-specific, auto-sync via Army Books API on import
  • Spell-Casting Flow — dice roll → success/failure → Buff/Debuff/Offensive assignment
  • Offensive Spells — multi-target: Hits → Defense dice → wounds per target, sequential
  • Smart Spell Targeting — parseSpellTargeting detects "Pick enemy/friendly" automatically
  • Unit Activation — green dot, activatedUnitIds[], reset on new round
  • Tappable Rules — unit rules + weapon rules with expandable explanation (OPR v3.5.3)
  • Combat Calculator — weapon → target → modifiers → dice → defense → wounds → strike-back (currently hidden in testing)
  • Unit Combat Log — manual + auto-log from Calculator, wounds/kills per unit
  • Objective Tracking — 3/4/5 objectives, consecutive + end-game scoring, VP per round
  • Match End after 4 rounds with result screen: MVP, per-unit stats, kills per round, VP
  • Buff/Debuff System — ActiveEffects, onUse/endOfRound, Custom Rules, Army Abilities
  • Growth Rule — automatic round-based buff: +1/+2/+3 to hit
  • Tournament Missions — system-specific (Skirmish + Full-Scale), side missions, VP integration
  • Game System Profiles
  • Skirmish (Age of Fantasy: Skirmish, Grimdark Future: Firefight): Wound Effect Table, Shaken, effectiveTough
  • Full-Scale (Age of Fantasy, Grimdark Future): Tough(X) Threshold, no Shaken, no Wound Effect Table
  • Same-system match enforcement (only armies of the same system against each other)
  • Navigation & Dashboard
  • Home Dashboard — quick-start grid, stats overview, recent matches, armies with photos
  • Bottom Navigation — 4 tabs (Home, Armies, Match, Stats)
  • Army Photo Upload — clickable on Home + Armies list
  • Statistics
  • Global Statistics Page (/stats) — army ranking, top units, MVP, match history
Roster Raven ist ein Fan-Projekt und steht in keiner Verbindung zu One Page Rules.