Repository navigation
Releases: karmaniverous/fooboard
Releases · karmaniverous/fooboard
Release list
fooboard@0.2.0
[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
[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...