A fast, fully client-side Progressive Web App (PWA) for modern notaries. It features offline support, highly secure local encryption, ID scanning, signature capture, and print-ready NNA-compliant journal PDFs.
Because this app is purely frontend (with no backend server), it can be hosted anywhere for free.
Warning
STRICT NON-COMMERCIAL LICENSE This repository is governed by a Custom Non-Commercial License. It is 100% free to deploy for personal use, but it may NOT be sold, monetized, or used for commercial SaaS purposes under any circumstances. Violations are subject to strict legal penalties including $50,000 in liquidated damages per the license terms. See the LICENSE file for full details before deploying.
If you've cloned this repository and want to host your own instance of the Notary Journal PWA for $0/month, the easiest beginner path is Zo Computer. Netlify, Cloudflare Pages, and Hostinger are also supported if you prefer a traditional static host.
Note
Backups: The app stores journal data locally in your browser. Zo can host the app and store exported backup files in your Zo workspace, but it cannot automatically read browser-only IndexedDB data unless you export or back up from inside the app first. Direct in-app Google Drive backup still requires a Google OAuth Client ID.
Zo Computer gives you a personal cloud computer with hosting and cloud storage. The free plan includes 100GB storage and one hosted service.
After deployment, Zo MUST output:
- Public App URL:
https://notary-log-{your-handle}.zocomputer.io - Backup API URL:
https://notary-log-{your-handle}.zocomputer.io/api/backup - Backup Key: Generated secret token
- Backup Storage:
Documents/Notary Journal/backups/
Without these outputs, Backup & Restore won't work.
Copy/paste this exact prompt into Zo or any deployment AI:
Deploy https://github.com/SillyHippy/Notary-log on Zo Computer as ONE public HTTP service named notary-log.
Hard rules:
- Use one name everywhere: notary-log.
- Create exactly ONE service named notary-log.
- Do not create a second service.
- Do not create a service named notary-journal.
- Do not create a Zo Space API route.
- Do not clone into Trash.
- Do not duplicate the repo folder.
- Do not replace the app's storage with /home/workspace/notary-data.json.
- The app and backup API must run together from the same service.
Commands to run from /home/workspace:
if [ -d notary-log ]; then
cd notary-log
git pull
else
git clone https://github.com/SillyHippy/Notary-log notary-log
cd notary-log
fi
bun install
bun run build
If a service named notary-log already exists, update/restart that exact service.
If no service named notary-log exists, create it:
zo service create --mode http --port 3000 --public true --entrypoint "bun run prod" --label notary-log
After deployment, stop and output only:
1. Public App URL
2. Backup API URL, which must be the Public App URL plus /api/backup
3. Backup Key printed by bun run prod
4. Backup Storage: Documents/Notary Journal/backups/
Before reporting success, test the one service:
curl -I [Public App URL]
curl -H "Authorization: Bearer [Backup Key]" [Public App URL]/api/backup
To enable the "Auto-Backup to Google Drive" feature in your self-hosted version, you need to create a free Google Cloud project to get a Client ID.
- Go to the Google Cloud Console.
- Create a new project (e.g.,
notary-journal-app). - Enable the Drive API: Go to APIs & Services > Library, search for Google Drive API, and click Enable.
- Go to APIs & Services > Credentials.
- Click Create Credentials -> OAuth client ID.
- Choose Web application as the application type.
- Under Authorized JavaScript origins, add the URL where you will host the app (e.g.,
https://your-app.netlify.apporhttps://your-app.pages.dev). Note: You may need to come back and add this after you deploy. - Copy your Client ID (it looks like
123456789-abcxyz.apps.googleusercontent.com).
You will need to paste this as an Environment Variable (VITE_GOOGLE_CLIENT_ID) when setting up your hosting in the next steps.
Netlify is incredibly easy to use and automatically builds your app every time you push changes to GitHub.
- Create an account: Go to Netlify.com and sign up using your GitHub account.
- Add new site: In your dashboard, click "Add new site" -> "Import an existing project".
- Connect GitHub: Authorize GitHub and select your repository.
- Configure Build Settings (Crucial Step):
Because the app is located in a subfolder, fill out the build settings exactly like this:
- Base directory:
artifacts/notary-journal - Build command:
pnpm run build(ornpm run build) - Publish directory:
artifacts/notary-journal/dist/public
- Base directory:
- Add Environment Variables:
- Click Add environment variables.
- Key:
NODE_VERSION| Value:22 - Key:
VITE_GOOGLE_CLIENT_ID| Value: [paste the Client ID from the optional Google setup section]
- Deploy: Click "Deploy site". Netlify will take a minute or two to build the app.
- Custom Domains & SSL: Netlify will give you a free
.netlify.appURL. If you want to use your own domain, go to Domain Management, add your custom domain, and follow their DNS instructions. Netlify provides free automatic SSL certificates.
Cloudflare Pages is also completely free and leverages Cloudflare's massive global CDN network, making your app load blazingly fast anywhere in the world.
- Create an account: Go to Cloudflare.com and sign up.
- Navigate to Pages: On the left sidebar, click "Workers & Pages", then click the "Pages" tab.
- Connect GitHub: Click "Connect to Git", authorize your GitHub account, and select your repository.
- Configure Build Settings:
Set it up exactly like this to handle the workspace structure:
- Framework preset:
None - Build command:
pnpm --filter @workspace/notary-journal... run build - Build output directory:
artifacts/notary-journal/dist/public - Root directory: (leave blank)
- Framework preset:
- Add Environment Variables:
- Scroll down to Variables and secrets and click Add.
- Name:
NODE_VERSION| Value:22 - Name:
VITE_GOOGLE_CLIENT_ID| Value: [paste the Client ID from the optional Google setup section]
- Deploy: Click "Save and Deploy".
- Custom Domains: Cloudflare provides a free
.pages.devURL. If you want a custom domain, go to the Custom Domains tab on your Pages project. Since you are already in Cloudflare, managing the DNS is seamless and SSL is automatically applied.
If you are using Hostinger, cPanel, or another standard shared hosting provider (which typically use Apache or LiteSpeed servers), you can easily host this PWA.
- Build locally: You will need to build the app on your own computer first.
export VITE_GOOGLE_CLIENT_ID="[paste the Client ID you got from Step 1]" pnpm --filter @workspace/notary-journal run build
- Add an
.htaccessfile: Inside the newly builtartifacts/notary-journal/dist/publicfolder, create a file named.htaccesswith these contents to handle SPA routing:<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>
- Upload & Extract: Zip up the contents of the
dist/publicfolder (including the new.htaccessfile). Log into your Hostinger File Manager (or connect via FTP), upload the zip to yourpublic_htmldirectory, and extract the files directly there.
(For more advanced deployment details and cache troubleshooting, see the DEPLOYMENT.md file included in this repository).
If your app deploys successfully on either platform but shows a completely blank white screen, it means the hosting provider is serving the wrong folder. Ensure your Publish/Output directory was set exactly to dist/public and not just dist.