Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 22:16
· 229 commits to main since this release
68a23fe

What's Changed

  • fix(console): a refused /auth/providers takes no path, and the caller gets the refusal (FRU-205) by @sakuga-agent[bot] in #217
  • fix(worker): the window of an invitation is of its workspace, and past it the invitation is kept (FRU-209) by @sakuga-agent[bot] in #218
  • test: four guards of the cookie sign-in that no test held (FRU-207) by @sakuga-agent[bot] in #221
  • fix(worker): /console/auth/get-session is not served, it answered the token of the session (FRU-206) by @sakuga-agent[bot] in #219
  • fix(worker): a call that renews the session of the console renews its cookie (FRU-208) by @sakuga-agent[bot] in #223
  • style(console): wide buttons and fields take the shape and the border of the boards (FRU-168) by @sakuga-agent[bot] in #227
  • feat(widget): keep notes for later and send them together (FRU-124) by @sakuga-agent[bot] in #220
  • refactor: the sign-in of before and the accounts file go (FRU-150) by @sakuga-agent[bot] in #222
  • fix(worker): a page of another site starts no sign-in with a provider (FRU-211) by @sakuga-agent[bot] in #231
  • fix(worker): an invitation does not outlive the right of whoever made it (FRU-209) by @sakuga-agent[bot] in #225
  • feat(worker): a workspace proves a domain by a DNS record, to cover the previews of a site (FRU-103) by @sakuga-agent[bot] in #224
  • feat: the extension attaches a picture of the element to a note, kept for the members (FRU-44) by @sakuga-agent[bot] in #209
  • feat(console): the Sites screen proves a domain, and names the site whose previews it covers (FRU-103) by @sakuga-agent[bot] in #226
  • feat(worker): a worker with no reviewer writes the pairing code of the one its operator names (FRU-108) by @sakuga-agent[bot] in #229
  • test(extension): the bridge keeps the address of a picture on https and http loopback (FRU-44) by @sakuga-agent[bot] in #237
  • fix(console): a tab sends nothing for another account than the one it was drawn for (FRU-210) by @sakuga-agent[bot] in #230
  • fix(worker): a change on a route of better-auth carries the Origin of the console (FRU-212) by @sakuga-agent[bot] in #233
  • fix(worker): an account and a workspace send a bounded number of invitations, under a fixed subject (FRU-209) by @sakuga-agent[bot] in #228
  • feat(console): the panel of a source that a person opens takes focus, and Escape gives it back (FRU-197) by @sakuga-agent[bot] in #238
  • test(worker): the routes of the console answer the console and no other origin (FRU-214) by @sakuga-agent[bot] in #239
  • fix(worker): one call at a time changes a workspace, and the smaller rules of the invitations (FRU-209) by @sakuga-agent[bot] in #234
  • test: the console reads mailed: false, and the window holds for calls at the same moment (FRU-209) by @sakuga-agent[bot] in #243
  • test(worker): the Scaleway mailer, and each thing a person typed is text in a message (FRU-215) by @sakuga-agent[bot] in #240
  • test: rules of the configuration, the language of an account, and three readings of the console (FRU-216) by @sakuga-agent[bot] in #241
  • test(worker): a guest of the workspace sends and reads the picture of a note (FRU-213) by @sakuga-agent[bot] in #244
  • feat(extension): a team wildcard serves the previews that the worker of the session lists (FRU-103) by @sakuga-agent[bot] in #232
  • fix(extension): an answer of a worker is kept only for the session that asked (FRU-103) by @sakuga-agent[bot] in #245
  • fix: a worker with accounts and no sign-in says so, and four small things of the configuration (FRU-217) by @sakuga-agent[bot] in #242
  • feat(worker): the owner and an admin rename a workspace (FRU-236) by @sakuga-agent[bot] in #250
  • feat: the tokens of the « simpler flow » mock-up in the widget, the extension, the e-mails and /pair (FRU-233) by @sakuga-agent[bot] in #252
  • docs(security): say which routes the workspace lock covers (FRU-236) by @sakuga-agent[bot] in #253
  • feat(widget): the pins, their frame and the dock at the measures of the mock-up (FRU-252) by @sakuga-agent[bot] in #256
  • feat(extension): a reviewer can keep the rules of sites in the account of the browser (FRU-72) by @sakuga-agent[bot] in #214
  • feat(worker): the notes in PostgreSQL, a store of the database with forget (FRU-218) by @sakuga-agent[bot] in #247
  • feat(widget): the bubble of a note at the measures of the mock-up (FRU-256) by @sakuga-agent[bot] in #261
  • feat(console): the tokens of the simpler-flow mockup and the kit of its components (FRU-232) by @sakuga-agent[bot] in #254
  • fix(extension): the echo of its own write to the browser account does not undo a later change made here (FRU-72) by @sakuga-agent[bot] in #251
  • feat(console): the logo, the frame of a page outside a workspace and a divider in the kit (FRU-232) by @sakuga-agent[bot] in #255
  • feat(worker): the Kv of a worker with a database is in PostgreSQL, shared by its replicas (FRU-67) by @sakuga-agent[bot] in #246
  • feat(console): a menu in the kit, for the workspace of the rail and the row of a site (FRU-232) by @sakuga-agent[bot] in #257
  • feat(widget): the banner of a capture, the name of the component and the composer of the mock-up (FRU-258) by @sakuga-agent[bot] in #263
  • ci(e2e): give the E2E job twenty minutes by @sakuga-agent[bot] in #272
  • feat(console): the frame of a workspace is the dark rail of the mockup (FRU-234) by @sakuga-agent[bot] in #258
  • feat(console): a sign-in page of its own, and the tab that asked for the link goes on by itself (FRU-235) by @sakuga-agent[bot] in #259
  • feat(console): the Sites screen is the table of the mockup, with a menu on each row (FRU-243) by @sakuga-agent[bot] in #262
  • fix(worker): an invitation that was kept is answered as kept when the counts of its message stop (FRU-67) by @sakuga-agent[bot] in #248
  • feat(console): the steps of the setup, a callout, option cards and a drawn browser in the kit (FRU-232) by @sakuga-agent[bot] in #260
  • feat(widget): the list of the page with its three tabs, at the measures of the mock-up (FRU-259) by @sakuga-agent[bot] in #275
  • feat(widget): a link that opens a note on its page (FRU-253) by @sakuga-agent[bot] in #276
  • feat(console): the Members screen is the form and the table of the mockup (FRU-247) by @sakuga-agent[bot] in #268
  • fix(console): after a site is removed, focus goes to the table and not to the top of the page (FRU-243) by @sakuga-agent[bot] in #280
  • feat(console): the Connectors screen is the list and the panel of the mockup (FRU-246) by @sakuga-agent[bot] in #266
  • feat(console): a list of a status, a longer name for a button and a named panel in the kit (FRU-232) by @sakuga-agent[bot] in #273
  • feat(console): My account lists the browsers where the console is signed in, and ends them (FRU-248) by @sakuga-agent[bot] in #269
  • feat(widget): a link to a note whose element is gone opens the list on « Could not be placed » (FRU-253) by @sakuga-agent[bot] in #282
  • test(console): the extension stays connected after My account signs browsers out (FRU-248) by @sakuga-agent[bot] in #283
  • fix(widget): a second capture over an open composer keeps the note and its frame (FRU-258) by @sakuga-agent[bot] in #278
  • feat(worker): a PostgreSQL schema of its own, in a database that exists already (FRU-219) by @sakuga-agent[bot] in #249
  • feat(console): the setup on one screen: your account, your site (FRU-239) by @sakuga-agent[bot] in #267
  • test(e2e): open the list again once its first read failed (FRU-268) by @sakuga-agent[bot] in #288
  • test(e2e): run the files of the suite on four workers on CI (FRU-268) by @sakuga-agent[bot] in #285
  • feat(worker): say in the log when the role of a schema of its own may still use public (FRU-266) by @sakuga-agent[bot] in #287
  • feat(console): the screen of an invitation: who invites, the role, « Join », then « You are in » (FRU-241) by @sakuga-agent[bot] in #270
  • feat(console): the last step of the setup: two cards, and an example page in the preview (FRU-242) by @sakuga-agent[bot] in #271
  • test(console): a press on « Sign out » waits for My account at rest (FRU-248) by @sakuga-agent[bot] in #293
  • fix(console): « Sign out » does not move when the list of the browsers arrives (FRU-248) by @sakuga-agent[bot] in #294
  • fix(console): a read made again keeps the rows of Members on the screen (FRU-271) by @sakuga-agent[bot] in #296
  • fix(console): « Add a source » waits for the list of the sources, so its buttons do not move under a press (FRU-271) by @sakuga-agent[bot] in #295
  • feat: pnpm dev and the E2E suite run on a PostgreSQL in the process (FRU-223) by @sakuga-agent[bot] in #277
  • feat(console): one image for every instance, published beside the worker, and a service of the compose file (FRU-222) by @sakuga-agent[bot] in #290
  • ci: a check of an absence in a step can fail: no command negated with ! (FRU-222) by @sakuga-agent[bot] in #292
  • docs(design): the mockup « simpler flow » of 2026-10-13 in design/simpler-flow (FRU-231) by @sakuga-agent[bot] in #298
  • feat(worker): an index of the notes of a workspace, and the counts of its sites (FRU-237) by @sakuga-agent[bot] in #300
  • test(worker): a visitor with no account leaves a note, on a worker with accounts (FRU-224) by @sakuga-agent[bot] in #281
  • feat(console): the Sites table has the six columns of the mockup and the legend of the statuses (FRU-270) by @sakuga-agent[bot] in #302
  • fix(console): « 2 h ago » across midnight, and the Sites spec reads moments on a fixed clock (FRU-270) by @sakuga-agent[bot] in #314
  • feat(console): the setup ends at the first note on the site (FRU-242) by @sakuga-agent[bot] in #312
  • fix(e2e): keep the test worker from closing idle connections (FRU-275) by @sakuga-agent[bot] in #317
  • feat(worker): migrate-to-postgres copies the notes of the SQLite file (FRU-220) by @sakuga-agent[bot] in #279
  • ci(e2e): run the E2E suite in three parts side by side (FRU-268) by @sakuga-agent[bot] in #286
  • feat(worker): the first administrator signs in by a link from the log or a command (FRU-221) by @sakuga-agent[bot] in #291
  • feat(worker): a person names themself and links or unlinks GitHub and Google (FRU-249) by @sakuga-agent[bot] in #299
  • feat(extension): the shell of the popup, and « Sign in to Fruitback » (FRU-251) by @sakuga-agent[bot] in #301
  • feat(worker): the list of the notes of a workspace, its filters, its search, and Send again (FRU-244) by @sakuga-agent[bot] in #306
  • feat(console): the Notes page lists the notes of a workspace and where they went (FRU-245) by @sakuga-agent[bot] in #313
  • feat(extension): a site of a workspace in the popup, one click then the switch (FRU-254) by @sakuga-agent[bot] in #309
  • fix(worker): forget empties the index whatever the store, and the index keeps no removed account (FRU-237) by @sakuga-agent[bot] in #308
  • fix(console): a delivery that Fruitback gave up says so on Notes (FRU-245) by @sakuga-agent[bot] in #323
  • fix(extension): screen 07 is drawn at once, and the notes of the page come when it answers (FRU-254) by @sakuga-agent[bot] in #324
  • fix(extension): a picture refused for its token is sent again once, and a missed one is said (FRU-238) by @sakuga-agent[bot] in #326
  • fix(worker): a rename reaches a refresh or a redemption in flight (FRU-249) by @sakuga-agent[bot] in #322
  • feat(worker): the extension asks, the console approves: a session of the account, with a word on both screens (FRU-238) by @sakuga-agent[bot] in #303
  • feat(console): « Connect this browser », the page that answers the extension (FRU-240) by @sakuga-agent[bot] in #305
  • feat(worker): the day a member was last seen, and the label of a browser (FRU-249) by @sakuga-agent[bot] in #307
  • feat(worker): the extension adds the site of its tab to a workspace (FRU-255) by @sakuga-agent[bot] in #310
  • feat(extension): add the site of the tab to a workspace from the popup (FRU-255) by @sakuga-agent[bot] in #311
  • fix(worker): a note of a session of an account reads its session again, and a token of a site carries no claim of a session (FRU-238) by @sakuga-agent[bot] in #325
  • docs(extension): screen 08 replaced the fields of before, which the settings keep (FRU-255) by @sakuga-agent[bot] in #329
  • feat(console): an owner or an admin reads « Last seen » on Members (FRU-247) by @sakuga-agent[bot] in #315
  • fix(extension): a session that ended keeps the note, and the popup offers to sign in again (FRU-238) by @sakuga-agent[bot] in #327
  • fix(extension): the console says why the relay answered 401 with no session (FRU-238) by @sakuga-agent[bot] in #328
  • feat(console): My account changes the name, links and unlinks a provider, and names each browser (FRU-249) by @sakuga-agent[bot] in #316
  • feat(console): My account lists the browsers of the extension, and disconnects one (FRU-249) by @sakuga-agent[bot] in #331
  • fix(console): two follow-ups of My account: a name after a refused one, and the line of a failed read (FRU-249) by @sakuga-agent[bot] in #332
  • feat(worker): the guest of one site reads and writes on its sites only, and never sees the tracker (FRU-250) by @sakuga-agent[bot] in #334
  • feat(console): invite a guest of one site, and the invitation of a guest (FRU-250) by @sakuga-agent[bot] in #335
  • feat: an invitation keeps whether its message left, and Members says it after a reload (FRU-269) by @sakuga-agent[bot] in #337
  • ci(worker): give the mutation dry run of the worker 15 minutes by @sakuga-agent[bot] in #338
  • feat(worker): a worker refuses to start without PostgreSQL, and the compose file runs one (FRU-225) by @sakuga-agent[bot] in #336
  • docs: self-hosting starts from PostgreSQL, a first admin, then a site (FRU-227) by @sakuga-agent[bot] in #340
  • refactor(worker): the SQLite stores and their fixture go, and their tests run on PGlite (FRU-226) by @sakuga-agent[bot] in #341
  • fix(worker): pair mints for a workspace of the database and one of its members (FRU-277) by @sakuga-agent[bot] in #342
  • fix(extension): a rule too large for the account no longer stops the copy of the others, and the options page names it (FRU-264) by @sakuga-agent[bot] in #343
  • fix(worker): the limiter of better-auth counts in the Kv of the database, shared by every replica (FRU-229) by @sakuga-agent[bot] in #344
  • feat(worker): an instance accepts invited people only by default, and FRUITBACK_SIGN_UP=anyone opens it (FRU-278) by @sakuga-agent[bot] in #345
  • feat(worker): the first account is the admin of the instance, and reads every workspace with a trace (FRU-261) by @sakuga-agent[bot] in #346
  • feat(worker): a site that goes takes the notes that Fruitback keeps for it (FRU-194) by @sakuga-agent[bot] in #349
  • feat(console): the frame of the instance administrator and its « Instance » screen, read-only (FRU-262) by @sakuga-agent[bot] in #354
  • feat(worker): the administrator of the instance reads every note, its text only where the worker keeps it (FRU-272) by @sakuga-agent[bot] in #347
  • feat(worker): a store writes a reply under a note, after a line that says who wrote it (FRU-257) by @sakuga-agent[bot] in #350
  • feat(worker): POST /feedback//replies takes a reply from the page, by the rule of who may (FRU-257) by @sakuga-agent[bot] in #351
  • feat(widget): a reader replies to a note from its thread, where the worker lets them (FRU-257) by @sakuga-agent[bot] in #353
  • feat(console): the administrator reads every note of the instance, its text only where Fruitback keeps it (FRU-273) by @sakuga-agent[bot] in #355
  • feat(console): the administrator reads the workspaces and the people of the instance, read-only (FRU-263) by @sakuga-agent[bot] in #356
  • fix(console): a key typed while the search is written in the address stays in the field (FRU-279) by @sakuga-agent[bot] in #357
  • feat(worker): an instance admin names and removes an admin, never the last one, and each action leaves a trace (FRU-280) by @sakuga-agent[bot] in #358
  • feat(worker): an instance admin suspends and restores an account, whose sessions end at once (FRU-281) by @sakuga-agent[bot] in #360
  • feat(console): an instance admin names and removes an admin from Users, never the last one (FRU-280) by @sakuga-agent[bot] in #359
  • feat(console): an instance admin suspends and restores an account from Users (FRU-281) by @sakuga-agent[bot] in #361
  • fix(console): the admin switch of an account restored since the read says its role is not known yet (FRU-281) by @sakuga-agent[bot] in #362
  • feat(worker): an instance admin suspends and restores a workspace, whose sites answer as unknown (FRU-282) by @sakuga-agent[bot] in #363
  • fix(widget): French says « note » everywhere, and a send status starts with a capital (FRU-287) by @sakuga-agent[bot] in #365
  • feat: the tokens of the mock-up of 2026-10-20, warm greys, new status colours and one accent per surface (FRU-292) by @sakuga-agent[bot] in #367
  • fix(widget): a refused copy opens its fallback field on the first line, not the last (FRU-288) by @sakuga-agent[bot] in #366
  • feat(extension): the kit of the extension, shared by the popup, the side panel and the page (FRU-293) by @sakuga-agent[bot] in #371
  • fix(widget): no note is about a library's component, and a pin's name is cut at a word (FRU-320) by @sakuga-agent[bot] in #381
  • fix(widget): « Send » ends the row of the composer's foot in every language (FRU-317) by @sakuga-agent[bot] in #374
  • fix(widget): a read of the notes that fails is seen on the page, and read again by itself (FRU-316) by @sakuga-agent[bot] in #380
  • feat(extension): the popup in four screens, its shell of 380 px, « signed out » and « a problem, with its fix » (FRU-297) by @sakuga-agent[bot] in #377
  • feat(extension): the page of the extension, its menu, and « Sites » as a table with the panel of a rule (FRU-301) by @sakuga-agent[bot] in #379
  • test(e2e): make the FRU-317 foot test and the sidebar list test deterministic by @sakuga-agent[bot] in #382
  • feat: an instance admin deletes a workspace after typing its name, and the trace outlives it (FRU-284) by @sakuga-agent[bot] in #364
  • feat(worker): a person confirms or reopens a note the team marked done, in its store (FRU-294) by @sakuga-agent[bot] in #369
  • feat(worker): GET /session/sites says where the notes of a site go, and how many fixes wait for the person (FRU-295) by @sakuga-agent[bot] in #375
  • feat: an instance admin changes roles, members, the owner, invites and makes a workspace, written at once and traced (FRU-283) by @sakuga-agent[bot] in #370
  • feat(extension): Alt+Shift+F starts a note, from a command of the manifest the browser lets you change (FRU-291) by @sakuga-agent[bot] in #368
  • feat: an instance admin deletes an account after typing its address, refused while it owns a workspace alone (FRU-285) by @sakuga-agent[bot] in #373
  • fix(worker): one verdict at a time on a note, and 502 when the index does not answer (FRU-294) by @sakuga-agent[bot] in #376
  • feat(widget): the note being written is saved as it is typed, and comes back on its element (FRU-311) by @sakuga-agent[bot] in #372
  • feat(extension): the widget says at once that the session ended, and its button opens the sign-in (FRU-315) by @sakuga-agent[bot] in #378
  • fix(extension): the shortcut falls back on the active tab when the browser gives no tab (FRU-291) by @sakuga-agent[bot] in #385
  • fix(widget): a saved text does not reopen by itself once the person chose an element (FRU-311) by @sakuga-agent[bot] in #388
  • feat(extension): « Share rules » is two cards, Download and a drop zone, with no native file field (FRU-290) by @sakuga-agent[bot] in #387
  • fix(console): a local host typed with no scheme is http, and every screen writes the scheme of a site (FRU-314) by @sakuga-agent[bot] in #386
  • fix(extension): a failed check for an open popup is written down before the sign-in opens one (FRU-315) by @sakuga-agent[bot] in #390
  • fix(console): « Hosted in Europe » for the Cloud only, the script wraps in its card, and a REST address keeps one line at 390 px (FRU-321) by @sakuga-agent[bot] in #389
  • feat(extension): the side panel of the browser, opened from the popup, that follows the active tab (FRU-296) by @sakuga-agent[bot] in #396
  • test(e2e): the autosave specs wait for React to hydrate the page before they add an element or mount the widget by @sakuga-agent[bot] in #401
  • feat: « Install the extension (beta) » leads to a guide for non-developers, and a welcome page opens at install (FRU-318) by @sakuga-agent[bot] in #392
  • test(e2e): the loading line of the instance is told apart from the one of « Deleted workspaces » by @sakuga-agent[bot] in #402
  • feat(console): « Connect this browser » leads to the sign-in of the popup on Fruitback Cloud, with no pairing code (FRU-313) by @sakuga-agent[bot] in #393
  • feat(extension): « Notes on this page » in the side panel, from the widget of the tab: Open and Done, replies, « Show on the page », « Reply » (FRU-299) by @sakuga-agent[bot] in #398
  • feat(extension): « Ready to check » in the side panel, « Looks fixed » and « Still wrong », and the verdict path in the relay (FRU-300) by @sakuga-agent[bot] in #399
  • fix(extension): a tab with no widget does not leave the side panel reading for ever (FRU-299) by @sakuga-agent[bot] in #404
  • docs: the reviewer's guide shows each step, Cloud and own server apart, and the guides hold 4.5:1 (FRU-322) by @sakuga-agent[bot] in #397
  • feat(widget): the dock is one capsule, and a capture turns it dark with its way out (FRU-303) by @sakuga-agent[bot] in #391
  • feat(widget): pins are drops of 28 px that point at their element, and the thread of a note opens in the list (FRU-304, FRU-312) by @sakuga-agent[bot] in #395
  • test(e2e): the side panel spec of a tab with no widget waits for what the panel shows (FRU-299) by @sakuga-agent[bot] in #407
  • feat(widget): the composer and the settings of the mock-up of 2026-10-20 (FRU-305) by @sakuga-agent[bot] in #406
  • feat(extension): the popup asks « Turn Fruitback on for this site? », and a site that is on shows what waits (FRU-298) by @sakuga-agent[bot] in #408
  • fix(widget): a note sent without its picture keeps its identifier, and a marked pin is drawn above the others (FRU-326) by @sakuga-agent[bot] in #409
  • feat(extension): « Workers and sessions » and « Preferences » on the page of the extension (FRU-302) by @sakuga-agent[bot] in #405
  • test(e2e): the notes filter spec waits for the read of the search, not for its address (FRU-327) by @sakuga-agent[bot] in #411
  • feat(console): an instance admin suspends and restores a workspace from its panel (FRU-323) by @sakuga-agent[bot] in #412
  • docs: the reviewer's guide shows the popup « Turn Fruitback on for this site? » and the composer of today by @sakuga-agent[bot] in #413
  • fix(worker): a workspace keeps an owner when a route of better-auth races the deletion of an account (FRU-324) by @sakuga-agent[bot] in #410
  • ci: the tag of a release submits the extension to the Chrome Web Store and to AMO, after an approval (FRU-329) by @sakuga-agent[bot] in #415
  • feat(worker): GET /session/notes lists the notes of a whole site for the extension (FRU-306) by @sakuga-agent[bot] in #416
  • feat: a member of a suspended workspace reads a banner, and the instance admin filters « Suspended » (FRU-328) by @sakuga-agent[bot] in #417
  • feat(widget): the list of the page is the board « Sidebar mode », over the page (FRU-308) by @sakuga-agent[bot] in #414
  • fix(console): a refusal of a write of another workspace does not mark the one on screen as suspended (FRU-328) by @sakuga-agent[bot] in #420
  • docs: the home page of the site is the board « Landing », with what is true today (FRU-309) by @sakuga-agent[bot] in #421
  • feat(extension): « Search and options » in the side panel: search, « This page / Whole site », status chips, detached notes, pins (FRU-307) by @sakuga-agent[bot] in #419
  • feat(extension): the Firefox manifest declares the data it sends, and asks for Firefox 140 (FRU-333) by @sakuga-agent[bot] in #422
  • docs: what the Cloud host holds, and the runbook as the host runs it (FRU-106) by @sakuga-agent[bot] in #424
  • feat: new status colours and a zinc palette shared with the console (FRU-334) by @sakuga-agent[bot] in #426
  • docs: a worker behind PgBouncer, measured in session and transaction mode (FRU-267) by @sakuga-agent[bot] in #429
  • fix(widget): the edge of an orphan's drop is drawn under its fill (FRU-334) by @sakuga-agent[bot] in #431
  • fix(extension): an unreachable workspace site, the account's language, one identity, and the workspace on the page (FRU-319) by @sakuga-agent[bot] in #432
  • fix(extension): the late language redraws only a settled screen, and the download counts without reading back (FRU-319) by @sakuga-agent[bot] in #434
  • fix(worker): name a pooler in transaction mode when it loses the lock of the migrations (FRU-335) by @sakuga-agent[bot] in #435
  • test(worker): start PGlite from a cached initdb, and reset a migrated database by TRUNCATE (FRU-339) by @sakuga-agent[bot] in #437
  • feat(console): serve the widget script at a versioned, immutable address (FRU-106) by @sakuga-agent[bot] in #423
  • feat(worker): « Who can leave a note »: a site read by members refuses a note with no session, by default (FRU-330) by @sakuga-agent[bot] in #425
  • ci(mutation): mutate each file in a job of its own, so the full worker run ends in time (FRU-336) by @sakuga-agent[bot] in #436
  • feat(console): « Who can leave a note? » for a site that its members read, « Members only » first (FRU-330) by @sakuga-agent[bot] in #428
  • feat(widget): no note is offered where the worker says canWrite: false, and the popup says why in private mode (FRU-330) by @sakuga-agent[bot] in #430
  • ci: bump the github-actions group across 1 directory with 5 updates by @dependabot[bot] in #418
  • docs: what one mutant costs under tap, and the cut to make next (FRU-342) by @sakuga-agent[bot] in #442
  • feat(worker): the files of a note go to the ticket of the tracker, and Fruitback keeps only the transit, 7 days at most (FRU-331) by @sakuga-agent[bot] in #427
  • feat: join to a note a capture of the page, of an area, an image or a file, when the note goes to a tracker (FRU-332) by @sakuga-agent[bot] in #433
  • ci: each long job writes its durations to the run summary, and warns past 60 % of its limit (FRU-343) by @sakuga-agent[bot] in #439
  • fix(widget): Esc and Enter of the area of a capture give the focus back to « Capture an area » (FRU-353) by @sakuga-agent[bot] in #445
  • docs: frame custom statuses, tracker states and colours before any code (FRU-352) by @sakuga-agent[bot] in #446
  • feat(widget): « Attach » opens a menu to add a file, capture an area or the whole page, or drop a file, and no pin is on a capture (FRU-351) by @sakuga-agent[bot] in #447
  • feat(widget): hide the CSS selector in the thread of a pin by default (FRU-349) by @sakuga-agent[bot] in #451
  • refactor(worker): fewer mutants, by writing five files of the core more simply (FRU-347) by @sakuga-agent[bot] in #443
  • test(worker): a site that sends to a three-stage connector announces three stages, not the worker's five (FRU-357) by @sakuga-agent[bot] in #448
  • refactor(worker): fewer mutants in identity.ts and session.ts, with the same tokens (FRU-347) by @sakuga-agent[bot] in #444
  • refactor(worker): split app.ts into one module per group of routes, with no change of behaviour (FRU-363) by @sakuga-agent[bot] in #455
  • fix(widget): no file joins a note while it is sent, dropped, picked or captured (FRU-373) by @sakuga-agent[bot] in #458
  • refactor(worker): GET and POST /feedback move out of app.ts into feedback-routes.ts, and app.ts falls to 36 KB (FRU-374) by @sakuga-agent[bot] in #460
  • refactor(worker): the texts of the mutated core live outside it, and two test seams are left out of the score (FRU-347) by @sakuga-agent[bot] in #459
  • feat(extension): paint the accent of the console and the widget (FRU-372) by @sakuga-agent[bot] in #465
  • test(worker): kill five mutants that a timeout counted as killed (FRU-345) by @sakuga-agent[bot] in #464
  • fix: one rule for text wrapping in the widget, the extension and the console (FRU-350) by @sakuga-agent[bot] in #457
  • feat(worker): a workspace connects GitHub by an installation of the App, with a token for one repository at a time (FRU-359) by @sakuga-agent[bot] in #456
  • feat(shared): optional statuses and status in the read envelope (FRU-364) by @sakuga-agent[bot] in #453
  • ci: mutation reports on a pull request and no longer blocks it; main and the schedule still hold the line by @sakuga-agent[bot] in #452
  • test(worker): run the tests of the worker on vitest, and mutate it with the vitest runner of StrykerJS, per test (FRU-346) by @sakuga-agent[bot] in #450
  • test(worker): run github-connector.test.ts on vitest, as every other test of the worker (FRU-346) by @sakuga-agent[bot] in #467
  • feat(worker): an owner installs the GitHub App on a workspace, and the worker attaches only an installation the person can reach (FRU-360) by @sakuga-agent[bot] in #461
  • test(worker): run github-app-flow.test.ts on vitest, as every other test of the worker (FRU-346) by @sakuga-agent[bot] in #468
  • fix(extension): a capture whose JPEG fails is said too large, not « not taken » (FRU-338) by @sakuga-agent[bot] in #470
  • fix(worker): read back the files of Fruitback on a Linear issue with more than ten attachments (FRU-348) by @sakuga-agent[bot] in #469
  • ci(mutation): 3 runners of StrykerJS on the 4 vCPU of a job, so that a late kill is not a timeout (FRU-345) by @sakuga-agent[bot] in #454
  • test(worker): kill the mutants that survive in clients.ts, kv.ts and cache.ts (FRU-376) by @sakuga-agent[bot] in #471
  • feat(console): show the site itself in the preview of the setup (FRU-354) by @sakuga-agent[bot] in #472
  • ci: run again under a French locale only the test files that read the locale (FRU-344) by @sakuga-agent[bot] in #474
  • fix(console): keep the rail on screen between a workspace and the administration (FRU-356) by @sakuga-agent[bot] in #478
  • feat(worker): a table of statuses per site, and its migration (FRU-365) by @sakuga-agent[bot] in #473
  • docs: frame the rename of the five stages to generic names (FRU-355) by @sakuga-agent[bot] in #482
  • test(worker): the sources that ci-locale.test.ts reads are inputs of the test target of the worker (FRU-344) by @sakuga-agent[bot] in #483
  • feat(console): show the Google and GitHub marks on the sign-in buttons (FRU-362) by @sakuga-agent[bot] in #484
  • test(worker): fail test-discovery when a test of the worker imports node:test, and the timeouts measured under vitest (FRU-345) by @sakuga-agent[bot] in #481
  • test(e2e): a click that closes the popup expects the popup to close under it (FRU-375) by @sakuga-agent[bot] in #485
  • fix(console): the host of a site wraps anywhere, so its column fits 390 px (FRU-379) by @sakuga-agent[bot] in #489
  • test: kill the surviving mutants of the shared contract, identity.ts and session.ts, and raise their lines (FRU-377) by @sakuga-agent[bot] in #477
  • ci: a pull request mutates incrementally, from the newest report of each file on its base branch (FRU-341) by @sakuga-agent[bot] in #449
  • ci: the four images build side by side in one bake, with their cache in the registry, and only when a file of them changed (FRU-344) by @sakuga-agent[bot] in #475
  • refactor(worker): drop two guards no input reaches, and raise the mutation lines of clients, kv, rate-limit and cache to 100 (FRU-376) by @sakuga-agent[bot] in #480
  • feat: name the five stages new, todo, progress, done and closed (FRU-355) by @sakuga-agent[bot] in #486
  • feat(worker): the console sets the statuses of a site, and the read carries them (FRU-366) by @sakuga-agent[bot] in #487
  • test(worker): read the files git lists in the guard of the stage names, so a mutation run passes its dry run (FRU-355) by @sakuga-agent[bot] in #491
  • docs: use the generic stage names in the documents (FRU-355) by @sakuga-agent[bot] in #488
  • feat(console): the statuses of a site, on a page of their own (FRU-371) by @sakuga-agent[bot] in #493
  • feat(widget): paint a pin with the colour and the name of its status (FRU-370) by @sakuga-agent[bot] in #496
  • fix(console): the dev server bundles zod at its start, so a first visit of the statuses reloads no other page by @sakuga-agent[bot] in #498
  • feat(extension): the side panel draws the colour and the name of a status (FRU-370) by @sakuga-agent[bot] in #497
  • feat(worker): the person who left a note, or a role that manages sites, sets its status (FRU-367) by @sakuga-agent[bot] in #492
  • refactor(worker): identity.ts drops a type check that Number.isFinite already makes, and reaches a mutation score of 100 (FRU-377) by @sakuga-agent[bot] in #479
  • feat(worker): the states of Linear are statuses of a site, in Linear's colours when it asks (FRU-368) by @sakuga-agent[bot] in #494
  • feat(console): the states of Linear on the statuses page of a site, and « Use Linear's colours » (FRU-368) by @sakuga-agent[bot] in #495
  • feat: the console connects GitHub to a workspace, and a site chooses a repository for each destination (FRU-361) by @sakuga-agent[bot] in #500
  • fix(worker): a Linear that did not answer is left alone for a minute, not asked again at every read (FRU-381) by @sakuga-agent[bot] in #501
  • feat(worker): the four statuses of a GitHub issue, one list per connector (FRU-369) by @sakuga-agent[bot] in #502
  • ci: release-extension.yml gives ci.yml the packages: read it asks for, so the release starts again (FRU-383) by @sakuga-agent[bot] in #503
  • feat(console): one list of statuses per GitHub connector, whatever its repositories (FRU-369) by @sakuga-agent[bot] in #504
  • feat(worker): choose the status of a note from the console (FRU-384) by @sakuga-agent[bot] in #505
  • feat(console): choose the status of a note in the notes list (FRU-384) by @sakuga-agent[bot] in #506
  • feat(console): the drop of a note's status takes the status colour (FRU-385) by @sakuga-agent[bot] in #508
  • docs: the guides match the product after FRU-352, FRU-361 and FRU-330 (FRU-387) by @sakuga-agent[bot] in #512
  • docs: the landing of fruitback.com after the mock-up landing V2 (FRU-387) by @sakuga-agent[bot] in #510
  • feat(worker): keep whether the repository of a GitHub destination is private (FRU-382) by @sakuga-agent[bot] in #509
  • feat(console): warn about a public GitHub repository from the destination (FRU-382) by @sakuga-agent[bot] in #511
  • chore: version 0.3.0 by @sakuga-agent[bot] in #514
  • ci: a v* tag publishes the five packages to npm with provenance, and a change to one carries a changeset (FRU-28) by @sakuga-agent[bot] in #515
  • ci: release-npm.yml publishes with npm trusted publishing alone, and keeps no npm token (FRU-28) by @sakuga-agent[bot] in #516

Full Changelog: v0.2.0...v0.3.0