A fast, high-performance exam scheduling system backed by Z3, with a SvelteKit frontend. Designed for small-medium sized schools. kemisolve.wobbl.in
schools school z3 scheduling exam-scheduling solver
kemisolve CONTRIBUTING.md
3.3 kB
Markdown
at main

Overview #

  • crates/app: Tauri app for the frontend
  • crates/backend: database access, data prep, and wiring to the solver.
  • crates/entity: SeaORM entities generated from the SQLite schema.
  • crates/hack: cargo-hakari managed hack crate to speed up build times
  • crates/solver: Z3-backed scheduler and constraints.
  • packages/frontend: Sveltekit frontend
    • Personal note: I despise some of the stuff I've pulled off in there out of principal but since I always know I have JS might as well save me brain power and use cursed stuff (looking at you, tanstack forms)
    • Personal note 2: Heavily vibe-refactored and I don't like how "busy" some of the code is. I'll have to do a full review/potential rewrite later to clean stuff up. Probably more state stores and derived shenanigans.
  • packages/eslint-config: ESLint config for the frontend
  • packages/tauri-api: Autogenerated tauRPC bindings for the frontend (and provides types for ui)
  • packages/ui: Shared UI components and types
  • packages/website: Website for the project, including a way to generate a personalised timetable

Dependencies #

  • Tauri dependencies
  • SQlite
  • Z3
    • Unless you're using the gh-release or vendored feature flags
    • gh-release and the default featureset requires the end-user to have Z3 installed as well. vendored will statically link z3

Quick start #

From the repository root:

  • Build workspace: pnpm moon run :build-release
  • Run tests: pnpm moon run :test
  • Lint: pnpm moon run :lint
  • Format: pnpm moon run :format

Coverage helpers are documented in docs/coverage.md.

TODOs #

  • Fix the severe lack of actual reactivity (thanks Codex for being react-brained. bleh. The code is ugly and I apologise for anyone who looks at it right now)
  • Make the UI for timetables better
    • Proper saving/loading
      • Custom Save vs. Save As
      • Notification when a save happened successfully
    • Categorise the UI better
    • Solver progress/explanation
    • Ability to check an edited timetable
    • Clearer resolve behaviour
    • Better Dialogs
    • Confirmation when a user exports
    • Add an unsaved changed notification when trying to close or navigate away
  • Add in CI for tangled

AI usage and contribution policy #

Some bits are messy and AI generated with little review other than "yeah that code is fine and it works". I am slowly reviewing of all AI-marked areas :p. I do not approve of vibe coding (i.e. LLM generated code without proper review), but LLMs are a useful tool to get stuff done a bit faster. A lot of the current LLM-generated code is small helper functions that I just need to go through and see if they're needed or they can be removed/collapsed into more useful primatives

The core solver and actual algorithm are NOT AI generated, and are entirely written by hand. It's mostly the UI that has some AI-generated javascript. Most of the actual UI is done by hand as well to ensure performance and usability.

AI was used in this repository. All AI-generated contributions that have not been modified/fully reviewed by persons are marked with an explicit notice (for example /// AI-generated. in Rust doc comments, or /** AI-generated */ in JSDoc).

AI-generated contributions are allowed, but they will be reviewed strictly and must be marked as such.