Beforework is a serverless local-first project management workspace for projects, tasks, calendars, and focus sessions. Work across List, Table, Board, Calendar, Roadmap and Milestone views, and add custom fields, comments, checklists, reminders, and multiple file attachments to items. The static app stores workspace data in folders you choose on your device rather than any server. Optional Google Calendar integration connects to Google separately.
If you do not want to host Beforework locally, use the hosted version at beforework.netlify.app.
Open it in Chrome or Edge, then choose a workspace root folder. Beforework creates each workspace as a separate child folder inside that root. Existing single-file JSON workspaces can still be opened and copied into the folder format.
Beforework is source-available under the PolyForm Noncommercial License 1.0.0. Personal and non-commercial use are permitted. Offering Beforework, or a modified or hosted version of it, as a product or service to third parties requires permission. Contributions and bug reports are welcome; see CONTRIBUTING.md.
- Projects, folders, groups, tasks, and standalone calendar items
- Markdown-formatted task descriptions and comments with a live preview; existing text stays compatible and raw HTML is disabled
- List, table, board, calendar, roadmap, and milestone views with per-project view configuration
- Workspace and project roadmaps with task duration bars from optional start dates to task dates, plus milestone markers
- Start date, due date, custom date, and other fields for text, checkboxes, priority, single- and multi-selects, relations to other project items, URLs, email addresses, and numbers
- Tags, subtasks, comments, activity history, archiving, recurring schedules, and reminders
- Multiple file attachments per item in folder workspaces, plus project and calendar item attachments
- Drag-and-drop data-column ordering saved independently for List and Table views
- CSV export of the current filtered List or Table view, in visible column and row order
- CSV import with column mapping and preview into an existing or new project. It supports task titles, descriptions, due dates, priority, status/groups, and tags; select the date format used by the CSV (
DD/MM/YYYY,MM/DD/YYYY, orYYYY-MM-DD). - Searchable overview statistics, workload and progress summaries, and a focus timer
- Keyboard shortcuts, a command palette, and quick actions for common workspace tasks
- Browser notifications for reminders and tasks due today while the app is open
- Optional Google Calendar integration and dedicated Integrations / Support pages
- Folder-based JSON workspaces with automatic recovery snapshots, file conflict checks, import/restore validation, and legacy single-file JSON import and migration support
Beforework uses the File System Access API to open and save a workspace root and its child workspaces. Open it from a Chromium-based browser through localhost or HTTPS rather than using a file:// URL.
If Python is installed:
python3 -m http.server 8000Then open http://localhost:8000/ in Chrome or Edge and create a workspace folder, open an existing folder workspace, or connect an older single-file JSON workspace.
Local hosting starts with an empty workspace by default. For a demo workspace with sample projects, project notes, calendar events, and custom fields, use the hosted Beforework demo or build a local demo by enabling BEFOREWORK_MODE=demo.
For development, if you need to run the demo data locally, build and serve the generated site with demo mode enabled:
$env:BEFOREWORK_MODE = "demo"
node scripts/build-site.js
python -m http.server 8000 --directory distThe production build minifies JavaScript, CSS, and HTML in dist; source files remain readable and unchanged. On macOS or Linux, run the build with BEFOREWORK_MODE=demo node scripts/build-site.js, then serve dist with a static file server.
This is a static site. Netlify installs the build dependencies, runs npm run build, and publishes dist. The build minifies JavaScript, CSS, and HTML in the deploy output without changing source files. Set the site environment variable BEFOREWORK_MODE to demo to seed new workspaces with sample projects, calendar items, checkbox/URL/Email/Number/Multi-select fields, and a downloadable project-notes attachment. The default is clean, which starts with an empty workspace.
The app keeps the same local-first data model in both modes: a folder workspace on the user's device, optional attachments, and browser-side persistence. The demo site simply preloads sample content so new users can explore the UI without creating data manually.
To host both versions, connect the same repository and branch to two Netlify sites. Leave BEFOREWORK_MODE unset (or set it to clean) for beforework.netlify.app, and set it to demo for beforework-demo.netlify.app. Changes to an existing workspace file are unaffected by this setting.
The source config defaults to clean. The build script writes the selected mode into dist/js/config/site-config.js without changing the source config.
For production use, serve the site over HTTPS. Users still retain their data locally or in a synced folder such as OneDrive or Google Drive; the application does not upload workspace data to a project server.
Google Calendar is optional. Configure the Google OAuth client ID used by the application, then connect calendars from the Integrations page. Calendar synchronisation requires the relevant Google Calendar API and OAuth consent configuration.
Workspace data is stored in JSON shards inside a folder. manifest.json stores workspace metadata and maps project IDs to separate project JSON files; calendar entries live in their own JSON shard. Each workspace carries a schemaVersion value. Projects can have an optional description and project-level milestones with optional due dates; tasks can be linked to milestones to track checkpoint progress. Existing single-file workspace JSON remains supported and can be opened or migrated into a folder workspace. List and Table column arrangements are saved per project and view.
Item attachments are stored as separate files under the workspace's attachments/ directory, with multiple attachments supported per project or calendar item. Attachments require a folder workspace; they are not embedded in legacy single-file JSON. Browser recovery snapshots contain workspace JSON and attachment metadata, not the attachment file contents. The demo workspace includes a downloadable plain-text project-notes attachment. CSV exports contain the current filtered rows and visible columns; values are escaped for CSV and spreadsheet formula safety.
Beforework also keeps up to eight rolling recovery snapshots in IndexedDB, with a 64 MB total storage limit. The app saves a pre-write snapshot at most once every 30 minutes and creates additional snapshots before imports, restores, file conflicts, and workspace switches with unsaved changes. In Settings > Storage & Data, retained snapshots can be restored or exported. Pre-upgrade snapshots remain available separately. This makes recovery and validation safer when upgrading older data or resolving file changes from another process.
When an older or unversioned workspace is opened or imported, Beforework validates its structure and applies migrations in order until it reaches the current schema. Future schema versions and malformed project, group, or item data are rejected before they can replace the active workspace. Migrations add or reshape fields without deleting retired properties, which helps keep older data recoverable.
Recovery snapshots are local to the current browser profile, do not sync with the workspace file, and may be removed if browser site data is cleared. Export a JSON copy or keep the workspace file in a synced folder for portable recovery. Before each save, Beforework compares the connected file with the revision it last read or wrote. If the file changed elsewhere, choose to load the external version (the tab's version is snapshotted) or overwrite it (both versions are snapshotted); canceling leaves the tab's changes in memory without overwriting the file. Settings shows save progress or failure and offers a retry.
Imports are validated and confirmed before replacing the active workspace. Before import or restore, the current in-memory workspace is snapshotted; if a snapshot cannot be saved, the replacement is blocked.
New schema changes should add a new migration step rather than changing an existing one, so files from every earlier version can continue to upgrade safely.
index.html- application shelljs/app.js- application behavior, rendering, column controls, and CSV exportjs/services/storage/- local workspace persistence and attachmentsjs/services/reminders/- in-app reminder scheduling and notificationsjs/ui/- shared UI components, appearance preferences, and HTML template loadingjs/features/- cohesive application featuresjs/config/- build-generated runtime configurationjs/demo/- demo workspace data and attachmentsjs/models/andjs/views/- application models and view modulesjs/services/google-calendar/- optional Google Calendar integrationjs/commands/- workspace-specific command definitionsjs/core/- workspace validation, schema migrations, and data-version compatibilitypages/- HTML templates for application views, dialogs, and featuresstyles/manifest.css- stylesheet entry point, importing shared and feature-specific stylesimages/- icons and image assetsscripts/build-site.js- static production build and minificationtests/- Node.js regression tests
Beforework is a source-available, local-first project maintained to give people a private and portable way to manage projects, tasks, and calendars. If you find it useful, sponsorship helps support ongoing maintenance, browser compatibility, accessibility, documentation, and new privacy-focused features.
Beforework is source-available under the PolyForm Noncommercial License 1.0.0.
The source is public and you're free to use, modify, and distribute it for personal or noncommercial purposes. Commercial use - including offering Beforework, or a modified or hosted version of it, as a product or service - is not permitted without a separate agreement with the Licensor.
Contributions and bug reports are welcome; see CONTRIBUTING.md.