Demo with PocketBase
This guide demonstrates setting up a distributed note-taking application using HarmonyLite for SQLite replication and PocketBase as the backend, with preconfigured admin and schema.
Quick Start: For an automated setup, you can use the
run-pocketbase-demo.shscript in theexamplesdirectory:cd examples
./run-pocketbase-demo.shThis script automates all the steps below. See the examples README for more information.
Overview
In this demo, you'll:
- Set up a two-node HarmonyLite cluster for database replication
- Launch PocketBase instances preconfigured with an admin user and "notes" collection
- Test replication and fault tolerance in a distributed note-taking app
By the end, you'll see how HarmonyLite and PocketBase work together seamlessly.
Prerequisites
- HarmonyLite: Downloaded and available in your PATH
- PocketBase: Downloaded from PocketBase.io
- A terminal and basic command-line skills
- About 10-15 minutes
Step 1: Set Up Directory Structure
Create the demo directory and subdirectories:
mkdir -p harmonylite-demo/{pb-1,pb-2,user_pb_migrations}
cd harmonylite-demo
Step 2: Preconfigure PocketBase
We'll initialize PocketBase with a default admin user and "notes" collection using a migration script.
- 
Create Admin User for Node 1: ./pocketbase superuser create admin@example.com 1234567890 --dir=./pb-1
- 
Define "notes" Collection: Create a migration file in user_pb_migrations(name itinit_notes.js):migrate((app) => {
 // Create a new "notes" base collection
 const collection = new Collection({
 name: "notes",
 type: "base",
 listRule: "",
 viewRule: "",
 createRule: "",
 updateRule: "",
 deleteRule: "",
 fields: [
 { name: "title", type: "text", required: true },
 { name: "content", type: "text" },
 { name: "is_important", type: "bool" }
 ]
 });
 
 return app.save(collection);
 }, (app) => {
 // Down migration code (for reverting the changes)
 const collection = app.findCollectionByNameOrId("notes");
 return app.delete(collection);
 });
- 
Apply Migrations: ./pocketbase migrate --dir=./pb-1 --migrationsDir ./user_pb_migrations
- 
Clone Configuration to Node 2: cp -r pb-1 pb-2
Step 3: Start PocketBase Instances
Launch both PocketBase instances with the preconfigured setup:
Terminal 1 - PocketBase 1:
./pocketbase serve --dir=./pb-1 --http=localhost:8090
Terminal 2 - PocketBase 2:
./pocketbase serve --dir=./pb-2 --http=localhost:8091
Access the admin dashboards:
- Node 1: http://localhost:8090/_/
- Node 2: http://localhost:8091/_/
- Login credentials for both: admin@example.com/1234567890
Step 4: Configure HarmonyLite
Create configuration files for two HarmonyLite nodes:
node-1-config.toml:
db_path = "./pb-1/data.db"
node_id = 1
seq_map_path = "./pb-1/seq-map.cbor"
[replication_log]
shards = 1
max_entries = 1024
replicas = 2
compress = true
[snapshot]
enabled = true
interval = 3600000
store = "nats"
node-2-config.toml:
db_path = "./pb-2/data.db"
node_id = 2
seq_map_path = "./pb-2/seq-map.cbor"
[replication_log]
shards = 1
max_entries = 1024
replicas = 2
compress = true
[snapshot]
enabled = true
interval = 3600000
store = "nats"
Step 5: Start HarmonyLite Nodes
Run each node in a separate terminal:
Terminal 3 - Node 1:
harmonylite -config node-1-config.toml -cluster-addr localhost:4221 -cluster-peers 'nats://localhost:4222/'
Terminal 4 - Node 2:
harmonylite -config node-2-config.toml -cluster-addr localhost:4222 -cluster-peers 'nats://localhost:4221/'
You should see connectivity messages in the logs indicating successful cluster formation.
Step 6: Test Replication
Verify data syncs between nodes:
- 
Add a Note in Node 1: - Open http://localhost:8090/_/ and navigate to the "notes" collection
- Click New record and enter:
- Title: "Test Note"
- Content: "This is a test"
- Is Important: Toggle as desired
 
- Save the record
 
- 
Check Node 2: - After a few seconds, visit http://localhost:8091/_/ and open the "notes" collection
- Confirm "Test Note" appears, demonstrating successful replication
 
- 
Test Bidirectional Sync: - In Node 2, create a new note (e.g., "Node 2 Note")
- Verify it appears in Node 1 after a brief sync period
 
Step 7: Test Fault Tolerance
Simulate a node failure:
- Stop Node 2 (Press Ctrl+C in Terminal 2)
- Add a new note in Node 1 (e.g., "Offline Test")
- Verify Node 1 continues to work normally
- Restart Node 2:
And in another terminal:./pocketbase serve --dir=./pb-2 --http=localhost:8091harmonylite -config node-2-config.toml -cluster-addr localhost:4222 -cluster-peers 'nats://localhost:4221/'
- Check http://localhost:8091/_/ > "notes" to confirm it catches up and syncs the new note
Real-World Applications
This architecture can be extended to build:
- Distributed Task Management Systems
- Content Management Systems with High Availability
- Inventory Systems with Offline Support
- Field Service Applications
- Edge Computing Dashboards
Conclusion
You've successfully built a preconfigured, distributed note-taking application with HarmonyLite and PocketBase, showcasing high availability and eventual consistency in a simple yet powerful setup.
Next Steps
- Explore advanced configuration options
- Learn about production deployment best practices
- Dive into the system architecture
Automated Demo Script
For those who prefer an automated setup, we provide a shell script that performs all the steps described in this guide:
cd examples
./run-pocketbase-demo.sh
The script supports several options:
- --help: Display usage information
- --keep-files: Don't delete temporary files on exit
- --pb-path PATH: Specify an existing PocketBase binary
- --no-download: Don't download PocketBase if not found
This makes it easy to quickly demonstrate HarmonyLite's capabilities with PocketBase without manual configuration.