Repository navigation
·
493 commits
to 6e262d21c2f2fedf7dc60320959d2c54714fc7f0
since this release
1.0.0 (2026-10-18)
⚠ BREAKING CHANGES
discordGuildIdanddiscordWebhookUrlare no longer part of the market contract, andPOST /markets/{id}/discord/notify-assignmentno longer exists. Stored documents keep the keys harmlessly; nothing reads them.
Features
- a deployment says whether it can serve a request (07ea9a3)
- a seat's hint sits in its top right corner (aad143a)
- a table-share request finds its partner (E27) (f365a32)
- among equals, a vendor who will take fewer tiers is placed first (9f9e91f)
- an answer naming several addresses pairs with the first applicant (dc4cd43)
- applicant: the form asks dates and tiers as one grid (f09734c)
- application: a vendor has a name (e9603a8)
- assignment: assign runs in the assignment phase and nowhere else (211e58d)
- assignment: pair vendors who ask to share a table (5853353)
- assignment: say why a vendor has no table (dce7342)
- assignment: the solver places around pinned vendors (052bd67)
- check-in: make the check-in page work on a phone (2923d27)
- checkin: the page names the market and says which day (f1464d2)
- contract: tier preference is answered per date (a750bf1)
- csv-proposal: hosted TypeSafe settles what the rules cannot (2ce5c3f)
- csv-proposal: the file proposes the plan (79c8a89)
- csv-proposal: the rules propose what each CSV column is (6db0726)
- dialog: a dialog is a form, and the create-market dialog proves it (4893657)
- dialog: every dialog is the same thing, and Enter means one thing (664d715)
- dialog: manage organization stays open (84b216d)
- E17-E20 - the workspace follows the phase, the real form, and one dialog (d7df80a)
- E21 - the market frame, one market from the server, and named writes (5735e17)
- E22 the assignment tab, E23 the plan uses its space (0f3d7ee)
- E28 The details line up (81c20fb)
- each market date is its own row, flowing in columns beside the calendar (64979ae)
- essential: a vendor's preferred name (5660117)
- find a market on the Markets page (E25) (314e7a7)
- fixtures: anonymise a form export by who shares each value (68516a6)
- forms: let a market declare a preference ordering unasked (5ecf9f8)
- import: the form is fixed without leaving the import (720ca33)
- import: the importer says what a single column cannot tell it (ddf5c1d)
- lifecycle: the phase rail (66eadb0)
- market-setup: start from a draft's Google Form responses (5eb6f94)
- market: market dates are chosen on a calendar (966a29e)
- markets: a market belongs to one organization, for good (018a58f)
- markets: a run records what it was made from (25e6bc2)
- markets: intake mode is an organizer choice (7dc6935)
- markets: leaving draft is finalizing, and it is recorded (2c188b5)
- markets: Market Setup is addressed by id and reads the one store (ba22588)
- markets: nothing about a market is stored in the browser (689cb48)
- markets: one store holds the open market, as the server has it (8eb6265)
- markets: renaming is its own write, and only while a draft (b35de1d)
- markets: search, sort and filter the Markets page (3325cf1)
- markets: the application chip (46258cb)
- markets: the assignment rules close with the assignment (131ebe8)
- markets: the form lock is on the market, and nothing borrows it (2bbd082)
- markets: the plan saves only the plan (f70b755)
- markets: the whole-market PUT is gone (c00bbc8)
- markets: Vendors, Import and the floorplan editor are addressed by id (2bcde91)
- market: the applications surface says which phase it is in (bd6fd35)
- market: the assignment surface (557b50a)
- market: the plan is one ordered page (db59513)
- market: the workspace opens the surface the phase is worked on (0ced4d1)
- new-market: I already have a Google Form (a5e478a)
- organizations: deleting an organization is safe (c4d9ad7)
- phases: let a market return to draft before anyone has applied (74ce274)
- phases: publishing lands in market_days, archived means finished (adfae56)
- placements: a pin that cannot be honoured (84055d6)
- placements: a placement has one writer (fd0062c)
- placements: a trail for placements (cb3271c)
- remove the Discord webhook (1c898ff)
- review: decide one application at a time, with its answers in front of you (bdfa350)
- review: the market says which answers a reviewer reads first (4100545)
- review: the marks are changed from the queue, where the knowing is (9ff90e8)
- start-from-csv: one confirm writes it all (6c0f2e4)
- start-from-csv: the organizer corrects the proposal (d118a1d)
- start-from-csv: the proposal ledger (9485a08)
- tables: place and swap on the Tables view (6a9e8e2)
- the door on market day knows who is missing (E29) (52f91e0)
- the door on market day knows who is missing (E29) (854bbc2)
- the form started from a CSV (E24) (59677cf)
- the month arrows and the current dots are centred (5866316)
- the priority rules table is drawn from the primitives (10a631b)
- the table counts filter the tables to their status (7f2dabc)
- the vendors page filters as the tables page does (15f952f)
- ui: every market page has its own address, and one bar reaches them (601e7f2)
- ui: every market screen is one width (7485da2)
- ui: every vendor surface shows the name (9c698ab)
- ui: one add-row control, owned by the primitive layer (ad9b27a)
- ui: one design language - E15 corrections and E16 migration (8c90fc7)
- ui: plan cards share a row, by one written rule (ea6228c)
- ui: Tables, Attendance and Vendors stand in the frame (a952f6b)
- ui: the assignment rules read as settled after the assignment (38d3535)
- ui: the Assignment tab has three pages (6a7a22e)
- ui: the drag handle reads as a handle (292de34)
- ui: the market dates are listed by month beside their calendar (2f912a1)
- ui: the market frame stays put (3a6f0a7)
- ui: the primitive layer (cba83c2)
- ui: the Result page is the assignment, read and changed (a3aeb59)
- ui: the result says when it is out of date (89f28de)
- ui: the scale, written down (eaee9a4)
- ui: the statistics open under the result (b31131c)
- ui: the top bar never scrolls away (72875cd)
Bug Fixes
- a deep link to any page of conventioner.io opens that page (6c68dea)
- a locked intake choice is legible, and drawer answers link (706ee9e)
- a pair always shares, and a blank half-table share assigns (0ae069f)
- a ranked answer's hover band has room around its rank (de75d88)
- a settled market's rules read one answer to a line (0a9343a)
- a settled market's rules read one answer to a line (9944f16)
- a11y: a priority rule's controls are named, and its removes are buttons (edece8b)
- a11y: every control is named, and menus, tabs and dialogs are what they look like (98e7a17)
- applicants: a returning vendor changes their answers, signed in (a94e4d9)
- applicants: a vendor reads their verdict after applications close (101d2c1)
- applicants: a vendor who has never applied can apply online (c1636c8)
- applicants: a vendor's saved application is a bounded read, and a failed one says so (64486a6)
- application-form: a switched-off Section preference stays off (b1729d4)
- assignment: a blank ceiling runs, and the options look like fields (74b45c5)
- assignment: plans without tiers assign (3aeeae0)
- assignment: the payoff screen reads (be150a3)
- auth,nav: the drawer's rows and the password pages line up (73ae468)
- auth: authorize every route against the session, not a header (685cebc)
- auth: move the identity seam where the blueprints can reach it (beca98d)
- auth: require a session to delete an account (df3e61d)
- auth: reset and verification links work signed out (d655836)
- auth: the sign-in screen reads (9678a52)
- blockers: a resolution link names the tab that holds the fix (ea5e90d)
- blockers: the orphaned-pin guard pointed at a tab holding neither remedy (1d9bdfd)
- check-in: a vendor is sent to the seat stored for them (176f9c2)
- check-in: an archived market that ran keeps its page, as a record (6be7b1b)
- check-in: the email field keeps its height on a phone (aaff313)
- checkin: the vendor page stops scrolling past a window it already fits (90b706b)
- copy: what each screen and email says is true (4db6088)
- csv-proposal: review findings on the column proposal (3612e91)
- csv-proposal: review findings on the plan proposal (b36f600)
- csv-proposal: send TypeSafe only what its threshold was measured on (0ee2c10)
- csv: detect a grid whose question spans several lines (60c177f)
- csv: store a submission timestamp as a moment (036f77e)
- dashboard: the first screen asks the server whether you have a market (65278b8)
- dashboard: the offline card, the contradicted comment, the borrowed count (7b6aa0f)
- dates: every market date prints its year once (e7649d6)
- db: every field a document is looked up by is indexed (5831a6b)
- db: every field a document is looked up by is indexed (616d8ec)
- deps: update the back end's flagged packages (2ce50d7)
- deps: update the packages Dependabot flags (c2d5e39)
- dev: reset_database clears every collection it claims to (7a44bbc)
- docs: reopen the stall story - it recurred on CI with evidence (e480ef1)
- e14: the second-walk corrections that carry no decision (b6402f3)
- e2e: a member of one organization has no organization to choose (5a9205c)
- e2e: a NodeList is not iterable under the e2e tsconfig (e8faad8)
- e2e: the create-market dialog spec makes its own choice of organizations (2e5831e)
- fixtures: key stand-ins on the source and tighten the leak check (dc5ff46)
- floorplan: the beta places the tables it is asked for (7ad0bfa)
- frame: every page of a market puts its frame in the same place (3254eaa)
- import: a day written in words is the market day it names (d10ac17)
- import: a file with no rows previews no rows (b1c3ed3)
- import: a form that never asked how many days imports (cf0a17b)
- import: an ignored answer and a blank row say what happened (df4e3db)
- import: an option with a comma of its own is one answer (b48afb6)
- import: headings, grids and choices line up in the import and the proposal (9c7d736)
- import: the import flow sizes itself like every other screen (9fbb6e0)
- import: the import reports what it does (9b290e3)
- import: ticked Google checkboxes and table sizes import (0eb2d8d)
- import: value decisions stay on the page, to be changed (6c07070)
- import: write only the rows the preview imports (c086ec1)
- lists: market and organization rows read cleanly (edf3cfb)
- manage-market: the dialog's controls, refusals and delete hold together (871f9e4)
- market-setup: one plan edit is one save (1be4550)
- markets: a market PUT refuses an organization creation would refuse (1a22489)
- markets: a market remembers where it has been (525d153)
- markets: a market's records go with it (f7b21c3)
- markets: a public address belongs to one market (59a8953)
- markets: an archived market is a record, and cannot change (00eb8b0)
- markets: code review of E21 (ed8261c)
- markets: each person is offered only what their role lets them do (dd4835e)
- markets: review findings on the market finder (65b6497)
- markets: whoever creates a market owns it (69f4b12)
- modals: every modal holds the page inert, not just the vendor drawer (88f494c)
- modals: the shape the CSS rule could not see, and the drawer that never closed (e90330a)
- placements: a hand change says every answer it overrides (328a3da)
- placements: an orphaned pin is marked, and holds Publish back (1819ff4)
- production builds, serves deep links and reports its health (dccfbbb)
- proposal: keep every applicant's answer, and whole labels (9f1ee9f)
- result,review: seats, sizes, verdicts and chips read cleanly (4b19fc9)
- review: a web address in an answer is a link (902cac9)
- review: Publish Results follows intake mode (ce64d78)
- setup: row controls look like controls and reach the keyboard (a934d4e)
- setup: saving says it saved, and clamping says why (3103578)
- start-from-csv: review findings on the confirm (0b24c41)
- start-from-csv: review findings on the corrections (9a1a0b1)
- start-from-csv: review findings on where it starts (854cf0b)
- table-share pairs hold at the edges the review found (cf32a84)
- tables: a count of zero loses its colour (1c7fd54)
- tables: prove the amber, which the first test did not (1b092a9)
- the back end builds on Vercel again (13f98cc)
- the check-in card says the table in words (c8ae0f4)
- the screens the real market reads say what is true (e3f27a4)
- the screens the real market reads say what is true (7378232)
- the user flows hold (E26) (dd1a3a7)
- ui: a market tab stays readable under the pointer (8500912)
- ui: a screen without a market says so instead of pretending (3b8ef41)
- ui: a short market surface starts at the top (bb517e4)
- ui: buttons are button-sized (46018cb)
- ui: code review of E22 and E23 (7139464)
- ui: every colour the product paints has a name (ce7bfbf)
- ui: every control renders in the product's own typeface (5541874)
- ui: every overlay has a way out (d6e1664)
- ui: every page has a way onward (7ae7c46)
- ui: hints describe the state the market is actually in (bc15e06)
- ui: layout holds at every laptop size, and controls say what they do (04215fc)
- ui: links sit on their line, native controls are green, and Full name asks for the official name (00ad160)
- ui: load the weights the product asks for, and stop inheriting line-height (6d4dc15)
- ui: make the setup screens say and show what they mean (bd30cd6)
- ui: one date format, and it includes the year (785f30e)
- ui: one list row, and Open stops landing on a 404 (79ff9d1)
- ui: one name per concept (ad00b10)
- ui: one sizing model for an organizer screen (9310ae1)
- ui: panels hold their content, and one thing scrolls per page (caf7fa3)
- ui: plan-card headings and values share one grid (6b4cbf8)
- ui: plan-card rows render whole (cc0b45d)
- ui: screens say what they mean, not what they store (803b4ec)
- ui: the application form tab reads clearly (4599406)
- ui: the Assignment Options card shows both options (f271916)
- ui: the machine decides which transitions confirm, and publish says what it does (3f91e59)
- ui: the market's fourth tab is called Assignment (9c47fe1)
- ui: the palette meets AA, and a test keeps it there (f69774f)
- ui: things meant to line up, do (aaab77c)
- ui: three spacing corrections (56f70e2)
- ui: three text colours the sweep could not see (1f1d97d)
- vendors: reach the drawer and the card by testid, and hold inert across nested modals (7bb856c)
- vendors: the list is vendors, and a limit is a reason (54f3d5d)
- vendors: the page behind the vendor drawer is inert, not merely dimmed (f05a582)