Bullseye
A modern, real-time personal productivity application built with Svelte 5 and SvelteKit. Bullseye helps you build better habits and capture your thoughts with a fast, offline-first experience that syncs across all your devices.
Features
- Habit Tracking - Build and maintain daily habits with a visual calendar grid, numeric tracking, and progress insights
- Notes - Capture thoughts with a markdown editor, organize with tags, and find anything with full-text search
- Real-time Sync - All your data syncs instantly across devices with offline support
- Dark Mode - Full light/dark theme support with customizable primary colors
Planned Features
- Tasks/Todos with due dates and priorities
- Long-term reminders with push notifications
Tech Stack
| Category | Technology |
|---|---|
| Framework | Svelte 5 + SvelteKit |
| Language | TypeScript (strict mode) |
| Styling | Tailwind CSS 4 |
| UI Components | shadcn-svelte (Bits UI) |
| Database | Triplit (real-time sync) + SQLite (authentication ) |
| Authentication | Better Auth |
| Markdown | Carta-md with Shiki syntax highlighting |
Getting Started
Prerequisites
- Node.js 18+
- pnpm (recommended) or npm
Installation
# Clone the repository
git clone https://github.com/yourusername/bullseye-app.git
cd bullseye-app
# Install dependencies
pnpm install
Environment Setup
Create a .env file in the project root:
# SQLite database for auth
DATABASE_URL=local-drizzle.db
# App URL
ORIGIN="http://localhost:5173/"
# Better Auth secret (generate a 32-character random string)
BETTER_AUTH_SECRET="your-secret-key-here"
# Triplit configuration
LOCAL_DATABASE_URL="local-triplit.db"
PUBLIC_TRIPLIT_SERVER_URL="your-triplit-server-url"
PUBLIC_TRIPLIT_TOKEN="your-triplit-token"
Database Setup
# Push schema to database
pnpm run db:push
Running Dev Server
# Start development server
pnpm run dev
# Start triplit development server
pnpm triplit dev
Project Structure
src/
├── lib/
│ ├── api/ # Data layer (Triplit CRUD operations)
│ ├── components/ # Reusable Svelte components
│ │ └── ui/ # shadcn-svelte component library
│ ├── context/ # State services (Svelte 5 runes)
│ ├── server/ # Server-only code (auth, database)
│ ├── triplit/ # Triplit client and schema definitions
│ └── utils.ts # Utility functions
├── routes/
│ ├── (app)/ # Protected application routes
│ │ ├── habits/ # Habit tracking feature
│ │ └── notes/ # Notes feature
│ └── login/ # Authentication pages
Feature Documentation
Habit Tracking
Track daily habits with a visual calendar interface that shows your progress over time.
Capabilities
- Create habits with custom names, targets, and optional units (minutes, reps, pages, etc.)
- Track progress with numeric values, not just checkboxes
- Set duration with optional start and end dates
- Mark as inactive to pause tracking without deleting history
- Visual calendar showing completion status across days
Usage
- Click "New Habit" to create a habit
- Set your daily target and optional unit
- Use the calendar grid to log completions
- Click cells to set values or mark as complete
- Right-click cells for additional options (mark failed, clear)
Notes
A markdown-based note-taking system with real-time sync, tagging, and powerful search.
Capabilities
- Markdown editing with live preview and syntax highlighting
- Auto-save with 500ms debounce after typing stops
- Full-text search across titles, content, and tags
- Tag organization with free-form user-created tags
- Pin important notes to keep them at the top
- Archive notes to hide without deleting
- Trash with recovery - deleted notes are retained for 30 days
Workflow
Creating Notes:
- Click "New Note" button
- Start typing - title is optional
- Notes auto-save as you type
Organizing Notes:
- Use the tabs to filter: All, Pinned, Archived, Trash
- Add tags via the note action menu
- Pin important notes to keep them visible
- Archive notes you want to keep but hide
Finding Notes:
- Use the search bar to find notes by title, content, or tags
- Search is instant and filters the current view
Editor Features:
- Switch between Write and Preview tabs
- Full GitHub-flavored markdown support
- Syntax highlighting for code blocks
- Character count displayed in footer
Security
Authentication
Bullseye uses Better Auth for secure email/password authentication. Sessions are managed via HTTP-only cookies with automatic expiration.
Data Isolation
All data is scoped to individual users via row-level security. Triplit enforces that users can only read and write their own data through permission filters on every collection.
Important: Shared Browser Warning
Triplit stores data locally in IndexedDB for offline support. This means:
- Data is cached in the browser's IndexedDB storage
- If multiple users share the same browser profile, they may be able to access each other's cached data
- This applies even after logging out, as IndexedDB persists until explicitly cleared
Recommendations for shared computers:
- Use separate browser profiles for each user
- Use private/incognito browsing mode
- Clear browser data (specifically IndexedDB) after logging out
- Consider this app unsuitable for highly sensitive data on shared devices