#personalproject
pocket assistant
This website is a progressive web app. This means it runs a service worker in the browser that runs the app offline and locally. All data is stored locally. When you want to shre, you can create a temporary list or note that is then transferred to the cloud. The link and data is deleted after 24 hours.
I am using golang with sqlite on the backend with html, css, and javascript on the frontend. Deployed with docker on a five dollar vps.
This is a "vanilla" project, with the least amount of dependencies as possible. I chose thie because I want to learn the fundamentals of every "tool" in the stack, to be as lightweight as possible and to avoid package driven development.
The idea is to have a self hosted private personal data app for my daily needs.
I know there are probably options for selfhosted apps for these things, but I am using this as a learning experience and because its fun.
Pockist Cloud coming soon?
docker build -t pockist:latest . docker save pockist:latest | gzip > pockist.tar.gz scp pockist.tar.gz user@server:/opt/pockist/
ssh user@server "cd /opt/pockist && docker load < pockist.tar.gz && docker stop pockist && docker rm pockist && docker run -d --name pockist -p 8080:8080 pockist:latest" Note: The scripts assume you have SSH access to your server and Docker is installed there. Update SERVER_HOST, SERVER_USER, and other variables as needed.
docker build -t pockist:latest . && docker save pockist:latest | gzip > pockist.tar.gz && scp pockist.tar.gz user@server:/opt/pockist/
cd /opt/pockist && docker stop pockist && docker rm pockist && docker load < pockist.tar.gz && docker run -d --name pockist -p 8081:8081 pockist:latest
d3.min.js
plot.min.js
or
<script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
<script src="https://cdn.jsdelivr.net/npm/@observablehq/plot@0.6"></script>- everything 30 seconds on client
- weather api 20 min on server
- geolocation like 7 days?
Pockist now supports sharing notes and lists via temporary, self-destructing links.
The share feature allows users to create temporary shareable links for individual notes, todo lists, or full backups. These links are active for 24 hours and are automatically deleted from the server after expiration.
- Temporary Shares: All shared content expires after 24 hours
- Self-Deletion: Only the creator can delete a share before it expires
- Import/Download: Recipients can import shared content directly into their local IndexedDB or download as a JSON file
- Rate Limiting: 5 shares per hour per IP address
- Security: HTML sanitization removes all script tags and potentially harmful content
- Creating a Share: User clicks the "Share" button on a note or list
- Deletion Token: When a share is created, a unique deletion token is stored in the creator's browser (IndexedDB)
- Sharing: Creator copies the share URL and sends it to recipients
- Viewing: Recipients open the URL to view the shared content
- Import: Recipients can import the content into their local database
- Deletion: Creator can delete the share at any time using their deletion token
| Endpoint | Method | Description |
|---|---|---|
/api/share |
POST | Create a new share |
/api/share/{id} |
GET | Retrieve shared content |
/api/share/{id} |
DELETE | Delete a share (requires deletion token) |
- Storage: SQLite database with automatic cleanup of expired shares
- Size Limit: Maximum 500KB per share
- Background Cleanup: Expired shares are removed every 10 minutes
- Creator Identification: Determined by presence of deletion token in IndexedDB (no account required)
To persist shared data across container restarts, mount a volume:
volumes:
pockist-data:
services:
app:
volumes:
- pockist-data:/app/dataThe SQLite database is stored at /app/data/pockist.db.
Pockist supports importing and exporting data for backup and migration purposes.
- Full Backup: Export all notes and lists as a single JSON file
- Individual Export: Export specific notes or lists
- Import: Import data from JSON files (merges with existing data)
- Duplicate Detection: Tracks imported files to prevent accidental re-imports
- Version Tracking: Export format versioning for future compatibility
{
"version": "1.0",
"type": "pockist-backup",
"scope": "full|note|list",
"exportId": "uuid-timestamp",
"exportedAt": "2026-04-28T10:30:00Z",
"appVersion": "1.0.0",
"data": {
"notes": [...],
"lists": [...]
}
}Access import/export via the hamburger menu ( drawer ):
- Export All: Creates a timestamped backup file
- Import Data: Select a JSON file to import (merges with existing data)
When importing:
- Conflicts: Items with duplicate IDs are renamed with "(Imported)" suffix
- No Overwrites: Existing data is never deleted or replaced
- Safe Import: All imports are non-destructive