Skip to content

Releases: karmaniverous/fooboard

fooboard@0.2.0

Choose a tag to compare

@karmaniverous karmaniverous released this 31 Oct 04:19

[0.2.0] - 2026-10-31

🚀 Features

  • (app) Show Page not found for addresses with no route
  • (header) Release notes links to the releases page; drop the bundled What's new
  • (board) Board actions as icon buttons named and tooltipped by their panels
  • (first-run) The note shows Problems' and Edit dashboard's icons before their names, as for Unmapped runs
  • (engine) Boost a row's polling when the user shows interest in it (spec 0.2.0 §3.H)
  • (board) Boost a row on a click, a key or a dwell, and on opening its settings (spec 0.2.0 §3.H)
  • (config) Dismissed unmapped-run patterns, data model v7 (spec 0.2.0 §3.I)
  • (unmapped) Dismiss unmapped runs by pattern, show and undo (spec 0.2.0 §3.I)
  • (board) A dot on the key marks Add a credential (Decision 105)
  • (hosting) Serve /ai from /ai.md as markdown, with a Link header on every path (spec 0.2.0 §3.J)
  • (share) Read #j= links and pasted JSON, refuse with field-level errors, ask for keys on arrival (spec 0.2.0 §3.J)
  • (ai) Add Set up with an AI assistant to the header, menu, footer and home page (spec 0.2.0 §3.J)
  • (ai) Publish /ai, /ai.schema.json and /llms.txt, with discovery pointers (spec 0.2.0 §3.J)
  • (ai) A styled loading screen carrying the assistant pointer (Decision 106)
  • (ai) The AI dialog uses the site it runs on; Copy instructions off production (Decision 107)
  • (docs) Npm run screenshots retakes every README screenshot from the build (R4)
  • (ai) The AI dialog's two rows and icon copy buttons (Decision 108, R4)
  • (budgets) Battery readings survive a reload (Decision 109, R4)

🐛 Bug Fixes

  • (engine) Window hint only where a matching branch's own read came back full
  • (persist) Write the cache at once after a removal
  • (engine) Custom Amplify rules keeping the built-in branch mapping get the per-branch window hint
  • (first-run) A saved dashboard at an unknown step shows Page not found
  • (build) ZodJitless goes in zod's chunk, so it runs before any shared app chunk
  • (persist) A removal heard while the cache is restored is written as soon as the tab takes the persisting lock
  • (test) The timeout scan takes a factor as a name only if it is one, else a decimal literal of at least 1, so .5 and 0x0 are refused
  • (unmapped) Name the preset choice Which runs to dismiss
  • (unmapped) Count only the entries shown in the Dismiss form's match count
  • (unmapped) Focus the restored entry's Dismiss button after Undo
  • (unmapped) Show Show dismissed pressed as filled with a check, unlike its hover
  • (engine) Never let a dwell's restart postpone the running step's poll
  • (engine) End a deferred restart whose poll lands 75 s or more after the dwell
  • (engine) Judge a dwell's restart at the row's budget pace
  • (board) Focus the entry Undo restores only if it is shown
  • (hosting) Serve the Amplify rewrites and headers from npm run dev too, so /ai works locally
  • (ai) Read /ai.md as a virtual module, since Vite refuses imports from public/
  • (budgets) A battery's reading moves only forward (Decision 109, R4)
  • (engine) Opening a board polls every row at once (Decision 109, R4)
  • (share) A not-JSON message gives only the error's position (#61 review B1)
  • (share) A pasted percent-encoded #j= link ends at its closing brace (#61 review B2)
  • (share) A refusal's dark red is the theme's destructive token (#61 review B3)
  • (share) Refused pasted JSON is called a share, not a link (#61 review B4)
  • (pages) An import replacing the open board lands on it afresh, asking for its key (#61 review B6)
  • (ai) Copied instructions name their site, and /ai.md builds links there (#61 review A-S1, B)
  • (budgets) Loading deletes the readings of credentials not kept (#61 review A-N2)
  • (import) Every import landing opens the imported dashboard afresh, asking for a key or not (#61 second review 1)
  • (share) A stray malformed escape after a pasted link no longer stops the link decoding (#61 second review 3)
  • (hosting) Read the console's redirects in amplify-rewrites.json (Decision 110)
  • (hosting) Read 301 and 302 redirects only, refusing 307 by name
  • (hosting) Accept a condition on any rule; local servers skip conditioned rules
  • (hosting) Refuse a full-URL redirect source with a path or query
  • (hosting) Refuse a redirect to itself
  • (hosting) Carry the query string over on a local path redirect

🔨 Refactoring

  • Remove unused branchPatternPrefix and correct stale module comments
  • One board-action panel and label module, release-notes state in its own hook; docs agree
  • (pages) The home and dashboard addresses named once in pages/paths; Page not found asserted inside the shell
  • (pages) The home, demo and first-run addresses named once, in the header and the test routers too
  • (board) The Problems and Notes names and counted labels come from actionLabels, in the board and the first-run note
  • Share the dismissal reason choices and text fields; read completions only for boosted rows; unexport internals
  • (engine) Drop attend's redundant row check; test that a destroyed board polls nothing
  • (unmapped) Move focus-to-title after the last dismissal to DashboardView, on the panel's close
  • (share) Keep repeatedIds private to the envelope
  • (hosting) Move the rules' parser to vite/hostingRules.ts

⚡ Performance

  • (engine) Poll every root in one cache pass, a shared root once (#61 review A-N1)

📚 Documentation

  • (readme) Live at fooboard.dev, shorter paragraphs, real screenshots
  • (readme) Add the live-demo badge
  • (readme) Restore the characters a Windows-1252 round trip garbled; test the docs for mojibake
  • (readme) Follow-on bullets nest under their item, so each list has the items its lead-in names
  • (readme) Lead-in labels match their items
  • (readme) Hero and settings-editor alt text say what the screenshots show
  • (screenshots) Compress the PNGs losslessly (oxipng -o 4 --strip safe)
  • (readme) Say which custom Amplify rules keep the app-wide window hint
  • (privacy) The release-notes version is stored on a first visit and again after Reset
  • (build) Reflow vite.config.ts's header comment
  • Interaction poll boost, dismissing unmapped runs, data model v7, board actions; e2e and demo tests
  • (config) Remove an orphan doc comment
  • (readme) Note that another tab's save can drop a dismissal and an old tab can't save until reloaded
  • (readme) A dwell's restart keeps a poll already due sooner
  • (test) A literal TAB for title, and over-long doc lines re-wrapped (PR #60 final review #2, #3)
  • Set up with an AI assistant, #j= links, field-level errors, keys on arrival, hosting rules and headers (spec 0.2.0 §3.J)
  • (screenshots) Retake every README screenshot, light and dark, with the AI nav item (Decision 102)
  • (ai) Say where Import is on a narrow screen
  • (privacy) A battery reading also goes with its credential or dashboard (#61 review A-N3)
  • (vite) The instructions chunk loads on every site (#61 review A-N4, B7)
  • (ai) Ids are letters, digits and hyphens, since a dashboard's becomes its address (#61 review A-N5)
  • (privacy) Effective 30 October 2026, the 0.2.0 release (R4)
  • (contributing) Screenshot reruns can differ by a few antialiased pixels (#61 second review)
  • (hosting) The hidden-file build check covers rewrites only

🧪 Testing

  • No Playwright timeout under 30 s; the release runs e2e on a server of its own
  • (e2e) The timeout scan checks every Playwright timeout option and setter, and allows only the floor or a multiple of it
  • (persist) The late-granting locks keep the shared locks' type
  • (build) ManualChunks in its own module, with a test that zodJitless shares zod's chunk
  • (pages) Test routers start at DEMO_PATH and HOME_PATH, as paths.ts says
  • (e2e) Undo focuses the restored entry's Dismiss button
  • (components) A side panel's close handler keeps focus off the trigger
  • (engine) A dwell never postpones the poll of a row's token under its share (PR #60 final review #1)
  • Cover #j= links, field-level errors, keys on arrival, the AI dialog and copying for an assistant (spec 0.2.0 §3.J)
  • (e2e) Serve /ai and point to it, import /ai's #j= example and pasted JSON, axe the AI dialog and a refusal (spec 0.2.0 §3.J)
  • Kill surviving mutants (literal % in raw #j= JSON, the board's copy of config problems); refactor(hosting): one path character class
  • (e2e) Say what the shell suite checks of the AI dialog (Decision 107)
  • (ai) The AI dialog's icon buttons show their names as tooltips on hover too (R4)
  • (pages) A reload carries the state history holds, so it proves keys aren't asked twice (#61 review B5)
  • (hosting) Add a redirect by parsing the committed rules, not by regex

🎨 Styling

  • (board) Batteries first; board actions ghost, emphasis by icon colour (Decision 104)
  • (unmapped) Show Show dismissed's pressed state

🔧 Build & CI

  • (screenshots) Compress with WebAssembly oxipng (@jsquash/oxipng), dropping oxipng-bin and its install script (#61 second review 2)

💼 Other

  • Updated rewrites

fooboard@0.1.0

Choose a tag to compare

@karmaniverous karmaniverous released this 28 Oct 09:47

[0.1.0] - 2026-10-28

🚀 Features

  • Scaffold fooboard as a static Vite + React app
  • (domain) Config schema, presets and migration (PR A step 1)
  • (domain) Branch pattern and match-test matching primitives (PR A step 2)
  • (domain) GitHub and Amplify cell derivation, staleness, unmapped reasons (PR A step 3)
  • (github) GitHub adapter and spike page (step 4)
  • (amplify) Amplify provider (step 5)
  • (demo) Demo board and demo providers (step 6)
  • (engine) Board engine and poll scheduler (step 7)
  • (config) Dashboard default credentials with per-row overrides
  • (storage) Local persistence (step 8)
  • (brand) Adopt the green/gray logo and favicon
  • (board) Board rendering and Try the demo (step 9)
  • (board) Fit, zoom and row height (step 10)
  • (board) Board chrome and tagline (step 11)
  • (credentials) Credential entry, guide and saved dashboards (step 12)
  • (editors) Create and edit dashboards (step 13)
  • (board) Unmapped runs panel with Add test (step 14)
  • (board) C-13 board layout (step 11a)
  • (board) Icon-only rung, in-cell packing, transparent badges
  • Row and column groups with branch-pattern overrides (schema v2)
  • Add override for unmatched branches; Follow and Share
  • (editors) Drag and move across group edges; branch lists in override editors
  • Pinned app header, theme choice and footer
  • A battery for every GitHub token from the start
  • Framed column groups with pinned, left-aligned labels
  • Status sets, documents and bundled presets (statuses core, part 1)
  • Relevant jobs per status set (option A)
  • Status-set references, resolution and v3 migration (statuses core, part 2)
  • The board shows configurable statuses (part 3)
  • Summary chips in their status set's order
  • Status-test form model
  • Status-set editor
  • Status-set choices for row groups, rows and cells
  • Add a status for a run no status matches
  • Board legend; README for status sets
  • Rule checks (JSONPath, glob, regex, exists)
  • Source rules, built-in rules and cell placement
  • Status sets on rules; data model v4
  • Placement rules replace branch patterns and row keys
  • Source rules in the dashboard; Sources tab
  • Rule problems, marked on the board
  • Unmapped reasons per row; Add rule
  • Rule preview and field picker
  • Stage and row rule editors
  • Translation editor; only items where
  • Unknown rule references tolerated as problems; consistency check covers source rules, unchecked paths and unused sources
  • Amplify apps read once per poll across rows; unmapped Amplify jobs; Amplify window hint
  • Problem markers open the editor at the item; Customise from problems; Add rule drafts checks; overrides as rules; field picker tree and raw previews
  • Editor lists collapse to their headers, one item open at a time
  • Borders reach 3:1 and muted text 4.5:1 in both themes, checked by a test
  • Keys, cell statuses, column groups and Unknown runs collapse like the other lists
  • Animated drag reordering on dnd-kit
  • (rules) Hint to test a field inside when a glob or regex path finds an object or array (N1c)
  • (query) Fetch layer, per-credential limiter, query keys and client
  • (engine) Board model deriving per row from the query cache
  • (config) Data model v5 with requests in flight
  • (board) Provisional and refreshing marks, query provider wiring
  • (query) Only a root read's first load and editor lookups jump the queue
  • Add a demo run after load so the demo shows the refreshing dot
  • List Amplify apps across regions on apps queries; optional repo on Amplify rows
  • All-regions Amplify app picker; add apps without a GitHub repo
  • Full commit message and copyable SHA in cell detail; empty order key counts as missing
  • Name an Amplify source whose AWS key can't be resolved in a problem
  • Row tooltip and editor summary for an Amplify row without a repo
  • One demo commit message has a body, shown in full in the detail sheet
  • Skip a network failure in an opt-in region when listing Amplify apps
  • The problem for an Amplify source whose AWS key can't be resolved can be dismissed
  • (board) Space on a focused cell opens its detail sheet
  • (board) A status cell without a link opens its sheet as a button
  • (persist) Persisted query cache, removals across tabs and Reset
  • (panels) Pin the header over a scrolling body in every side panel and the cell detail sheet
  • (config) Data model v6 with the settings object and pinned apps
  • (settings) One resolver over the fixed lattice, read per cell
  • (editors) SettingsEditor at every level of the dashboard editor
  • (amplify) Skip regions by the app search rules and keep its lists
  • (domain) Repo matching, pin changes, problem actions and No app
  • (engine) Read Amplify apps found by repo
  • (ui) No app cells, Pin and Unpin in problems, the picker by repo
  • (credentials) Copy AWS policy per key
  • (amplify) Cancel an opt-in region's app search after OPT_IN_REGION_TIMEOUT_MS and skip it as unreachable
  • (board) Settings gears and the settings popup (N3d)
  • (board) One shared cell gear; no header gears under 640 px (Decision 60)
  • (transport) Send every reader through an injected transport
  • (demo) Simulate GitHub and Amplify from a declarative scenario
  • (demo) Play the acme scenario on the real board, with its editor
  • (credentials) Collapse the credentials panel, one credential open at a time
  • (board) Group frames and gutters drawn once (N5)
  • (credentials) [breaking] Remove the token expiry warning
  • (board) No board text under 13 px on a phone
  • (board) Cut a long row-group label before the first frame line on a phone
  • (board) No board text or summary chip under 13 px on any screen
  • (share) Share envelope, passphrase encryption, links and import planning
  • (share) Share / Export and Import dialogs, links opening on load
  • (share) Updating a board by importing it again
  • (share) Replace hint describes its choice; tab-only hint tells the truth
  • (share) Import from a pasted link as well as a file
  • First run (N7)
  • (share) Ask before replacing a secret that differs from this device's
  • (hosting) Amplify build spec, CSP and security headers, served by vite preview
  • (app) What's new, the error screen with Report an issue, and the version in the menu
  • (board) Comma hint on a focused badge; commit counts agree with their noun (Decision 74)
  • (perf) The reload target bounds the median reload (Decision 74 item 3)
  • (board) Drop double-tap zoom on touch screens

🐛 Bug Fixes

  • (domain) Determining job supplies the cell's phase label
  • (domain) Address Copilot review on PR A
  • (github) Address Copilot review on the HTTP client and reader
  • (amplify) Address Copilot review on paging and repeated reads
  • (engine) Address Copilot review on the board engine
  • (board) Labelled row dividers draw their line above the group label
  • (board) Address Copilot review on the board
  • Address Copilot review on credentials and editors
  • (board) Unwrap cells by truncating branch and message in every format
  • (board) Zoom range, percentage zoom label, badge after the commit
  • (board) Scroll the grid with the main window; remove the mini-map
  • (board) 10% zoom steps, height-budget zoom, pinned chrome, review fixes
  • (board) Measure the grid area from the window; size the badge slot from actual badges
  • (board) Zoom-in budget relative to the board at 100%; narrower row names on phones
  • (board) Coloured badges, centred icons, reset icon, left-wrapping counter
  • (board) Separate diverged summary chip
  • (board) Compact toolbar, centred headers, centre wrapped header and toolbar
  • (board) Centre the summary chips between title and counter
  • (board) Space-between header and toolbar, battery budget meter, ringed chips, non-modal menu
  • (board) Wide and narrow header layouts, density icons, pinned row-group names
  • (board) Measured header layout, chip tooltips, home page fits narrow screens
  • (ui) Selects fit their options; show/hide secrets; clearer credential choices
  • Gaps from the spec review (dark theme, full run window, demo coverage)
  • Address Copilot review on groups, overrides, migration and sharing
  • Address Copilot review on #10
  • Address second Copilot review on #10
  • Pin column group labels and close their frame gap
  • Copilot review on configurable statuses
  • Amplify applies its source rule's keep; README to the code; coverage
  • Branch * needs a character; newer-version refusal wording; badges need a commit
  • Suggested and picked paths escape quotes and backslashes in key names
  • Only items where writes paths that parse for regex characters, backslashes and non-identifier keys
  • Key a cell's lead so React doesn't warn when an item shares its line
  • Strip byte-order marks and repair a garbled section sign
  • A translation's value can be cleared to empty text
  • Share one glob translation between glob checks and only items where
  • Label each source's branch pattern when a stage's patterns differ
  • Identify unmapped Amplify jobs by the branch Amplify read
  • List credentials by name, case-insensitive, ties by id
  • Copy a working account-wide AWS policy before apps are picked, drop GetJob
  • Choose the token for a new GitHub row and list each credential once
  • Collapsible lists follow focus, keep key identity and open statuses added for unknown runs
  • (ci) Prod PR guard runs on pull_request_target so a PR can't replace it
  • (ci) Rerun CI when a PR is retargeted, and test the workflow config
  • (perf) Hold reader wrappers weakly so fresh readers aren't retained
  • (perf) Attribute Amplify reads by their effective AWS key too
  • (perf) Count a closed board's late reads as stray for the next board
  • Current-version defect fixes (N1a)
  • (credentials) Close every tab before clearing site data; forget drops the tab copy first
  • (engine) Show a row that fails to derive as Error with a dismissable problem
  • Keep adapter error names through minification
  • Show only the message on er...
Read more