Version: v0.1.0
JobTrackr is a desktop-first, single-user application that helps manage job applications, companies, contacts, notes, interactions, and reminders — entirely offline. All data is stored locally in an embedded SQLite database, and no cloud or network access is required.
JobTrackr provides a structured local workflow for tracking every step of your job search. It integrates a Rust + Tauri backend for database and file handling, with a modern SvelteKit + Tailwind + shadcn-svelte frontend.
- Backend: Rust, Tauri v2,
sqlx(SQLite),tracingfor logging - Frontend: SvelteKit 5 (runes), TailwindCSS, shadcn-svelte, Lucide icons
- Dates:
@internationalized/datefor timezone-safeCalendarDatehandling - Data Storage:
~/.JobTrackr/jobtrackr.db - Logs:
~/.JobTrackr/logs/YYYY-MM/jobtrackr.YYYY-MM-DD.log
- Tauri commands act as the bridge between Svelte and Rust, exposing CRUD for all entities.
- Services in Rust perform logic and formatting before returning JSON responses.
- Svelte stores mirror backend entities and expose load/create/update/delete functions.
- Dialogs are modular Svelte components for creating and editing records.
- Homepage preloads all stores to ensure fast navigation and data availability.
- Company
- Person
- JobListing
- Application
- Interaction
- Note
- Reminder
Stage, WorkType, SeniorityLevel, Currency, Role, NoteType, InteractionType
Each entity includes timestamps (createdAt, updatedAt) and a generated displayLabel.
Use $state and $bindable, and never mutate objects in place.
// Correct
$formData = { ...existing, field: value };
// Incorrect (non-reactive)
Object.assign($formData, existing);Dialogs rehydrate by fully reassigning $formData to maintain reactivity.
All entity stores are loaded when the homepage mounts:
onMount(() => Promise.all([
loadApplications(),
loadCompanies(),
loadNotes(),
loadJobListings(),
loadPeople(),
loadReminders(),
loadInteractions()
]));Avoid .toISOString() to prevent UTC shifts.
Construct date strings manually:
const d = $formData.reminderDate;
const yyyyMmDd = `${d.year}-${String(d.month).padStart(2, "0")}-${String(d.day).padStart(2, "0")}`;- Full CRUD dialogs for all entities
- Unified alert system (success, error, info)
- Homepage with:
- Recent Applications
- Pending Reminders
- Recent Notes
- Fallback messages when lists are empty
- Live-updated stores and dialogs
- Timezone-safe date handling
- Automatic store preload for subpages
src-tauri/
src/
commands/ # Tauri command functions
services/ # Business logic layer
db/ # SQL schema, models, enums
utils/ # Logging, helpers
src/
lib/
stores/ # Svelte stores for CRUD
components/
formDialogs/ # Entity dialogs
ui/ # shadcn-svelte components
utils/ # Custom selectors, alerts, date pickers
routes/
+page.svelte # Homepage using live store data
All platforms
- Rust (stable)
- Cargo
- Node.js 18+
pnpmornpm
Linux
sudo apt install libgtk-3-dev webkit2gtk-4.1 pkg-config appmenu-gtk3-modulemacOS
xcode-select --installWindows
- Visual Studio Build Tools
- WebView2 Runtime
# Clone the repository
git clone https://github.com/<your-user>/JobTrackr.git
cd JobTrackr
# Install frontend dependencies
pnpm install # or: npm install
# Fetch Rust dependencies
cargo fetchpnpm tauri dev # or: npm run tauri dev- SQLite database is created at
~/.JobTrackr/jobtrackr.db - Logs are stored under
~/.JobTrackr/logs/YYYY-MM/
pnpm tauri build # or: npm run tauri buildBinaries are placed in:
src-tauri/target/release/bundle/
- Open dialog and fill form
- Submit → backend updates SQLite
- Store updates → UI refreshes → dialog closes
Each store exposes:
loadX();
createX(payload);
updateX(id, updates);
deleteX(id);Links use:
<a href={resolve("/path")}>Link</a>This ensures safety under SvelteKit 2+.
Logs rotate daily and are grouped by month:
~/.JobTrackr/logs/YYYY-MM/jobtrackr.YYYY-MM-DD.log
Includes startup, database initialization, and runtime events.
Dialogs don’t update properly
Reassign $formData entirely rather than mutating.
Date saved as previous day
Avoid .toISOString(); build YYYY-MM-DD manually.
Selectors empty Ensure preload occurs before opening dialogs.
Linux build fails Install missing GTK or WebKit dependencies.
- 100% local data — no internet access required
- No telemetry, analytics, or cloud sync
- All user content stored in
~/.JobTrackr/
- No schema migration UI
- No multi-user support
- Minimal form validation
- No filtering/sorting UI yet
- Sorting and filtering for all list pages
- export (JSON, CSV, Excel, DB)
- import (JSON, CSV, Excel, DB)
This project is licensed under the MIT License.
- UI Components: shadcn-svelte (adapted for Svelte 5)
- Icons: Lucide
- Frameworks: Tauri, SvelteKit
- Author: Chris Nielsen (Rodhor)