Skip to content

Changelog ​

For detailed release notes, see the Release Notes on GitHub.

Recent highlights ​

v1.14.0 (2026-11-02, prepared) ​

  • FreeTicket conversion: when enabled for the organization, administrators can convert selected tickets on eligible normal-event orders before invoicing, including reported sales. Compact cards keep ordinary/free quantities, payable amounts and handout distinct while preserving original order and invoice evidence (#569). See the admin guide
  • Reports: expandable free-ticket counts in By Event and By Ticket Type show scoped recipients, quantities, performances and origins, with verified conversions distinguished from standalone free tickets
  • Cancellation history: search cancelled tickets by member or sales channel in read-only Event History. The former review route redirects there; the separate decision queue is removed (#571)
  • Accounting: supported uninvoiced cancellations offset ticket price and organization fee without a separate decision, including locked but unissued calculations. Existing invoices, frozen bases, invoiced markers and external sales facts remain unchanged. External follow-up stays outside the app; no refunds or credit notes are issued
  • Boundaries: no production settings, feature flags, dependencies or business data are changed. Conversion stays off by default. Prepared metadata does not certify deployment or activate conversion in production

Norsk:

  • Konvertering til fribilletter: når funksjonen er aktivert for organisasjonen, kan administratorer konvertere valgte billetter på kvalifiserte bestillinger for vanlige arrangementer før fakturering, også rapporterte salg. Kompakte kort skiller mellom ordinære billetter, fribilletter, beløp som skal betales og utlevering. Opprinnelige bestillinger og fakturagrunnlag beholdes (#569). Se administratorveiledningen
  • Rapporter: åpne detaljer om antall fribilletter per arrangement og per billettype for å se mottakere, antall, forestillinger og opprinnelse for valgt utvalg
  • Historikk etter avlysing: søk etter avlyste billetter på medlem eller salgskanal i den skrivebeskyttede Arrangementshistorikken. Den tidligere ruten for vurderinger leder dit. Den egne køen for beslutninger er fjernet (#571)
  • Regnskap: avlysninger som støttes og ikke er fakturert, utligner billettpris og organisasjonens gebyr uten en separat beslutning, også ved låste beregninger. Eksisterende fakturaer, låste grunnlag, fakturamarkeringer og eksterne salgsopplysninger beholdes. Ekstern oppfølging skjer utenfor appen. Ingen refusjoner eller kreditnotaer utstedes
  • Avgrensning: ingen produksjonsinnstillinger, funksjonsbrytere, avhengigheter eller forretningsdata endres. Konvertering er fortsatt deaktivert som standard. Metadataene bekrefter ikke utrulling og aktiverer ikke konvertering i produksjon

v1.13.1 (2026-10-29) ​

  • Events and reports: fix loading errors in the organization's event overview and member reports across all events. Internal cancellation records are no longer mistaken for external sales (#567)
  • Safeguards: preserve validation of real sales, original sales records, financial amounts and capacity calculations. No database repair, settings change or cancellation action is required

Norsk:

  • Arrangementer og rapporter: rettet lastefeil i oversikten over organisasjonens arrangementer og i rapporter per medlem for alle arrangementer. Interne opplysninger om avlysing blir ikke lenger behandlet som eksterne salg (#567)
  • Kontroller: faktiske salg kontrolleres fortsatt på samme måte. Opprinnelige salgsopplysninger, beløp og kapasitetsberegninger beholdes. Du trenger ikke reparere databasen, endre innstillinger eller avlyse noe

v1.13.0 (2026-10-29) ​

  • Cancellation: when cancellation is enabled, authorized owner administrators across organizations can cancel a whole event or one performance through More actions, with a two-step review and explicit confirmation (#564). See the admin guide and Shared Event organizer guide
  • Accounting: separate offsets cover supported uninvoiced ticket prices and organization fees. Locked invoice bases and issued invoices stay unchanged and need manual review. Missing original amounts still block cancellation
  • History: optional archiving preserves original sales and physical-ticket facts; pending accounting reviews remain available. No financial repairs
  • Ticketmaster: only recorded sales in the selected scope are marked invalid locally and sent for manual follow-up, without automatic monetary adjustments. No discovery of unrecorded sales, external ticket cancellation, refunds, credit notes or external monetary reversal

Norsk:

  • Avlysing: når avlysing er aktivert, kan administratorer med riktig tilgang i eierorganisasjoner avlyse hele arrangementet eller én forestilling via Flere handlinger, med gjennomgang i to trinn og uttrykkelig bekreftelse (#564). Se administratorveiledningen og veiledningen for arrangører av delte arrangementer
  • Regnskap: separate justeringer utligner billettpris og organisasjonens gebyr for beløp som støttes og ikke er fakturert. Låste fakturagrunnlag og utstedte fakturaer beholdes uendret og må vurderes manuelt. Manglende opprinnelige beløp blokkerer fortsatt avlysing
  • Historikk: valgfri arkivering bevarer opprinnelige salg og opplysninger om fysiske billetter. Ventende regnskapsvurderinger er fortsatt tilgjengelige. Ingen økonomiske data repareres
  • Ticketmaster: bare registrerte salg for valgt arrangement eller forestilling markeres som ugyldige lokalt og sendes til manuell oppfølging, uten automatisk beløpsjustering. Ingen oppdagelse av uregistrerte salg, ekstern billettavlysing, refusjon, kreditnota eller reversering av eksterne beløp

v1.12.2 (2026-10-29) ​

  • Cancellation preparation: includes compatibility groundwork and a read-only, two-step impact preview for a whole event or one performance. See the admin guide and Shared Event organizer guide
  • Still disabled: cancellation and recording review decisions remain hard-disabled. This patch does not complete #564 or make cancellation available
  • Accounting: preserves original sales, issued invoices and physical-ticket history. Missing original prices or fees remain blockers, not zero. No financial repairs. See the treasurer guide
  • Ticketmaster: only sales already recorded here are included in the future cancellation workflow and need separate manual follow-up. The app does not discover unrecorded sales, cancel Ticketmaster tickets, refund customers or reverse external amounts

Norsk:

  • Forberedelser til avlysing: versjonen inneholder kompatibilitetsforberedelser og en skrivebeskyttet forhåndsvisning i to trinn for et helt arrangement eller én forestilling. Se administratorveiledningen og veiledningen for arrangører av delte arrangementer
  • Fortsatt deaktivert: avlysing og registrering av vurderinger er fortsatt blokkert av faste sikkerhetssperrer. Denne rettelsen avslutter ikke #564 og gjør ikke avlysing tilgjengelig
  • Regnskap: opprinnelige salg, utstedte fakturaer og opplysninger om fysiske billetter beholdes uendret. Manglende opprinnelige priser eller gebyrer blokkerer fortsatt avlysing og betyr ikke null. Ingen økonomiske data repareres. Se kassererveiledningen
  • Ticketmaster: bare salg som allerede er registrert her, inngår i den framtidige avlysingsflyten og må følges opp manuelt separat. Appen oppdager ikke uregistrerte salg, avlyser ikke Ticketmaster-billetter, refunderer ikke kunder og reverserer ikke eksterne beløp

v1.12.1 (2026-10-09, prepared) ​

  • configuration: Add explicit PRE_HANDOUT_SALES_MODE=all-organizations eligibility for valid owner and selling organizations, including future organizations without enumerating IDs. The master switch PRE_HANDOUT_SALES_ENABLED still requires exactly true
  • defaults: Keep the master switch off by default and use restrictive allowlist mode when no mode is set. Allowlist mode requires both owner and seller in a valid nonempty list. Invalid modes, IDs, malformed lists and normalized duplicates fail closed in either mode. Global mode permits an absent or blank list; valid lists do not restrict global eligibility
  • rollback: Stop new adoption and pre-handout sales with the master switch off while retaining adopted records, sold-ticket handout and settlement
  • boundaries: Preserve tenant isolation, membership, roles, order ownership, live delegation, capacity and invoice liability. No organization-settings UI, per-partner toggle, migration, business-data change, infrastructure change or dependency upgrade
  • activation: Prepared metadata does not certify deployment or activation. Enable production's default environment only after deploying and verifying the supporting API, using exact true and all-organizations values while preserving unrelated settings and restrictive preview configuration

Norsk: Den uttrykkelige modusen PRE_HANDOUT_SALES_MODE=all-organizations gjør salg før utlevering tilgjengelig for gyldige eier- og selgerorganisasjoner, også framtidige organisasjoner, uten å liste opp ID-ene deres. Hovedbryteren PRE_HANDOUT_SALES_ENABLED må være nøyaktig true og er deaktivert som standard. Uten angitt modus brukes allowlist, der både eier og selger må stå i en gyldig, ikke-tom liste. Ugyldige moduser, ID-er, feilformede lister og duplikater etter normalisering sperrer nye salg i begge moduser. I global modus kan listen mangle eller være tom; gyldige lister begrenser ikke hvilke organisasjoner som kan bruke funksjonen. Når hovedbryteren slås av, stoppes ny bruk av servicemodellen og nye salg før utlevering, mens eksisterende poster, utlevering av solgte billetter og avstemming beholdes. Skillet mellom organisasjonenes data, medlemskap, roller, eierskap til bestillinger, gjeldende delegerte tilganger, kapasitet og fakturaansvar er uendret. Ingen nye kontroller i organisasjonsinnstillingene, bryter per salgspartner, migrering, endring av forretningsdata, infrastrukturendring eller oppgradering av avhengigheter. Metadataene bekrefter ikke utrulling eller aktivering. Aktiver bare standardmiljøet i produksjon etter at API-et med støtte for den nye modusen er rullet ut og kontrollert, med de nøyaktige verdiene true og all-organizations. Behold andre innstillinger og begrensningene i forhåndsvisningsmiljøene.

v1.12.0 (2026-10-09) ​

  • feat(pre-handout sales): Allow authorized sellers to record final, non-refundable sales before physical handout while preserving the selling member's existing sale liability (#561)
  • handout: Mark pre-handout sales with amber badges in the existing order list and use its existing filter to find orders awaiting handout. Handout remains full-order only; the late-handout safeguard blocks only when remaining tickets are unreported
  • reporting: Scope the summary to the selected concert without adding a Home card
  • configuration: Keep the feature off by default and limit it to the owner and an explicit seller allowlist. Persist an organization's adopted servicing model
  • boundaries: Shared test-organization preview logic is not physical isolation

Norsk: Godkjente selgere kan registrere endelige, ikke-refunderbare salg før fysiske billetter deles ut, mens medlemmet som selger beholder samme salgsansvar som ved andre medlemssalg (#561). Gule merker og det eksisterende filteret viser bestillinger som venter på utlevering. Utlevering gjelder fortsatt hele bestillingen, og sperren ved sen utlevering slår bare inn når gjenstående billetter ikke er rapportert. Rapportsammendraget følger valgt konsert uten et nytt kort på Hjem. Funksjonen er deaktivert som standard og begrenset til eier og uttrykkelig tillatte selgere; organisasjonens valg av servicemodell beholdes. Forhåndsvisningslogikk for en delt testorganisasjon er ikke fysisk isolasjon.

v1.11.4 (2026-10-08, prepared) ​

  • ux(Ticketmaster): Combine category counts, ticket totals and amounts in one compact, initially expanded Totals card for the selected showtime or all showtimes (#559)
  • ordering: Use the same presentation order in pricing, totals and Add Sale: regular Adult, regular Child, Early Bird variants, then other types, including equivalent Norwegian labels. Stored catalog and submission order remain unchanged
  • counts: Show corrected, already-registered counts for the selected showtime, excluding removed sales. New inputs start at zero and add only extra tickets. Unknown or incomplete allocations show Unavailable, not an invented zero
  • layout: Narrow the desktop Add Sale sheet, retain wrapping labels and touch-friendly mobile controls, and close the draft when event or showtime changes. Update EN/NO guidance
  • scope: No financial recalculation, history rewrite, data repair, infrastructure or dependency changes. Prepared for PR preview only, with no deployment or production-verification claim. Merge, tagging and release require Haflidi's explicit UX approval

Norsk: Ett kompakt Totalt-kort samler antall per kategori, totalt antall billetter og beløp for valgt forestilling eller alle forestillinger (#559). Kortet er åpent fra starten og kan foldes sammen. Priser, totaler og Legg til salg viser vanlig Voksen, vanlig Barn, Early Bird-varianter og deretter andre typer, også med tilsvarende engelske navn. Lagret katalogrekkefølge og rekkefølgen ved innsending er uendret. Allerede registrert viser korrigerte antall for valgt forestilling, uten fjernede salg. Nye felt starter på null og gjelder bare billetter som skal legges til, ikke et nytt totalantall. Ukjent eller ufullstendig billettfordeling vises som Ikke tilgjengelig, ikke et antatt null. Skjemaet er smalere på store skjermer, beholder tekstbryting og berøringsvennlige kontroller på telefoner og lukkes ved bytte av arrangement eller forestilling. Veiledningen er oppdatert på norsk og engelsk. Ingen omberegning av beløp, omskriving av historikk, datareparasjon, infrastruktur- eller avhengighetsendringer. Kun klargjort for forhåndsvisning av PR-en, ikke bekreftet utrullet eller kontrollert i produksjon. Haflidi må uttrykkelig godkjenne brukeropplevelsen før sammenslåing, versjonstagging og publisering.

v1.11.3 (2026-10-08, prepared) ​

  • fix(event reads): Restore corrected external sales and confirmed allocation repairs after provable appended ordinary ticket types, preserving historical quantities, capacity and amounts (#557)
  • safeguard: Validate database metadata and separate catalog views without replacing current preview or concurrency authority. Missing evidence, unprovable history and genuine historical changes remain fail-closed; removal and repricing are not generally supported
  • scope: The verified affected pattern needs no database repair or history rewrite. Local decoding preserved exact original and effective snapshot digests for the three affected records. No financial redesign, production writes, migration, infrastructure or dependency changes. Deployment and live HTTP verification remain pending

Norsk: Arrangementer og rapporter kan igjen lese korrigerte eksterne salg og bekreftede reparasjoner av billettfordelingen etter at nye vanlige billettyper er lagt til sist i katalogen, når det historiske grunnlaget kan bekreftes (#557). Historiske antall, kapasitetsbruk og beløp er uendret. Forhåndsvisninger og kontroller av samtidige endringer bruker fortsatt gjeldende katalog. Reelle historiske endringer og manglende eller utilstrekkelig dokumentasjon gjør fortsatt dataene utilgjengelige; rettelsen gir ikke generell støtte for fjerning eller prisendringer. Det bekreftede feiltilfellet krever ingen databasereparasjon eller omskriving av historikken. Lokal kontroll bevarte kontrollsummene for opprinnelige og gjeldende salgsdata i de tre berørte postene. Ingen omlegging av økonomiberegninger, skriving til produksjonsdata, migrering, infrastruktur- eller avhengighetsendringer er inkludert. Utrulling og kontroll av HTTP-kall i produksjon gjenstår.

v1.11.2 (2026-10-08, prepared) ​

  • fix(Ticketmaster): Preserve existing legacy Ticketmaster prices and fees omitted from ordinary ticket saves, including Student additions, instead of treating unchanged values as pricing changes (#555)
  • safeguard: Actual Ticketmaster price and fee changes, including ordinary fallback changes, remain blocked after the first sale. Explicit zero remains meaningful; the independent Ticketmaster catalog is unchanged
  • scope: Locally reproduced code defect, not a verified diagnosis or resolution of the specific production report. No production data repair, migration, infrastructure or dependency changes. Prepared metadata only; not deployed yet

Norsk: Lagring av vanlige billettyper, også når du legger til Student, bevarer eksisterende Ticketmaster-priser og -gebyrer når forespørselen utelater feltene (#555). Uendrede verdier utløser ikke lenger en feilaktig priskonflikt. Reelle endringer er fortsatt sperret etter første salg, også endringer i vanlige priser og gebyrer som brukes når egne Ticketmaster-verdier mangler. En eksplisitt nullverdi betyr null, ikke et utelatt felt. Den uavhengige Ticketmaster-katalogen er uendret. Rettelsen gjelder en lokalt gjenskapt kodefeil og bekrefter ikke årsaken til eller løsningen på den konkrete feilrapporten fra produksjon. Ingen reparasjon av produksjonsdata, migrering, infrastruktur- eller avhengighetsendringer er inkludert. Metadataene er klargjort; rettelsen er ikke rullet ut ennå.

v1.11.1 (2026-10-07, prepared) ​

  • fix(concert editing): Correct false conflicts caused by database metadata when saving an existing concert with its ticket types, including additions, renaming, removal, price and fee edits, and unchanged types (#553)
  • safeguard: Preserve strict catalog validation, ETag checks and bounded retries with fresh reads for genuine concurrent changes
  • scope: No production data repair, migration, dependency upgrade or infrastructure change. Prepared metadata does not certify deployment

Norsk: Rettet feilaktige konflikter ved lagring av eksisterende konserter med billettypene (#553). Rettelsen dekker å legge til, gi nytt navn til og fjerne billettyper, endre priser og gebyrer og lagre uendrede billettyper. Streng validering, ETag-kontroller og et begrenset antall nye forsøk med oppdaterte data ved reelle samtidige endringer er beholdt. Ingen reparasjon av produksjonsdata, migrering, avhengighetsoppgradering eller infrastrukturendring er inkludert. Metadataene er klargjort og bekrefter ikke utrulling.

v1.11.0 (2026-10-06, prepared) ​

  • feat(reports): Include all current organization members, including zero-order and zero-sale rows, with independent sold, ordered and recorded-handout quantities, quantity-first sorting, search and overlapping quick filters (#551)
  • ux: Use the existing compact table/card design at desktop, tablet and phone widths; disclose order counts, awaiting handout, unsold returns and financial subtotals without a new dashboard
  • scope: Preserve unavailable quantities, qualified financial subtotals, separately disclosed source-only sellers, source-created date scope and partner-organization boundaries
  • export: Apply member, event, date, search, quick-filter and sorting parity to member CSV
  • docs: Update English and Norwegian treasurer and administrator guidance
  • safeguard: Existing printed reconciliation and validated frozen/recovered bases remain supported. Dormant unified printed-order/registration correction kinds are rejected by current endpoints. Only manually introduced or future unsupported evidence triggers an unavailable report, never uncorrected values
  • boundaries: Preserve Reports authorization and historical/delegated flows. No refunds, payment tracking, new member approval workflow, within-order partial handout, #482 work or production data repair. Prepared metadata does not certify deployment

Norsk: Per medlem viser alle nåværende medlemmer, også uten bestillinger eller salg, med separate antall for solgt, bestilt og registrert utlevering (#551). Flest solgte er standardrekkefølgen. Navnesøk, sortering og overlappende hurtigfiltre brukes i den kompakte tabell- og kortvisningen. Ukjente antall forblir utilgjengelige, økonomiske delsummer merkes, og salg utenfor dagens medlemsliste vises separat. Medlemseksporten bruker samme utvalg og sortering. Datoene gjelder opprettelsen av de opprinnelige postene. Kasserer- og administratorveiledningene er oppdatert på norsk og engelsk. Tilgangene og historiske og delegerte rapporter er uendret. Ingen refusjon, betalingsregistrering, ny godkjenningsflyt, delvis utlevering innen én bestilling, #482-arbeid eller reparasjon av produksjonsdata er inkludert. Metadataene er klargjort og bekrefter ikke utrulling.

Eksisterende avstemmingskorrigeringer og validerte låste eller gjenopprettede fakturagrunnlag støttes fortsatt. De separate, felles korrigeringstypene for trykte bestillinger og påmeldinger er foreløpig ubrukte og avvises av dagens endepunkter. Bare manuelt innførte eller framtidige data som ikke støttes, gjør rapporten utilgjengelig i stedet for å vise ukorrigerte verdier. Dagens støttede korrigeringsflyter forblir tilgjengelige.

v1.10.0 (2026-10-06) ​

  • feat(ordering): Show compact sold and available figures inside each performance card, through quantity selection and review, and per performance in the cart. Home remains simple navigation without a totals panel or performance dropdown (#477)
  • scope: Owners see whole-performance totals, partners see their own allocation, and common-pool participants see their own organization's sales with shared remaining capacity. Quota-mode participants see their own remaining quota
  • states: Keep zero, unlimited venue capacity, unset allocation, unavailable figures and locked sales distinct. Free tickets consume capacity but are not sold tickets; snapshots do not reserve tickets or guarantee a later sale
  • docs: Explain the figures, organization scope and refresh behavior in English and Norwegian member guides
  • boundaries: Only unsold tickets can be returned; sold tickets remain sold, capacity-consuming and invoiceable to the selling member. No refunds, sale reversals, pre-handout sales, handout or invoice-workflow changes, #482 work, production data repair, migration, dependency upgrades or infrastructure changes

Norsk: Solgte og tilgjengelige billetter vises på hvert forestillingskort, ved valg av antall og gjennomgang, og per forestilling i handlekurven (#477). Hjem beholder snarveiene uten egen oversikt over billettall eller forestillingsvelger. Eierorganisasjonen ser totalene for hele forestillingen, salgspartnere ser sin egen tildeling, og deltakere med felles pott ser organisasjonens egne salg og tilgjengelig kapasitet i den felles potten. Ved kvotefordeling vises egen gjenstående kvote. Null, ingen kapasitetsgrense, tildeling ikke angitt, utilgjengelige tall og låst salg holdes atskilt. Fribilletter bruker kapasitet, men telles ikke som salg. Tallene reserverer ikke billetter. Medlemsveiledningene forklarer tallene og hvordan de oppdateres. Bare usolgte billetter kan returneres; solgte billetter forblir solgt, bruker kapasitet og skal kunne faktureres medlemmet som solgte dem. Ingen refusjon, reversering av salg, salg før utlevering, endringer i utlevering eller fakturering, #482-arbeid, reparasjon av produksjonsdata, migrering, avhengighetsoppgradering eller infrastrukturendring er inkludert.

v1.9.2 (2026-10-06) ​

  • fix(wording): Complete allocation terminology across the Selling partners editor, accessible labels and help, capacity labels, save feedback, shared sales-limit and loading errors, and the member-allocation explanation in English and Norwegian (#516)
  • docs: Clarify unused partner allocations, reported sales, member allocations and temporary capacity holds. Blank removes the partner quota, not the venue limit; zero means no sales allowance
  • scope: Wording and regression coverage only. No changes to calculations, permissions, API contracts, production data, workflows or dependencies

Norsk: Tildelingsbegreper brukes konsekvent i redigering under Salgspartnere, tilgjengelige etiketter og hjelpetekster, kapasitetsetiketter, lagringsmeldinger, feil ved salgsgrense og innlasting samt forklaringen av medlemstildelinger (#516). Veiledningen skiller ubrukte partnertildelinger fra rapporterte salg, medlemstildelinger og midlertidige kapasitetsreservasjoner. Tomt felt fjerner partnerkvoten, ikke kapasitetsgrensen. Null betyr ingen salgsramme. Bare ordlyd og regresjonstester er endret. Beregninger, tilganger, API-kontrakter, produksjonsdata, arbeidsflyter og avhengigheter er uendret.

v1.9.1 (2026-10-06) ​

  • fix(reporting): Remove the redundant deadline sentence and use Report sales for the selection-card action and accessible label, without changing countdowns, deadlines or permissions (#508)
  • fix(wording): Use Allocated tickets and Remaining allocation for partner quotas, distinguishing sales allowance from tickets delivered to members while retaining actual capacity-reservation terminology (#516)
  • fix(maintenance): Protect persisted repair metadata and reject incomplete batch results as unknown outcomes rather than successful writes (#541)
  • docs: Record completion of the separately approved October 5 zero-fee correction and retirement of its one-off incident tools. Deployment does not run or repeat the repair (#541)
  • scope: No new features, production data changes, automatic retries, dependency upgrades or infrastructure changes

Norsk: Den overflødige fristsetningen er fjernet, mens nedtelling, frister og tilganger er uendret (#508). Tildelte billetter og Gjenstående tildeling beskriver partnerens salgsramme, ikke utleverte medlemsbilletter (#516). Reparasjonsmetadata er beskyttet, og ufullstendige transaksjonssvar behandles som ukjent utfall (#541). Nullavgiftene ble rettet 5. oktober, og engangsverktøyene er avviklet. Utrulling gjentar ikke reparasjonen. Ingen nye funksjoner, endringer i produksjonsdata, automatiske nye forsøk, avhengighetsoppgraderinger eller infrastrukturendringer.

v1.9.0 (2026-10-01) ​

  • feat(reconciliation): Select separate orders for one event, review authoritative sold-only amounts and blockers, and explicitly confirm while preserving each order's own immutable invoice basis and audit (#538)
  • feat(invoice marking): Select members for one event across all performances, review eligible sources, pending amounts and warnings, and record external invoice issuance with one-way marks. No invoice creation, sending, clearing, order reconciliation or payment recording (#537)
  • fix(recovery): Retain successful changes and independent outcomes; require refresh and review after changed or partial results, with no automatic retries. Warned, excluded sources remain excluded even when eligible sibling sources succeed (#538, #537)
  • ux(members): Combine member selection and invoice status with the sales table; group seller metrics in a compact selected-concert summary with a direct Sales by Member link. Upward whole-krone average rounding affects display only (#537, #542)
  • docs: Update English and Norwegian guidance and API references from local-only status to v1.9.0
  • ci: Add bounded emulator fixture recovery and focused safety tests without weakening partner-quota assertions; broader #503 stability work remains open
  • scope: Preserve permissions, delegated-sales restrictions, test-data exclusion and financial evidence. No #541 data repair, new invoicing page, migration, backfill, repricing or deletion; broader #475 remains open

v1.8.1 (2026-09-28, prepared) ​

  • fix(orders): Match settled summary totals to the non-archived, selected-event queue, including empty results, without changing recorded financial calculations (#534)
  • fix(test data): Exclude canonically test-marked events from all Administration Orders tabs, counts, choices and summaries, retaining Event History marking and undo without an Orders recovery toggle (#535)
  • fix(refresh): Surface classification failures and reject stale organization, identity and impersonation responses (#535)
  • ux(no): Use Til avstemming and Avstemt consistently for order lifecycle labels while retaining separate sales and invoice states (#536)
  • docs: Explain visibility, recovery and reconciliation in the relevant English and Norwegian guides
  • ci: Pin the partner-quota emulator image and retain its readiness probe until final disposal, without retrying the suite in a reused emulator or weakening business assertions (#503, focused lifecycle remediation)
  • scope: Preserve records, ordinary archived sales, permissions and invoice basis. No deletion, new infrastructure, automatic settlement or bulk invoicing

v1.8.0 (2026-09-28, prepared) ​

  • feat(workspace): Mark Development organizations and choose which Super Admin workspaces show them, with separate overview and switcher groups and explicit management recovery (#531)
  • fix(workspace): Refresh organization discovery and selection across identity, context and visibility changes without retaining stale picker results (#531)
  • feat(navigation): Apply the agreed fixed Administration menu order while preserving existing permissions, labels and destinations (#532)
  • docs: Explain Development workspace visibility and navigation in English and Norwegian
  • scope: Preserve direct Super Admin access, member and E2E identity permissions, and financial reporting. No new role, infrastructure, migration or automatic classification

v1.7.0 (2026-09-28, prepared) ​

  • feat(reporting): Explicitly mark owned historical events as test data and exclude them from ordinary Reports, financial aggregates, and supported exports, while retaining labeled historical evidence (#475, reports-first slice)
  • feat(history): Let organization admins and scoped Super Admins manage authorized markings with durable actor/time audit, concurrency protection, safe retries, and undo that remains available after event restoration (#475)
  • fix(scope): Resolve Shared Event and delegated identities canonically; participants cannot classify another organization's event, and selected marked events return an exclusion response rather than zero totals (#475)
  • docs: Add English and Norwegian controls and guidance for marking, historical evidence, and post-restore undo (#475)
  • infra: Declare the prerequisite eventReporting container with /scopeKey, disabled TTL, and shared throughput; bootstrap each deployment environment before deploying readers (#475)
  • scope: Preserve original financial sources and operational availability. No automatic classification, operational retirement, purge, or closure of the broader #475 scope
  • validation: Release preparation only; two added cases in the existing Cosmos emulator suite await CI, with no claim of real-Cosmos or production verification

v1.6.7 (2026-09-27) ​

  • fix(dashboard): Show the selected concert's name, date, and venue when available, without stale details from another selection (#528)
  • fix(fees): Keep organization and Ticketmaster fee subtotals independently available, distinguishing recorded zero and partial known zero from unknown amounts (#528)
  • fix(average): Use recorded member-sales income including known organization fees over the matching selling-member cohort, exclude external and partner sales, and retain known partial averages with concise optional help (#528)
  • fix(income): Recover absent registration fee totals from valid immutable recorded unit fees and quantities with shared selected-concert and all-concert validation; never substitute current prices or conflicting evidence (#528)
  • fix(recovery): Preserve independently validated sold income in selected-dashboard reads across reader roles when no recovery chain exists, retain verified-chain precedence and corrupt-chain rejection, and leave invoice mutation eligibility unchanged (#528)
  • docs: Update the English and Norwegian admin and treasurer guides for the selected-concert overview without changing the separate Reports average definition (#528)
  • scope: No historical data writes, migration, backfill, repricing, or changes to recorded orders, sales, invoices, or audit history

v1.6.6 (2026-09-27) ​

  • fix(dashboard): Remove routine Complete badges while keeping original income headings, known amounts, and actionable warnings (#525)
  • fix(income): Add an optional, reconciled breakdown for registrations and printed tickets versus Ticketmaster/external income across single-concert dashboards, the portfolio, and concert cards; include known fees once and keep provider fees separate from organization income (#525)
  • fix(reporting): Reconcile filtered breakdowns to selected concerts, preserve partial and unavailable states without inventing zero, and withhold definitive dashboard averages for incomplete income or invalid supplied breakdowns while supporting older responses (#525)
  • docs: Update the English and Norwegian treasurer guides and add focused Norwegian language-review guidance (#525, #526), without claiming a full translation review or resolving #516 terminology
  • scope: No data migration, backfill, repricing, or changes to production orders, sales, invoices, or audit records

v1.6.5 (2026-09-26) ​

  • fix(income): Preserve recorded printed-ticket income and other validated fees when older orders lack reliable fee evidence; use validated frozen invoice details where available, never current prices or fees (#518)
  • fix(reporting): Keep known subtotals consistent across single-concert and all-concert dashboards, Reports, and shared-event summaries without treating missing evidence as zero or complete; reject conflicting or unsafe amounts (#518)
  • fix(dashboard): Retain the original Organization Income heading and known amount without extra explanations or partial-data badges; keep unavailable amounts distinct from validated zero (#518)
  • docs: Update the English and Norwegian treasurer guides; preserve existing orders, sales, invoices, and audit records without migration, backfill, deletion, or repricing (#518)

v1.6.4 (2026-09-25) ​

  • fix(orders): Keep member identity, partner attribution, submission details, and totals readable on narrow screens; provide an explicit keyboard-accessible Manage action with focus return (#521)
  • fix(Ticketmaster): Stack sales into labeled records on narrower layouts while retaining category details, quantities, capacity contribution, income, fees, and gross totals; distinguish loading, failures, and retry from empty results (#521)
  • fix(accessibility): Correct mobile-menu focus, closed-state keyboard access, Escape behavior, and resize cleanup; improve user-edit and impersonation dialogs; prevent sheet content scrolling from dismissing drafts (#521)
  • fix(overlays): Move feedback into navigation, fit notifications within narrow screens, enlarge pagination targets, and keep bottom navigation, fixed Save controls, and update prompts clear of safe-area space and each other (#521)
  • fix(admin): Improve responsive member, organization, registration, pledge, dashboard, and report layouts with English and Norwegian labels and complete visible financial fields (#521)
  • docs: Update both ticket-manager guides; retain existing permissions, financial calculations, correction confirmations, and audit history without backend feature or migration changes (#521)

v1.6.3 (2026-09-25) ​

  • fix(Ticketmaster): Add Remove sale / Fjern salg with a required reason, removal review, confirmation checkbox, final removal action, and additional financial confirmation for paid reversals, using the existing audited correction API (#519)
  • fix(sales visibility): Hide verified zero-reversed sales and zero-quantity category lines from the active list while keeping nonzero free companion tickets and uncertain evidence visible; retain all effective sales in summary totals (#519)
  • fix(removal history): Add Show removed sales / Vis fjernede salg with original quantities and registrar, permission-gated removal actor, time, and reason, and return to the active list after an authorized nonzero correction (#519)
  • fix(accessibility): Preserve keyboard focus through removal confirmation and recovery without stealing focus during asynchronous updates (#519)
  • docs(Ticketmaster): Explain removal in English and Norwegian as a UI improvement to the reversal capability shipped in v1.6.2, with unchanged permissions and invoice locks, retained records and audit history, and no physical deletion, refund, payment, or migration (#519)

v1.6.2 (2026-09-25) ​

  • fix(corrections): Allow audited full external-sale reversals, including two companion (ledsager) tickets to zero, without changing original sales or prior corrections. Zero the effective financial totals and release only previously counted capacity while retaining permissions, invoice locks, and printed-sale restrictions (#511, #517)
  • fix(read projections): Preserve verified zero quantities and money after reload, allow a later eligible correction from zero, and reject unchanged zero allocations (#511, #517)
  • fix(Ticketmaster): Reload authoritative baselines for stale corrections, return rejected input to editing, and preserve preview and idempotency evidence when retrying an uncertain commit (#511, #517)
  • docs(Ticketmaster): Explain correction and reversal recovery in English and Norwegian, including that corrections do not process refunds or payments (#511, #517)

v1.6.1 (2026-09-24) ​

  • fix(api): Reconcile a readable but outdated production sales-correction stored procedure with the authoritative definition while continuing to fail closed on malformed or ambiguous procedure reads (#513, #514)
  • fix(reliability): Recover lost successful emulator item-create responses through partition-key read-back and allow one tightly classified transient retry for the partner-quota suite without retrying assertions, authorization failures, or conflicts (#513, #514)

v1.6.0 (2026-09-24) ​

  • feat(partner quotas): Reserve exclusive partner capacity per showtime, convert reserved to consumed capacity atomically when a partner sale is reported as sold (approval and delivery do not consume quota by themselves), and keep partner reservations separate from normal member availability (#505, #510)
  • feat(manager UX): Clarify partner approval state, quota usage, remaining availability, and manager actions
  • fix(showtimes): Keep quota, availability, approval, and sales information scoped to the selected showtime
  • fix(correctness): Preserve order-backed capacity invariants under concurrent partner and normal sales, preventing double allocation
  • chore(ci): Add bounded test-process protection, isolated emulator cleanup, and cost-aware classification for expensive emulator and delegated E2E jobs

v1.4.0 (2026-09-15) ​

  • feat(dashboard): Make the responsive, keyboard-accessible All concerts portfolio the primary management Overview, with exact Printed tickets versus Ticketmaster/external channels, actionable outstanding-ticket follow-ups, and row-based drill-down (#474, #500)
  • feat(members): Enable server-authoritative member Report Sales for exact owned and delegated order inventory, with sold-before-showtime and return-after-showtime actions (#392, #394, #395, #405, #408)
  • feat(history): Add role-scoped Event History, Shared Event archive/restore, authorized history details, event restoration, and read-only historical reports while keeping archived and hidden lifecycle boundaries explicit (#391, #396, #409, #412, #442, #443, #447, #453, #454, #455)
  • feat(ticketmaster): Add independent event-local Ticketmaster categories, defaults, custom categories, immutable post-sale price/fee ownership, legacy initialization, and event/Overview visibility (#420, #471, #485, #492)
  • feat(admin): Allow Platform Super Admins to select full or selling-partner organization mode during creation (#400, #404)
  • fix(accounting): Add audited pre-settlement transferred-order reconciliation and settled invalid-invoice-basis recovery behind the private typed ticket-order boundary (#397, #422, #465)
  • fix(reporting): Separate Ticketmaster net income, provider fees, and gross; align corrections and Excel exports; show sold/approved member ratios; scope order counts correctly; and count pending approval orders instead of tickets (#365, #411, #419, #430, #487, #498, #499)
  • fix(lifecycle): Route terminal-event activity and new notifications from authoritative lifecycle state, simplify Current orders/Cancelled navigation, and keep Shared Event capacity scopes privacy-safe (#448, #453, #457, #458)
  • fix(responsive): Replace mobile tab scrollers, clarify event-card actions, prevent dashboard overflow, show every valid admin showtime, and include localized weekdays at both date-range endpoints (#421, #444, #488, #489, #494)
  • fix(i18n): Improve History ARIA parity, touch-safe quantities, invitation delivery wording, Shared Event publishing guidance, and narrow-screen Ticketmaster setup in English and Norwegian (#275, #349, #361, #364, #413, #415, #417)
  • fix(ordering): Apply canonical upcoming-first and past-after ordering across admin and member surfaces using authoritative showtimes, with legacy dates only as a fallback (#469, #479, #481, #474)
  • fix(frontend): Remove visible Data quality UI and Overview concert/date selectors, simplify sold wording, and keep relevant partial/unavailable states alongside affected metrics and follow-ups (#474)
  • fix(reliability): Recover safely from rejected service-worker updates and stale lazy chunks with bounded, deduplicated reload behavior (#493, #497)
  • docs: Update English and Norwegian Go Live workflow guidance for event actions, history, restoration, historical reports, Shared Event capacity, notification routing, and audited recovery boundaries (#466)
  • chore(release): Harden immutable-tag recovery, explicitly enable accepted Report Sales production delivery, and stabilize printed-ticket emulator CI (#401, #407, #408, #474)
  • release: Ship all changes since v1.3.0 as standalone v1.4.0 without claiming completion of the separate Go Live milestone

v1.3.0 (2026-09-07) ​

  • feat(frontend): Reuse the normal Overview, Orders, and Reports workspaces for selling partners, scoped to their current delegation and current approved members; keep partner exports unavailable (#368, #371, #372, #381)
  • feat(platform): Add Super Admin-controlled full and limited sellingPartner organization modes, safe downgrade blockers, coordination leases, and exact stale-operation force recovery (#369, #373–#384)
  • feat(frontend): Keep membership, settings, notifications, delegated events, and partner operations in limited mode while removing owner-only Events, registration rounds, external-sales management, and Shared Events entry points (#369)
  • feat(frontend): Give organization Admins a token-free Pending invitations path for accepting or declining selling-partner invitations; keep it unavailable while impersonating (#386)
  • fix(accounting): Separate partner-sold tickets from owner-member invoicing and archive prerequisites; show the partner's gross collected revenue without implying compensation, settlement, net invoicing, or payment (#366, #368)
  • fix(privacy): Exclude owner-direct sales, other partners, external sales, capacity, contacts, notes, invoice state, and organizer controls from partner views; name a member only when current approved partner membership proves the identity (#368, #371, #372, #381)
  • fix(api): Initiate best-effort in-app notification creation for the affected member when a normal or delegated order is declined, with deterministic duplicate suppression, bounded transient retry, partner-partition routing for delegated orders, privacy-safe content, and non-cacheable notification reads; a failed notification does not roll back the cancellation (#390)
  • fix(docs): Build and discover documentation from the custom-domain root, preserving canonical, Open Graph, sitemap, favicon, and asset URLs at docs.billettsalg.vikingapps.dev (#387)
  • docs: Document that limited organizations cannot create or join Shared Events, that cross-document projections are eventually consistent rather than cross-container atomic, and that compensation, settlement computation, and net partner invoicing remain deferred (#389)

v1.2.0 (2026-09-04) ​

  • feat(frontend): Show delegated concerts in the normal member catalog and ordering flow on Home and Order Tickets, with a partner-organization badge and the same cart, submission, My Orders, and cancel flows as any other concert (#357)
  • feat(api): Add a member self-service order-create route, a partner approval queue (pending / approved), approve, deliver, and approve-and-deliver actions, keeping the existing legacy staff order-create route as a secondary compatibility path (#357)
  • feat(api): Allow cancel-while-pending on a delegated order, by the buyer or by the partner's own Ticket Manager+ on the buyer's behalf, matching the owner-side member cancel rule (#357)
  • feat(frontend): Redesign member navigation around Hjem, Bestill, and Bestillinger, plus Meny: a lightweight Hjem landing with a friendly no-concert state, a focused card-by-card Bestill flow (concert, showtime, ticket type/quantity, cart choice) where "Bestill flere" returns to concert selection with the cart preserved, and a Bestillinger workspace that owns order totals, current activity, timelines, lifecycle actions, and order history (#357)
  • feat(operations): Add DELEGATED_MEMBER_ORDERING_ENABLED and DELEGATED_MEMBER_CATALOG_ENABLED / VITE_DELEGATED_MEMBER_CATALOG_ENABLED rollout switches, all off by default and none an authorization control, with ordering enabled before catalog exposure (#357)
  • docs: Correct English and Norwegian member, admin, and ticket-manager guides, API reference, data-model reference, and environment reference for the member-catalog correction, with no migration required for existing delegation records (#357)
  • fix(api): Treat event deactivation and sales lock as new-sales controls for delegated events, so an existing partner-held order can still be cancelled, approved, delivered, and reported while the delegation is active; revocation, deletion, a superseded delegation, and permission withdrawal remain the fail-closed stops (#357)
  • fix(admin): Correct the Norwegian admin dashboard funnel heading to "Sporing av trykte billetter" (#359)
  • chore(sec): Open a non-blocking security hardening backlog for post-release follow-up after the Phase 5 review passed for release readiness (#362)

v1.1.0 (2026-09-03) ​

  • feat(api): Delegated normal-event ticket sales — authoritative Event-held delegation records, an authority resolver, and a routing-only partner reverse index (#335)
  • feat(api): Owner invite/list/revoke and partner accept/decline/list delegation lifecycle APIs on the existing single-use invitation-token pattern (#336)
  • feat(api): Delegated order creation, partner-scoped own-order listing, and report sold/returned, with cancel, transfer, reconcile, invoice, and configuration remaining owner-only (#337)
  • feat(frontend): Selling partners on the event form, a partner Delegated Events list and sell/report screen, and owner-side partner attribution badges, report tables, and exports (#338)
  • feat(frontend): Role-aware selling-partner discovery — admin-email resolution for organization admins and organization name search for super admins, with no raw organization IDs in the UI (#338, #352)
  • feat(frontend): Working invitation acceptance landing, token-free pending-invitations landing, and notification action routes for delegated sales (#338, #355)
  • fix(api): Make the normal-event capacity gate atomic via an order-backed counter in the same partition, preventing concurrent report-sold oversell (#344)
  • fix(api): Preserve delegated-sale attribution through owner transfers and owner reporting by separating delegated provenance from delegated selling authority (#345)
  • fix(api): Resolve delegated authority from the authoritative Event document instead of the eventually-consistent reverse index (#347)
  • test(sec): Final cross-organization isolation, partition, and lifecycle release gate for the delegated-sales epic, plus English and Norwegian documentation (#339)

v1.0.3 (2026-09-01) ​

  • feat(admin): Clarify the organization description as a distinct, editable field with a clear empty state, inline editing, a 2,000 character limit, and privacy-safe change telemetry (#330)
  • fix(orders): Allow transferring only the outstanding, unreported tickets from a partially sold or returned order, and correctly move the source order into reconciliation once its last outstanding tickets transfer (#331)

v1.0.2 (2026-09-01) ​

  • feat(admin): Allow organization Admins and Super Admins to edit an organization's display name, with an immutable internal identifier and point-in-time invitation name snapshots (#326)

v1.0.1 (2026-09-01) ​

  • feat(orders): Full and partial ticket transfers between members with preview, resulting orders, transfer history, and safety blocking as soon as any sold or returned tickets are reported (before reconciliation begins) (#325)

v1.0.0 (2026-09-01) ​

  • feat(operations): Add bulk completed-order archiving, repair Shared Event maintenance and administrative routes, and keep notification overlays above page content
  • feat(orders): Add member-and-event invoicing after reconciliation, using only tickets marked sold, and require invoicing before normal order archive
  • feat(release): Validate annotated SemVer tags, synchronized package versions, release notes, builds, lint, and local unit tests before publishing and verifying a GitHub Release
  • docs: Consolidate the production-readiness, observability, UX, and operator guidance delivered for the v1 baseline

v0.16.3 (2026-08-30) ​

  • feat(frontend): Search active admin order queues by member name without changing historical queues, counts, or network loading (#299)

v0.16.2 (2026-08-30) ​

  • fix(frontend): Show Archived / Arkivert as the primary admin badge without changing the order lifecycle status (#251)

v0.16.1 (2026-08-30) ​

  • feat(frontend): For standalone events, show capacity, remaining seats, member sales, and external sales per showtime with accurate event totals. Shared Event projections show authoritative shared totals without a per-showtime breakdown (#279)
  • fix(frontend): Guide ticket selection into review and show a persistent cart confirmation after adding tickets (#290)
  • feat(frontend): Ticket Manager pending approvals are oldest-first with stable tie-breaking and localized submission timestamps (#295)
  • fix(api): Keep fresh sign-in links and codes usable through transient lookup failures while preserving one-time atomic consumption (#278)
  • feat(operations): Add low-cost production observability with privacy-bounded backend telemetry, Portal-only alerts, and a 100 MB/day ingestion cap (#145)

v0.15.5 (2026-04-05) ​

  • feat(frontend): Click organization name in Super Admin list to quick-switch context (#129)

v0.15.4 (2026-04-02) ​

  • fix(frontend): Remove redundant event selector from free tickets section
  • feat(frontend): Click-to-edit flow for existing free tickets
  • feat(frontend): "Applies to all showtimes" checkbox with capacity warning
  • feat(api): PUT endpoint for updating free tickets
  • chore(i18n): Norwegian + English translations for edit mode and all-showtimes

v0.14.0 — March 30, 2026 ​

  • 🔒 Rate limiting (#107, #104) — Auth/verify and join validation endpoints rate-limited
  • 🔒 SHA-256 token hashing (#105) — Tokens hashed before database storage
  • 🔒 CSP hardened (#112) — frame-ancestors, base-uri, form-action directives added
  • 🔒 Email validation on admin schemas (#109) — Stricter admin input validation
  • 🔒 Mandatory impersonation audit logging (#23) — Fail-closed audit enforcement
  • 🔒 Invitation race condition fix (#20) — ETag concurrency on maxUses
  • 🔒 IP extraction hardened (#22) — Last X-Forwarded-For entry used
  • 🔒 npm audit fixes (#108) — Dependency vulnerability patches
  • 🔒 JoinView URI encoding (#111) — Proper encoding for join links
  • 🌐 Terminology generalized (#86, #89, #93, #97, #100) — "choir"/"kor" → "organization"/"organisasjon" in EN + NO (32 i18n strings, 14 doc files)
  • 📝 API docs corrected (#91, #94, #96) — Free tickets routes fixed, phantom endpoints removed
  • 📝 Environment variables documented (#102) — E2E_TEST_MODE, NODE_ENV, VITE_API_URL
  • 📝 Norwegian migration.md (#103) — Added translation
  • 📝 Getting started table (#99) — Updated
  • 📝 Migration title rebranded (#98)
  • 📝 Missing endpoint docs (#101) — Added
  • 🎨 Email templates (#113) — Emoji replaced with branded "B" letter mark
  • 📝 Rate limiter race condition (#110) — Documented
  • 📦 Dependencies — @azure/cosmos 4.9.2, @azure/identity 4.13.1, postcss 8.5.8, actions/checkout v6, actions/setup-node v6

v0.13.0 — March 30, 2026 ​

  • 📋 3-Tab My Orders (#81) — Active (pending+approved) | Delivered | Cancelled, replacing the 2-tab layout
  • 🔔 PWA Update Notifications (#78) — "New version available" toast with user-controlled update (60-second polling)
  • 🎨 New App Icon — Proper SVG ticket design with indigo gradient replacing 🎵 emoji (32, 180, 192, 512px)
  • 🐛 Tablet Layout Fix (#77) — Fixed Tailwind cascade and removed overflow-x-hidden from 5 containers trapping sticky header on iPad
  • 🐛 DashboardView overflow — Fixed horizontal scrollbar on small screens
  • 🐛 iOS Safari PWA update (#78) — location.reload() fallback when iOS Safari doesn't fire controllerchange
  • 🐛 BottomSheet safe-area — Proper safe-area-inset handling on iOS
  • 🎨 SVG icon in UI (#83) — Replaced 🎵 emoji with ticket icon in sidebar, mobile header, login, and join pages
  • 📝 Docs rebrand — "Billettsalg" terminology applied across all 20 markdown documentation files
  • 🧹 Gitignore — frontend/test-results/ removed from git tracking
  • 🧹 Sharp dependency — Added for icon generation

v0.12.0 — March 30, 2026 ​

  • 🛒 Separate Cart Page (#75) — Clean checkout flow with per-item controls and fee breakdown
  • 🔔 6 New Notification Types (#73) — Transfer, allocation, member joined, sales lock/unlock, role change
  • 🎯 Persistent Cart (#69) — Cart survives navigation and browser refresh with badge count
  • 🔄 Per-Ticket-Type Transfer (#72) — Transfer specific ticket types, not just bulk quantity
  • 🐛 15+ Bug Fixes — TM permissions (#67-70), login P0 (#52), reports (#62), cart (#59), mobile (#57)
  • 🔒 8 Security Fixes — JWT revocation, CORS, rate limiting, crypto random, email validation
  • 🎨 App Rebrand (#58) — "Choir Tickets" → "Billettsalg"
  • 📸 22 Screenshots — Persona-based documentation with highlight utility
  • 📝 FAQ + Treasurer Guide — New bilingual documentation pages
  • 🧪 E2E Testing — 60/77 tests passing (92%), screenshot specs, seed script
  • 🎭 UX Improvements — Unified order views (#65), terminology fixes from beta feedback

Key Features ​

  • Magic link authentication (passwordless)
  • Multi-tenant choir management
  • 5 user roles (Member, Ticket Manager, Treasurer, Admin, Super Admin)
  • Ticket ordering with approval workflow
  • Sales reports with CSV/Excel export
  • Bilingual interface (Norwegian + English)
  • Progressive Web App (installable)
  • Dark mode support

Built with VitePress