A modern, decentralized todo application built on the Nostr protocol with advanced cloud storage capabilities. Manage your tasks with complete data ownership and privacy, featuring seamless synchronization across devices through decentralized storage providers.
- Nostr Extension Support: Compatible with browser extensions like nos2x and Alby
- Private Key Login: Direct private key authentication for advanced users
- URL Hash Login: Quick access via URL fragment for testing and development
- DID Document Discovery: Automatically discovers custom storage endpoints from nostr.social
- TypeRegistrations: Supports Solid-style TypeRegistrations for multiple todo lists
- Smart Fallbacks: Gracefully degrades from custom storage β nosdav.net β localStorage
- Multiple Storage Locations: Support for multiple todo lists with different storage providers
- Priority System: Mark tasks as high priority with visual indicators
- Task Completion: Toggle task completion with persistent state
- Dynamic List Titles: Editable list titles with auto-save functionality
- JSON-LD Schema: Semantic task structure with
@type: 'Task'and tracker metadata
- ICS Export: Generate calendar files for import into any calendar application
- Due Date Support: Convert todos to calendar events with proper scheduling
- VEVENT Format: Standards-compliant calendar export
- Mindstr Integration: Links to external mind mapping application
- Visual Task Management: Convert linear todo lists to visual mind maps
- Dynamic URL Generation: Automatic relay and task information passing
- Download or clone this repository
- Open
index.htmlin any modern web browser - Login with your Nostr extension or private key
- Start managing your decentralized todos!
Visit the live demo: Todo App Demo
Access with specific storage URI:
todo.html?uri=https://your-storage-provider.com/path/to/todos.json
- Frontend Framework: Vanilla JavaScript with Preact components
- UI Library: Preact 10.13.1 with HTM for JSX-like syntax
- Styling: TailwindCSS with custom CSS variables
- Storage Protocol: Nosdav (Nostr-based WebDAV)
- Authentication: Nostr protocol with secp256k1 cryptography
- Calendar Export: Custom ICS generation
- Dependencies: All loaded from CDN (no build process required)
DID Discovery β TypeRegistrations β Custom Storage β nosdav.net β localStorage
- DID Document Fetching: Queries nostr.social for custom storage endpoints
- TypeRegistration Discovery: Finds registered todo lists via publicTypeIndex.json
- Smart URL Building: Constructs storage URLs with proper authentication
- Graceful Fallbacks: Multiple fallback levels ensure data availability
URL Hash β Nostr Extension β Private Key Input β Storage Access
index.js: Main TodoApp component with state managementnavbar.js: Authentication and navigation componentstorage-config.js: Centralized storage configuration with DID discoverynosdav-shim.js: Fetch interceptor for Nostr authentication headers
todo/
βββ index.html # Main entry point with styling
βββ index.js # Core application logic (1275 lines)
βββ navbar.js # Navigation and authentication (447 lines)
βββ storage-config.js # Storage discovery and URL building (128 lines)
βββ nosdav-shim.js # Fetch interceptor for Nostr auth (71 lines)
βββ package.json # Package configuration
βββ CLAUDE.md # Development documentation
βββ LICENSE # MIT License
βββ README.md # This file
The recommended method for regular users:
- Install a Nostr extension (nos2x, Alby, etc.)
- Click "Sign in with Nostr extension"
- Grant permission for the app to access your identity
For advanced users who manage their own keys:
- Enter your 64-character hex private key
- Key is stored locally and used for authentication
- Warning: Only use on trusted devices
Quick access for development and testing:
todo.html#your-64-character-private-key-here
The hash is automatically removed from the URL for privacy.
The app automatically discovers your custom storage provider:
- Fetches your DID document from
nostr.social/.well-known/did/nostr/{pubkey}.json - Looks for
Storageservice type in the service array - Uses the
serviceEndpointas your storage root - Falls back to
nosdav.netif no custom storage is found
Support for multiple todo lists via TypeRegistrations:
- Create
publicTypeIndex.jsonin your storage root - Register Tracker instances with different storage locations
- App automatically discovers and provides dropdown selection
- Each list can use different storage providers
Example TypeRegistration:
[
{
"type": "TypeRegistration",
"forClass": "Tracker",
"instance": "../work/todos.json"
}
]{
"@context": {
"Task": "https://schema.org/Task",
"name": "https://schema.org/name",
"completed": "https://schema.org/completed"
},
"@type": "Task",
"@id": "#task-1",
"name": "Complete project documentation",
"completed": false,
"priority": true,
"created": "2025-01-27T10:30:00Z"
}{
"@context": {
"Tracker": "https://schema.org/ItemList",
"name": "https://schema.org/name"
},
"@type": "Tracker",
"@id": "#this",
"name": "My Todo List"
}- Open
index.htmldirectly in browser - All dependencies loaded from CDN
- Changes are immediately visible on refresh
Check browser console for detailed logs:
- DID document fetching
- TypeRegistration discovery
- Storage provider selection
- Save/load operations
Follow the existing patterns:
- Use Preact with HTM for components
- Add state to the main TodoApp component
- Include proper error handling and fallbacks
- Update Tracker metadata when appropriate
Export your todos to any calendar application:
- Click the "Export to Calendar" button
- Save the generated
.icsfile - Import into your preferred calendar app
- Todos appear as events with proper dates
The export includes:
- Task names as event titles
- Creation dates as event dates
- Priority tasks marked with special formatting
- All-day events for flexible scheduling
Convert your linear todo list to a visual mind map:
- Click the "Open in Mind Map" link
- Launches external Mindstr application
- Automatically passes task and relay information
- Provides visual task organization and relationships
- Error saving: Check your Nostr extension connection
- Data not syncing: Verify your storage provider is accessible
- Multiple lists not appearing: Check your
publicTypeIndex.jsonformat
- Extension not detected: Install a compatible Nostr extension
- Private key errors: Ensure key is exactly 64 hex characters
- Login fails: Clear browser cache and try again
- Slow loading: DID documents are cached for 5 days
- Storage timeouts: Falls back to localStorage automatically
- Memory usage: Large todo lists are handled efficiently
This project welcomes contributions! Areas for improvement:
- Additional storage provider integrations
- Enhanced UI/UX features
- Mobile responsiveness improvements
- Additional export formats
- Integration with other Nostr applications
MIT License - see LICENSE file for details.
Built with β€οΈ on the decentralized web using Nostr protocol