Skip to content

Releases: Xevion/Banner

v0.8.4

Choose a tag to compare

@Xevion Xevion released this 17 Sep 17:42
5e634e4

0.8.4 (2026-09-17)

Features

  • admin: Add audit log for admin actions (00d2f82)
  • admin: Add retryable error panel, harden instructor query binds (dd1418b)
  • instructors: Detect and merge duplicate instructor records (9b5bac7)
  • instructors: Let duplicate review dismiss a pair as two people (14482aa)
  • instructors: Link between instructor, subject and admin views (d3998e0)

Bug Fixes

  • admin-rmp: Make candidate fields non-nullable, switch to query! macro (db488d9)
  • bindings: Rename TimeRange to TimelineRange and guard name clashes (424421f)
  • e2e: Return the Page envelope from the search stub (d962742)
  • instructors: Make instructor merges survive the next scrape (fec3353)
  • instructors: Show real source ratings and link names from cards (93be7f8)
  • rmp-matching: Close auto-link gaps around placeholder departments and re-links (966c539)
  • rmp-matching: Gate auto-linking on confirmed subject evidence (6e5ca17)
  • rmp: Stop review fetches from failing on RMP's own data (2263c0d)
  • web: Handle the navigations the router abandons (6b95872)
  • web: Update the stale search fixtures (e41fb64)

Performance Improvements

  • tests: Replace sqlx::test with cloned-template pools (ad760e0)
  • tooling: Cut backend check and dev-reload turnaround (1e2a5c8)

Code Refactoring

  • admin-scraper: Make schedule state a typed enum end to end (0af262a)
  • admin: Return typed errors instead of matching on messages (7e6c67f)
  • data: Move the data layer onto compile-time checked queries (fa918fb)
  • instructors: Share one card and make name order explicit (cd4b4f9)
  • lints: Adopt clippy pedantic with a burn-down allow-list (92b6274)
  • lints: Burn down too_many_lines with targeted expects and splits (b7c27e9)
  • lints: Enable clippy nursery and collapse table tests with rstest (9eadfcb)
  • rmp-matching: Derive instructor match status from a view (828509f)
  • rmp-matching: Split the matcher into a directory module (574607e)
  • runtime: Rename services module to runtime (ef7bf3b)
  • Split the longest functions into named helpers (067986b)
  • types: Carry Count and DurationMs through course enrollment and scrape results (69cb3e2)
  • types: Let the type system carry what convention was carrying (977f45a)
  • web: Fold bespoke shapes into the shared ones (3575268)
  • web: Read the router from the router, not from the load payload (2117ab5)

Continuous Integration

  • Catch stale sqlx metadata and TypeScript bindings (62e6ff9)

Build System

  • docker: Pin CI image builds to a portable target-cpu (8e945d3)
  • Pin the Rust toolchain instead of tracking a floating stable (4e77a98)
  • tempo: Prepare .sqlx against a migrations-only database (9476b71)

Miscellaneous

  • lint: Enable clippy pedantic across the workspace (d77c9c6)
  • Tidy the repository's public surface (c890397)
  • web: Drop unused @internationalized/date and overlayscrollbars-svelte (56ee1c0)

v0.8.3

Choose a tag to compare

@Xevion Xevion released this 16 Sep 18:14
05b5829

0.8.3 (2026-09-15)

Features

  • course-detail: Add enrollment history chart and timeline (7bd44f7)
  • course-table: Add enrollment sparklines to the seats column (fba05d3)
  • telemetry: Add Grafana overview dashboard (acb32c2)
  • telemetry: Add log panels to the dashboard and fix probe user expansion (2539233)
  • telemetry: Describe metrics and route exposition through a ClusterIP Service (7d8559a)
  • telemetry: Expose Prometheus metrics on a dedicated listener (b5b2054)
  • telemetry: Namespace scrape metrics and label fallback responses (e28ea84)

Bug Fixes

  • chart: Give postgres a startup probe and graceful shutdown window (31ae36d)

Performance Improvements

  • deploy: Ship a production-only SSR install and slim the image (369ad34)

Code Refactoring

  • assets: Serve the client build from disk via ServeDir (d878cd6)

Continuous Integration

  • docker: Cache the release build in a GHCR registry tag (be3b63c)
  • docker: Only export the build cache on master (fd2aac8)

Miscellaneous

  • deps: Bump rustls to 0.23.45 (ae3f42f)

v0.8.2

Choose a tag to compare

@Xevion Xevion released this 11 Sep 17:20
d640d33

0.8.2 (2026-09-11)

Bug Fixes

  • deploy: Harden pipeline against silent failures and stale caches (e8e568c)

Performance Improvements

  • build: Build for the native CPU, keep CI portable (bce4ceb)

Code Refactoring

  • sort: Rename multi-key headers to the active sort key (b7e540b)

Miscellaneous

  • deps: Migrate frontend to TanStack Table v9 and layerchart v2 (7a7e4bc)
  • deps: Update poise to 0.7.0 and tower-http to 0.7.0 (102b959)

v0.8.1

Choose a tag to compare

@Xevion Xevion released this 11 Sep 05:07
1229907

0.8.1 (2026-09-11)

Features

  • deploy: Fail the build on an unstartable binary, roll back when one ships (566a0e6)

Bug Fixes

  • deps: Update backend dependencies (8b81e65)
  • docker: Pin the builder and runtime to the same Debian codename (f814e7d)

Miscellaneous

  • deps: Move actions onto the Node 24 runtime and pin them by digest (bd2530e)
  • deps: Update frontend dependencies (2c489d1)

v0.8.0

Choose a tag to compare

@Xevion Xevion released this 11 Sep 01:54
91fdebc

0.8.0 (2026-09-11)

Features

  • backend: Add multi-layer per-IP rate limiting middleware (a106025)
  • backend: Implement rate limit error handling with client-side retry (84bb179)
  • bot: Add course watch notifications via Discord DMs (dfd30a1)
  • bot: Paginate /search results with embeds and buttons (2523c38)
  • course-table: Add a menu for building multi-key sorts (3d70274)
  • course-table: Add end-time sort, span untimed rows, align clock parts (b338cec)
  • course-table: Redesign columns and add instructor sort cycle (d21e338)
  • deploy: Add Helm chart for k3s deployment, drop Railway coupling (a3b2643)
  • search: Order results by indexed columns instead of JSONB text (d479da0)
  • web: Add DB-backed readiness probe and access log target (7ea8dea)
  • web: Redesign schedule/seats cells with a day-track visualization (b1d16e7)

Bug Fixes

  • Add package overrides for minimatch and cookie vulnerabilities (9bbc97f)
  • backend: Exempt static assets from rate limiting (b34df19)
  • ci: Remove deleted scripts/ dependency from security job (cbccebc)
  • deploy: Harden Helm chart against replica races and Discord redirect misconfig (2ea094a)
  • deps: Patch quinn-proto DoS and devalue prototype pollution (3faa801)
  • deps: Suppress transitive advisories and pin trivy-action (0d49c69)
  • filter-bar: Make the term and instructor pickers behave for keyboard and screen readers (9d8ca38)
  • filter-bar: Stop the term, subject, and search boxes closing on their own (9de99c1)
  • scraper: Replace single-page search with paginated search_all in subject job (0f44a82)
  • search-autocomplete: Unwrap microfuzz CJS default under rolldown bundling (23b1172)
  • security: Update svelte to 5.53.5 to patch XSS vulnerabilities (a5f163c)
  • ssr: Stop module-level caches from leaking across server requests (506310e)
  • stories: Stop addon-svelte-csf rendering bare components without props (f04bcef)
  • tempo: Recurse subdirectories when copying ts-rs bindings (c481aa8)

Performance Improvements

  • backend: Deferred sync bot client init, non-blocking schedule cache load (f607403)
  • backup: Replace in-memory dump+compress with streaming multipart upload (3b62a51)
  • data: Add course_meetings table, eliminate JSONB schedule parsing (145d5f9)
  • data: Precompute per-term aggregates and add maintenance jobs (95f9bfd)

Code Refactoring

  • Add error context to uncovered db operations and harden stream subscription lookup (4ae1409)
  • admin: Give the scraper tables one cell definition each (3050359)
  • admin: Share one matching table between bluebook and rmp (b71a6ea)
  • autocomplete: Pull the typeahead query and merge logic out of the components (11f2195)
  • backend: Cleanup AppState, parallelize startup, move bg tasks, fix layering (708ab81)
  • course-table: Key every column table on one ColumnId union (9a6749d)
  • course-table: Split cell components and extract shared state helpers (840a5a8)
  • data: Derive the sort key list instead of writing it out (288d7b2)
  • data: Move the sort layer into its own module (ef5b45f)
  • data: Replace fixed-parameter search functions with SearchFilter struct (7d31d0c)
  • data: Type JSONB columns and bind pagination parameters (a70c9ac)
  • Decompose routes.rs into focused handler modules (e3bd22c)
  • Delete dead code and correct stale RUST.md docs (2e6189d)
  • Extract database query functions into data layer (a6b00fd)
  • Extract reusable table components and deduplicate slow-op logging (8b5d052)
  • scraper: Replace immediate retry with jittered backoff, bound SSR client (5907466)
  • scripts: Replace bun script suite with tempo CLI (81a6a6b)
  • ssr: Replace Bun entrypoint script with Rust-supervised Node SSR (d1df760)
  • Standardize data layer signatures to pool-first, use anyhow::Context (a4566cc)
  • tempo: Switch to 0.2.0 engine, rework bindings generation, add deploy secret sync tasks (5b2f9b9)
  • web: Drop attributeMap from CourseDetailContext, modernize Storybook stories (c2b3928)
  • web: Use get_all_terms in search options (6e5e924)

Continuous Integration

  • e2e: Keep the artifacts that explain a browser failure (a7e4432)
  • Replace the hand-rolled audits with the advisory scanner (d3ede7f)
  • Restore gha build cache (5292112)
  • Switch docker build cache to GHCR, add mold/clang for faster builds (2c6df24)

Miscellaneous

  • deploy: Pin kubectl for direct k3s cluster access (60f9f92)
  • deps: Add undici as web dependency (5355461)
  • deps: Bump quinn-proto to 0.11.16 (e79ad87)
  • deps: Fix frontend security vulnerabilities in web deps (eb17de6)
  • deps: Refresh dependencies and bound the cookie override (796ed77)
  • deps: Update frontend dependencies ([c53f40e](c53f40e842ebcbaf47beae7c9c20...
Read more

v0.7.1

Choose a tag to compare

@Xevion Xevion released this 26 Feb 08:00
8caa3dc

0.7.1 (2026-02-26)

Features

  • Add Cache-Control headers, ETags, and dynamic robots.txt (3a39e70)
  • Add course/subject detail pages, breadcrumb nav, and cross-linking (6b20697)
  • Add PostHog telemetry with type-safe event tracking (a46ade5)
  • Add security headers, CSP reporting, and client IP extraction (229e0b2)
  • Add Server header with package version (bbed357)
  • Add unsigned newtypes (Count, DurationMs) for non-negative DB fields (fa5bfcf)
  • Add XML sitemap endpoints with in-memory caching (dde5f8b)

Bug Fixes

  • calendar: Resolve term slug to code before DB lookup (91f701e)
  • csp: Allow data: URIs in font-src for inline woff2 fonts (136075c)
  • env: Propagate proper posthog host keys through Dockerfile for CSP (db7b481)
  • Inject x-request-id into request for SSR propagation (2839b75)
  • Propagate x-forwarded-for through SSR proxy, fix PostHog distinctId misuse (d901a2d)
  • search: Disable part-of-term filter for summer terms, prefer section for course breadcrumb (2537a9c)

v0.7.0

Choose a tag to compare

@Xevion Xevion released this 25 Feb 22:48
c82ceb1

0.7.0 (2026-02-25)

Features

  • Accent-insensitive search via PostgreSQL unaccent extension (e6fb3e1)
  • Add BlueBook course evaluation scraper and database schema (bd2c3c3)
  • Add incremental BlueBook scraping with per-subject intervals (17d205c)
  • Add pending status, nickname matching, and review-course scoring to RMP matching (7ccfb06)
  • Add public instructor directory and profile pages (eb8c6cb)
  • Add RMP review scraping with per-professor scheduling (5e18ecf)
  • Add ScoreBar component with layerchart visualization and Storybook decorators (c32970b)
  • Add search autocomplete with server-side trigram suggestions (616974f)
  • Add section count to instructor suggestions and fix audit sort order (2edfe45)
  • admin: Add BlueBook instructor linking admin UI and API (4e1af55)
  • admin: Add term column to scraper jobs and audit tables (9964218)
  • backend: Add app_kv store to persist scheduler and bot state across restarts (69090d0)
  • backend: Add Cache-Control headers to reference and search-options routes (80f5856)
  • backend: Spawn background reference cache refresh every 30 minutes (a183776)
  • Bayesian instructor scoring combining RMP and BlueBook data (c47bb8c)
  • bot: Add subject and term autocomplete to search command (feb0142)
  • debug: Add dev auth bypass for local testing (fdea62c)
  • Enrich RMP matching with review metadata and unified subject scoring (ddcfcd6)
  • Extract SortSelect component with direction toggle (d85206c)
  • frontend: Add server-side API proxy and fix SSR compatibility (f562eba)
  • frontend: Compress campus filter groups into compact availability URL param (a2e9eb6)
  • frontend: Redesign health and admin status pages (843eacc)
  • Handle overenrolled sections in seat availability display (5f699cf)
  • infra: Add database backup script with R2 upload and Docker support (26b3349)
  • Integrate BlueBook scraper into scheduler with admin trigger endpoint (9173aa7)
  • log: Enhance tracing formatter with syntax highlighting and smart field grouping (8d58f8a)
  • Replace LATERAL RMP subqueries with materialized view (730e75b)
  • scraper: Per-term adaptive scheduling with archived term tiers (1491370)
  • scripts: Harden db reset with dynamic prompt (b793d82)
  • Slug-based instructor filtering with autocomplete (07aa9e5)
  • Store instructors without email addresses (d23d554)
  • stream: Add ScraperStats, ScraperTimeseries, and ScraperSubjects stream kinds (f32b727)
  • Support numeric ID and email-prefix lookup for instructor endpoints (00649fa)
  • Surface BlueBook ratings and composite scores across instructor views (57185a8)
  • Surface instructor subjects, years, and email in bluebook link review (6913126)
  • Switch frontend from SPA (adapter-static) to SSR with Bun (bc5e60c)
  • terms: Add multi-term scraping support with database table and admin API (f5d13b0)
  • web: Replace TraceLayer with ULID-based request ID middleware (8d2a1cd)

Bug Fixes

  • backend: Change valid year range to start in 2001 (e081ace)
  • backend: Make hours_week nullable to handle null API responses (ae035ec)
  • backend: Make instructional_method option to support older semesters (7d97cc9)
  • backend: Make wait_capacity, wait_count, and meeting_type nullable for older courses (5445ba8)
  • bluebook: Tolerate mismatched subject prefixes and non-breaking spaces in course parsing (22e85c1)
  • ci: Update bytes dependency for security audit fix, add security audits to check script (049938a)
  • deps: Force ajv update to satisfy security vulnerability (4626df1)
  • deps: Update time to 0.3.47 for RUSTSEC-2026-0009 (1321d1e)
  • frontend: Card slide animation null height issues (e78a46c)
  • frontend: Include title in teaching history each-block key to prevent duplicates (f2afa8a)
  • frontend: Use pointer cursor on instructor link only, ignore link clicks for row expansions (4679320)
  • frontend: Use proper theme variables for styling scrollbar handle (516f567)
  • Improve search autocomplete popover trigger and z-index handling (bb5aa3d)
  • infra: Copy .sqlx cache and set SQLX_OFFLINE in Dockerfile (4014e64)
  • infra: Install mold, add nextest, timeouts, and bun ci to CI (9b33205)
  • scripts: Guard against re-entrant cleanup and handle SIGINT exit cleanly (7cd4650)
  • Widen credit hour columns from INTEGER to DOUBLE PRECISION (3b5184c)

Performance Improvements

  • backend: Stream schedule cache loading with SQL-side meeting extraction (0ec9eb7)
  • db: Drop redundant/unused indexes, add scrape job index (6663a99)
  • scripts: Speed up check script by limiting run build & test scope to lib tests (83e25e5)

Code Refactoring

  • admin: Extract shared UI components and composables from admin pages (c36d7d0)
  • backend: Extract SearchOptionsCache with typed storage and singleflight (80abd1d)
  • backend: Migrate audit ol...
Read more

v0.6.3

Choose a tag to compare

@Xevion Xevion released this 03 Feb 03:42
5faed53

0.6.3 (2026-02-03)

Features

  • web: Add related sections API and refactor course view (bec81f7)
  • web: Add storybook with component stories and vitest integration (5cb3155)
  • web: Enable ESLint with TypeScript and Svelte support (87f0808)

Bug Fixes

  • Outdated course data queries (bd9a8d3)
  • Switch weekdays jsonb query to modern array format (348492f)
  • web: Resolve animation rendering issues with fill modes (a71e648)

Code Refactoring

  • api: Migrate to typed reference data enums (56fabc2)
  • Consolidate course data models into structured types (2157035)
  • web: Centralize filter state with context-based store (f4a3c55)
  • web: Fix ESLint violations and enhance types (89f3a23)

Miscellaneous

  • web: Disable clearScreen for vite dev server (c5fef57)

v0.6.2

Choose a tag to compare

@Xevion Xevion released this 01 Feb 08:46
2123bcb

0.6.2 (2026-02-01)

Features

  • web: Add dynamic range sliders with consolidated search options API (f5a639e)
  • web: Batch rapid search query changes into history entries, allow for query history (e920968)
  • web: Build responsive layout with mobile card view (bd2acee)
  • web: Implement aligned course codes with jetbrains mono (567c4ae)
  • web: Implement multi-dimensional course filtering system (106bf23)
  • web: Implement smooth view transitions for search results (5729a82)

Bug Fixes

  • cli: Add proper flag validation for check script (2acf52a)
  • data: Handle alphanumeric course numbers in range filtering (96a8c13)
  • Re-add overflow hidden for page transitions, but with negative margin padding to avoid clipping (9e825cd)
  • Separate Biome format and lint checks to enable auto-format (ac8dbb2)
  • web: Ignore .svelte-kit/generated in vite watcher (b562fe2)
  • web: Prevent duplicate searches and background fetching on navigation (5dd35ed)
  • web: Prevent interaction blocking during search transitions (7f0f087)
  • web: Skip view transitions for same-page navigations (b37604f)

Code Refactoring

  • api: Extract toURLSearchParams helper for query param handling (6c15f40)
  • api: Rename middleware and enable database query logging (f387401)
  • Migrate API responses from manual JSON to type-safe bindings (0ee4e8a)
  • Standardize error responses with ApiError and ts-rs bindings (239f7ee)
  • web: Consolidate tooltip implementations with shared components (d91f7ab)
  • web: Extract FilterPopover component and upgrade range sliders (4e01406)
  • web: Replace component tooltips with delegated singleton (d278498)
  • web: Split CourseTable into modular component structure (bbff2b7)
  • web: Streamline filter ui with simplified removal (4426042)

Miscellaneous

  • Add aliases to Justfile (02b18f0)
  • Add dev-build flag for embedded vite builds (5134ae9)

v0.6.1

Choose a tag to compare

@Xevion Xevion released this 31 Jan 06:38
47132e7

0.6.1 (2026-01-31)

Features

  • build: Auto-regenerate TypeScript bindings on source changes (e203e8e)
  • course: Distinguish async from synchronous online courses (8bfc14e)
  • scraper: Improve dashboard clarity with stat tooltips (1ad614d)
  • scraper: Improve results visibility and loading states (c533768)

Bug Fixes

  • Avoid status flickering on subjects table (2689587)
  • ci: Add postgres container service for rust tests (ebb7a97)
  • ci: Fix rust/frontend/security job failures and expand local checks (dd148e0)
  • data: Decode HTML entities in course titles and instructor names (7d2255a)
  • metrics: Always emit baseline metrics on initial course insertion (16039e0)

Code Refactoring

  • terms: Move term formatting from frontend to backend (cbb0a51)
  • Use friendly term codes in URL query parameters (550401b)

Continuous Integration

  • Add Release Please automation for changelog and version management (6863ee5)
  • Split quality checks into parallel jobs with security scanning (3494341)

Miscellaneous

  • Add ts-rs generated bindings (2df0ba0)
  • Update frontend packages (acccaa5)