2025-03-27 09:22:53 +00:00
2025-03-23 19:57:06 +00:00
2025-03-23 19:57:06 +00:00
2025-03-23 19:57:06 +00:00
2025-03-27 09:22:53 +00:00
2025-03-27 08:59:51 +00:00
2025-03-23 19:57:06 +00:00

Product Overview

The solution "pow.do" is a privacy-focused, decentralized proof-of-work time tracking system built around Electron (client side), Blossom storage, Nostr protocol (events & relays), and a local Kimai instance for persisting time-tracking data.

High-level Architecture

The overall solution is made up of:

  • Local Client (actual time tracker, an electron desktop app)
    • captures ActivityWatch data & screenshots
    • creates encrypted ZIP file and uploads to Blossom
    • creates signed Nostr Event linking to the ZIP file on Blossom
    • gift-wraps this event (NIP-17) and publishes it to a Nostr relay
  • Public Server (with Blossom file storage and Nostr event relay)
    • Blossom files regularly discarded
    • Relay whitelisted to end user npubs
  • Private Server (with Data Vending Machine, Kimai time tracking instance and a DB)
    • DVM monitors relay, picks up Nostr Event
    • DVM fetches ZIP file from Blossom
    • DVM sends collected Activity Watch data into a local DB
    • DVM updates Kimai instance with time tracking data

Architecture Diagram

The architecture looks like this:

Component Design

1. Electron App (Client side)

  • Framework: ElectronJS, Chromium frontend.
  • Responsibilities:
    • Periodically capture user screenshots.
    • Query the local ActivityWatch API to collect usage data on a regular interval.
    • Bundle screenshots & ActivityWatch data as encrypted zip files and upload to Blossom server.
    • Use Blossom API to persist data securely.
    • Create signed Nostr Events referencing the stored Blossom files.
    • Gift-wrap (encrypt/secure via NIP-17) the Nostr event for enhanced privacy/security.
    • Publish the gift-wrapped event to a Nostr relay.
  • Required Libraries/Tools:
    • Electron framework (UI & client app)
    • Node.js scripting
    • ActivityWatch API Client (REST API calls)
    • Blossom API Client (REST API - file upload handling)
    • Nostr protocol JS client (e.g., nostr-tools library)
    • ZIP/compression libraries (adm-zip, archiver)
    • nostr-tools (JavaScript) or equivalent
    • encryption/decryption utility supporting NIP-17

2. Blossom File Storage Service

  • Description: Decentralized hash-based file storage to securely store ZIP archives of screenshots & ActivityWatch data.
  • Data Flow: Electron app → encrypted zip → Blossom Server (via REST API)
  • Security & Privacy: Files are hash-identified, no direct user-identification metadata exposed. Content is encrypted.

3. Nostr Relay

  • Description: Decentralized event publishing via signed JSON messages (Nostr event).
  • Nostr Usage:
    • Publishing: Electron client creates Nostr events, signs them, and publishes to relay servers.
    • Gift-wrapping (NIP-17): Electron client encrypts events using NIP-17 before publishing, ensuring that only the DVM can decrypt and access the Blossom file URLs.

4. Data Vending Machine (DVM)

  • Description: The DVM is a separate backend (or daemon) that:

    • Subscribes to the chosen Nostr relay.
    • Receives and decrypts the gift-wrapped Nostr events (using NIP-17 technique).
    • Fetches the referenced ZIP file from Blossom (via Blossom API).
    • Unzips & extracts data (screenshots/activity logs).
    • Parses extracted activitywatch / screenshot data and sends it to the DB
    • Tracks ongoing time usage and updates the dedicated Kimai API endpoints.
  • Client-to-DVM Data Flow:

    Electron Client 
      → Nostr event signed & gift-wrapped event with Blossom file URL
      → Sent to relay
      → DVM subscribes to Nostr relay feed, receives gift-wrapped event
    
  • Data Flow in DVM:

    Nostr Relay → DVM (relay subscription)
      → Event Decryption (NIP-17)
      → Blossom download (via hash)
      → Data Parsing (python/node — depending on language preference)
      → Kimai API call (add/update time-entry, activity, and time data)
    
  • Libraries & dependencies: -Python or Node.js client for Nostr events (nostr-tools in Node)

    • HTTP client for Blossom API (authenticated/file download)
    • HTTP client for Kimai API updates/addition of entries (requests or axios)
    • ZIP utilities for unzipping (e.g., Node.js's adm-zip or unzip)

5. Kimai (Local Instance)

  • Description: Open-source time tracking tool storing final extracted data.
  • Deployed Local/Privately: As per your requirements—keeping all time-tracked data internal/private.
  • Data Flow:
    DVM → Kimai API (insert/update entries)
    
  • Setup Considerations:
    • Host Kimai locally in a container with no public IP access.
    • DVM accesses Kimai API endpoints directly.

Security & Privacy Considerations

  • Event Encrypting & Security: Utilizing NIP-17 ensures additional confidentiality.
  • File hashing/storage (Blossom): Secure with cryptographic hashing, eliminating data manipulation risks.
  • Privacy: Nostr Relay protects both Server and Client IPs
  • Decentralization: Leveraging open protocols (Nostr), distributed storage systems (Blossom).
  • Traceability: The data trail remains verifiable and secured (signed events, cryptographic proof via Blossom hashes, encrypted via NIP-17).
  • Flexibility: Easy to scale or swap out components later if required (Blossom → alternative storage, Kimai → other time-tracking tools).

High-level Sequence Diagram (text-based)

Electron App:
  ├─ Capture Screenshots & ActivityWatch data
  └─ Upload ecnrypted ZIP to Blossom server (API)

Electron App:
  ├─ Create JSON Nostr Event (signed via keypair)
  ├─ Gift-wrap (NIP-17 encryption)
  └─ Publish event to Nostr relay

DVM (Backend):
  ├─ Listen to Relay for events
  ├─ Decrypt Nostr Event via NIP-17 (Gift-wrap)
  ├─ Use content from event to download ZIP from Blossom
  ├─ Extract ZIP and parse data
  └─ Upload parsed data to DB
  └─ Add time entries to Kimai via REST/API

Mermaid flow:

Description
No description provided
Readme 837 KiB
Languages
Markdown 100%