Set only the code and stop time β start auto-fills from the previous block. Drag the β Ώ handle to reorder blocks; times recompute to match the new order.
Daily Codes, Totals & Journal Sync
Code
Client
Bill
Type
Sync to Journal (optional)
Hrs
Pick a journal project (only those with a client code appear) and a section to enable sync.
Leave it blank to just track the time without posting it anywhere.
Standard codes β always available in the log picker
These are fixed so they can't be edited by accident. Pick them by letter in the Time Log above.
Today's W.I.N.
Billable
0.00
Non-billable
0.00
Unpaid
0.00
Total Β· Days
0.00
By Client / Project
Click any row for the full note trail β every time-entry note for that code this month, plus the linked journal notes. Handy when someone asks where the hours went.
Client / Project
Type
Hours
Share
Daily W.I.N. β What's Important Now
Up to five things that matter most today. Check them off as you go β they show on the Time Card and in the CCH summary for the same date.
Create New Project
Type
Structure (template)
Notes
Import Backup
Merge adds the imported data to what you have. Replace discards current data and loads only this backup.
Daily Summary
Read this off your second screen while keying into Axcess.
π Enter your passphrase
This copy of Project Journal & Timecard is encrypted on this device. Enter your passphrase to unlock it.
Paste your Recovery Key (the one you saved when you turned encryption on):
Set a passphrase
Pick something strong you won't forget. There is no reset β only the Recovery Key you'll get next.
π Storage & Cloud Sync
Everyone using this build shares one private team gist; each person gets their own journal file inside it. Your Journal ID is all you need to restore on another machine. Time entries & project notes only β keep client-identifying data out.
πΎ Local storage (this device)
β¦
π Encryption (this device)
β¦
Your Recovery Key β save it now. This is the only way in if you forget your passphrase, and it won't be shown again.
Not connected
Team code
Paste the one-time Team code your admin gave you. It connects this device to the shared team gist. You only do this once (or again after a token rotation).
First-time setup (admin)? Enter the team gist ID + token to connect. Your shareable Team code then appears in the box below.
Team code (admin)
This device's Team code β hand it to a coworker to onboard them, or keep it to reconnect after rotating the token. Treat it like a password.
β
Your Journal ID
Save this (password manager / sticky note). Paste it on another machine to pull your journal down. Anyone with the build + this ID can open your journal.
β not set up yet β
Create a new journal
First time on this device? Make your journal β it adds your own file to the team gist from your current data.
Join an existing journal
New machine, or recovering? Paste your Journal ID and pull it down.
β User Guide & Reference
Project Journal & Timecard (PJT) is a single self-contained app for tracking audit projects, section budgets vs. actuals, preparer/reviewer notes, open items, and daily time. Your data lives on your own machine; cloud sync is optional. Keep client-identifying details out of anything that syncs β the team cloud is shared. Tap a heading below to expand it. The app version is shown in the top-left header.
About this app
PJT is one file that does three things, one per tab at the top: Project Journal (track workpaper sections, budgets, notes, open items), Time Card (log your day and roll hours into project sections), and Daily W.I.N. (a short "What's Important Now" list).
Everything saves automatically β the dot in the top-right reads Saved after each change. Nothing leaves your machine unless you turn on cloud sync. Because it's a single file, it's portable and hard to break: if a build ever misbehaves, an earlier version still opens your data.
Quick start
1. The β ACME Co β Example project is fake sample data so you can explore safely.
2. To use the team cloud (optional): gear β β Cloud Sync, paste the Team code your admin gave you, then Create a new journal, type your name, and save the Journal ID it shows you β that's your restore key on another machine. Tick Auto pull on open / push on save.
3. When ready, select the ACME example β Delete Project, then New Project to start your own.
4. Not using cloud? Skip step 2 β the app still saves locally and backs itself up.
Project Journal β full detail
Creating projects.New Project uses the Audit Template (comes with the firm-standard sections). Blank Project starts empty. Each project has a name, an optional Time-card client code (links it to your time card), a role (Preparer / Reviewer / Both), and free-form Project Notes.
Sections. Each row is a workpaper section with: a Status (In Prep β Tech Review β Review Comments β Complete), a Budget, an Actual, an auto-calculated Variance, Preparer Notes, Reviewer Notes, and Open Items. Expand any note box for a bigger editor, or use Copy to grab its text. Sections are grouped (Numbered & Review, Assets, Liabilities, Equity, Income & Expenses, Custom) and you can collapse groups.
Stat cards. The cards across the top sum the whole project β Total Budget, Total Actual, Variance, Complete count, and Open items β and update live.
Project actions (left panel): Rename, Duplicate Project, Copy to New Year (fresh copy with actuals cleared for a new engagement), Add Custom Section, Delete Project, and an Archived toggle to hide finished projects from the pickers.
Export.Export Project Markdown gives a clean text summary of the project; Copy Open Items grabs just the open items β handy for status emails or review notes. Search sections, notesβ¦ filters within the open project.
Section & billing codes β reference
The Audit Template ships with the firm's standard sections. They're self-describing by their prefix and sort into groups automatically.
Numbered & Review: 1 Permanent File Β· 2 General File Β· 3 Trial Balance and Reports Β· 4 Financial Statements Β· 5 Profit Vision Β· 7 Client Conferences Β· T Technical Review. Assets: A Cash Β· B Receivables Β· C Notes Receivable Β· D Inventory Β· E Prepaids Β· F Investments Β· G Fixed Assets Β· J Other Assets. Liabilities: M Payables Β· N Other Current Liabilities Β· O Notes Payable & Long-Term Debt Β· P Income Taxes. Equity: Q Equity. Income & Expenses: S Leases Β· W Work in Progress Β· X Income & Expense Accounts Β· Y R&D Credit Β· Z Tax Workpapers.
In the journal these stay grouped (Technical Review lives with the review sections). In the time-card's section-link dropdown they're ordered numerically then AβZ, so a code is easy to find. Custom sections you add yourself land in the Custom group. To add a firm-wide standard code permanently, it has to be added to the app's template (see the maintainer section) β sections you add in-app are per-project.
Time Card β full detail
Day Entry. Log your day by stop time β each entry runs from the previous stop to the one you enter, so you just record when you finished each block. Pick a code for each block.
Codes. A code is a single letter standing for a client + billing code + a type (billable, non-billable, or unpaid). Add your own client codes in the Daily Codes table. Give a code a linked project + section and its billable hours automatically roll up into that section's Actual in the Project Journal β that's how time flows into budgets.
Standard codes. The default non-billable/unpaid codes (Lunch, Break, Admin, Training, Non-chargeable) are hidden from the editable table to keep it clean, but they're always available in the log picker. Open the collapsible Standard codes reference under the Daily Codes table to see each one's letter and today's hours on it.
Month Report. Switch to Month Report for hours by client/project for the month. Click a column header (Client/Project, Type, or Hours) to sort; click again to reverse. Copy Report copies it in the sorted order for pasting into your firm's time system.
Daily W.I.N.
A lightweight "What's Important Now" checklist for the day β jot the few things that actually matter, check them off, and see a small progress indicator. It's intentionally simple; it's a focus list, not a full task manager.
Where your data is stored
Desktop app. Your journal is a single JSON file on this machine. The exact path is shown in gear β β Storage & Cloud Sync β the Local storage panel β it's under your Windows app-data folder, inside a folder named for the app's identifier, e.g. C:\Users\<you>\AppData\Local\com.pjt.projectjournaltimecard\PJT\journal.json, with dated snapshots in a backups subfolder. (That app-identifier folder is why the path is a bit longer than just "AppData\Local\PJT".)
Browser. Opened as a plain web page, it saves in that browser's local storage only (no disk file). The Local storage panel will say "browser mode."
How it reconciles. The app keeps an instant in-memory/local-storage copy and mirrors it to the disk file after each change. On launch it loads whichever copy was edited most recently β the same newest-wins rule cloud sync uses β so you don't lose the latest edit. No servers, no third parties: the file is just on your computer.
Backups & restoring
Automatic (desktop). The app writes one snapshot per day into the backups folder and keeps the newest 30, pruning older ones. Back up now (in the Local storage panel) makes an extra timestamped snapshot on demand. Restore from backup loads a chosen snapshot back β and takes a safety backup of the current state first, so restoring can't lose your present data.
Manual export/import (any mode). Gear β β Save Journal Backup writes a portable .json file you can keep anywhere; Import Backup loads one back (Merge or Replace). Backups never include sync credentials, so they're safe to store or share.
Sharing / demoing. Before showing this to anyone outside the firm, scrub client codes, contact names, and candid notes β the export/import round-trip is a convenient way to make a sanitized copy.
Encryption (optional)
Turn on encryption in gear β β Storage & Cloud Sync β Encryption to require a passphrase at launch and encrypt this device's data at rest β the working file, the daily backups, and the local cache. It uses standard strong encryption built into the app (no add-ons).
Recovery Key. When you enable it, you get a one-time Recovery Key. Save it (Copy or Download .txt, then store in a password manager or printed and filed). If you ever forget the passphrase, the Recovery Key is the only way back in. Lose both and the data cannot be recovered β that's the nature of real encryption, so treat the Recovery Key like a spare house key.
You can Change passphrase (Recovery Key stays the same) or Turn off encryption (writes everything back to plaintext) anytime while unlocked. The cloud copy is left unencrypted, so cloud sync and second-computer restore keep working normally.
Cloud sync (team) β optional
Sync is optional and lets you restore on another computer and (in future) share with teammates. It works through one private team store; each person gets their own journal file inside it, so coworkers never overwrite each other.
Setup. Gear β β Cloud Sync β paste the Team code from your admin (a one-time PJT1-β¦ string) β Create a new journal and save your Journal ID. On a second machine, Join an existing journal, paste that Journal ID, and Join & pull.
Day to day. With Auto pull on open / push on save ticked, it stays current by itself; Push/Pull are there for manual syncs. The top-right pill shows Local only (saving locally, not connected to cloud), Synced, Syncingβ¦, or Sync error.
Conflicts. If you edited on two machines without syncing between them, the next push warns you and shows which copy is newer. Pull takes the other copy; Push overwrites it with this one. When unsure, Pull is the safe choice.
Privacy. The team store is shared, so keep client-identifying data (real client names, account numbers, candid notes) out of anything you sync.
FAQ & troubleshooting β where to look
First stop for any storage/sync issue: gear β β Storage & Cloud Sync. Those panels print the exact status and error text, which usually names the fix.
"Sync error / can't reach GitHub" β usually a network blip or a rate limit; try Push/Pull again in a moment. A 401/403 means your Team code's token is wrong/expired β ask your admin for a fresh code.
Data looks missing / it's showing the ACME sample β most often you're in a different browser profile or a fresh install with a not-yet-loaded local file. If you use cloud sync, Pull from cloud with your Journal ID and it comes back. This is why a periodic Save Journal Backup is worth ten seconds.
Local storage panel says "browser mode" β you're running the plain HTML in a browser, not the desktop app; there's no on-disk file in that mode (data is in the browser's storage). Use the installed desktop app for the on-disk file + auto-backups.
Can't find the data file on disk β it's inside the app-identifier folder, not directly under AppData\Local. Copy the exact path from the Local storage panel. On locked-down or Citrix/enterprise machines the real location can also be redirected β the path in the panel (resolved by the app itself) is authoritative.
Forgot the passphrase β use the Recovery Key at the unlock screen ("Use Recovery Key instead"). No Recovery Key and no passphrase means the encrypted data is unrecoverable by design; restore from an unencrypted backup or the cloud if you have one.
Reporting a real bug β note the app version (top-left header) and exactly what you did. If you can, open the plain HTML file in a desktop browser and check the developer console (F12) for red error text β that, plus the steps to reproduce, is what a maintainer needs. See the maintainer section below for where the code lives.
For whoever maintains this next (developer handoff)
What it is. The entire app β UI, logic, and data model β is one self-contained HTML file. There is no framework and no build step for the app itself. You can open the .html directly in any modern browser and the whole thing runs, except the on-disk file storage (which only activates inside the desktop wrapper). That means you can develop and debug the UI in a browser with devtools, then ship.
Desktop packaging. The installable Windows app is that HTML wrapped in a Tauri 2 shell. In the source repository the HTML lives at src/index.html; the wrapper config is in src-tauri/ (a tauri.conf.json, a Rust entry point, a Cargo.toml, and capability files).
Building a new version. Edit src/index.html (paste the new version over it), commit and push. A GitHub Actions workflow ("Build Windows installer") runs on a Windows runner and produces an NSIS.exe installer, downloadable from that run's Artifacts. Install over the old one β data in the AppData folder survives reinstalls. The in-app version badge is set in the HTML header.
Local storage uses the tauri-plugin-fs plugin, scoped by a capability file to the app's own AppData\Local folder β nothing else on disk is reachable. It's feature-detected: no plugin present (e.g. plain browser) = it simply doesn't write a file, and nothing else changes.
Encryption uses the browser/WebView's built-in Web Crypto (AES-GCM + PBKDF2) β no external libraries. It's opt-in: a passphrase-derived key wraps a random data key, and a separate Recovery Key wraps the same data key, so a lost passphrase is recoverable but a lost-both is not.
Cloud sync is optional and uses one private GitHub gist on a dedicated throwaway account, holding one journal file per person. Access is via a runtime "Team code" that is never baked into the repo or the installer, so no credentials ship in the distributable. Rotating the token just means handing out a new Team code β nobody rebuilds.
Design constraints to preserve: no servers, no third-party data services, no telemetry, one portable file, and a minimal toolchain (Tauri + GitHub Actions only). Keep client-identifying data out of anything synced.
Operational specifics β the exact repository URL, the gist account, the current Team code, and the admin token β are intentionally kept in the maintainer's private handoff notes, not in this shipped file, so credentials never travel with the app. Whoever takes this over should be handed those separately.
Sync conflict
Your journal was changed somewhere else (another window or device) since this one last synced. Here's which copy is newer:
There's no automatic merge, so one replaces the other: Push β send this window up, replacing the cloud copy. Pull β download the other version, replacing this window.