Skip to content

tompatulpan/Contact-Manager

Repository files navigation

Contact Management System

Status: 🚧 In development!
This project is not production-ready. Features, structure, and documentation are subject to rapid change.

Background

I started this project because I was frustrated with how messy and inaccurate my contact lists had become. I couldn’t find a simple, secure way to share MY OWN contact info and keep it up to date. So I built a tool that makes exchanging these details safe, automatic, and effortless.

Overview

  • Your contacts are broken 🀯
  • You have 200 contacts. When you change your number, 200 people then might have the wrong one.
  • What if YOUR contact card updated itself in everyone's phone?
  • That's what we built ✨
  • Never text the wrong number again.
  • Try β†’ it here

A secure, modular contact management system with:

  • End-to-end encrypted storage on Userbase
  • Real-time sharing and sync
  • Using RFC9553 for storage
  • Distribution lists for group sharing
  • Cross-device support (web application)

Key Features

  • Create, edit, and organize contacts
  • Share contacts with users or groups (distribution lists)
  • Archive, delete, and manage received/shared contacts
  • Import/export contacts (vCard 3.0 and 4.0)
  • QR code generation - Scan to easely import contacts
  • Real-time updates and cross-device sync
  • πŸ†• Baical CardDAV Integration - Sync with any CardDAV server

Project Structure

src/                # Core business logic and UI components
lib/                # Third-party SDKs (e.g., userbase.js)
index.html          # Main entry point
style.css           # Styles
mobile.css

Development

  • Contributions and feedback are welcome!

Setup

# Install development dependencies (testing framework, dev server)
npm install

# Start development server with live reload
npm run serve

# πŸ†• Baical CardDAV integration setup
cd ../contact-carddav-bridge && npm start  # Start bridge server (port 3001)
npm run serve                               # Start contact manager (port 8080)

Cache Busting

# For development (after CSS/JS changes)
./dev-cache-bust.sh

# For production deployment  
./production_zip.sh

# Restore original files
./restore-dev.sh

Roadmap

  • QR code generation (for easy contact sharing with iOS/Android compatibility)
  • Share your profile
  • Revoke sharing per recipient (Individual Databases)
  • Improve phone menu UI
  • Add some missing export functionality
  • Improved import duplicate and merge functionality
  • Sharing-lists (for better control and bulk sharing)
  • Baical CardDAV Integration (sync with any CardDAV server)
  • Group list features (Rename, edit, copy, etc)
  • Create e-mail distrubution list
  • Bulk operations (Delete)
  • Multi-language support (i18n)
  • Advanced sharing permissions (cross edit contacts)
  • Stay logged in feature
  • Change password
  • Set passwords rules
  • Dark mode
  • Pictures as avatars
  • Complete disaster recovery system via vCards

Ideas

  • A Progressive Web App (PWA)
  • An Electron or Tauri App
  • [(x)] Better integration on phones, CardDAV support
  • Improve decentralization using userbase
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚          Shared Userbase Application               β”‚
β”‚              AppID: "contact-manager"              β”‚
β”‚                                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚  Instance A  β”‚            β”‚  Instance B  β”‚      β”‚
β”‚  β”‚  domain-a.comβ”‚            β”‚  domain-b.comβ”‚      β”‚
β”‚  β”‚              β”‚            β”‚              β”‚      β”‚
β”‚  β”‚ User: alice  │◄──────────►│ User: bob    β”‚      β”‚
β”‚  β”‚ Contacts DB  β”‚   Native   β”‚ Contacts DB  β”‚      β”‚
β”‚  β”‚              β”‚  Userbase  β”‚              β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  Sharing   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚                                                    β”‚
β”‚     Same AppID = Native Sharing Works!             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Instance A        β”‚         β”‚   Instance B        β”‚
β”‚   (Userbase App 1)  β”‚         β”‚   (Userbase App 2)  β”‚
β”‚                     β”‚         β”‚                     β”‚
β”‚  User: alice@A      β”‚         β”‚  User: bob@B        β”‚
β”‚  Contact DB         β”‚         β”‚  Contact DB         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚                               β”‚
           β”‚     Encrypted Export          β”‚
           └───────────┐     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β–Ό     β–Ό
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚  Bridge Service  β”‚
                β”‚  (Server)        β”‚
                β”‚                  β”‚
                β”‚  β€’ User mapping  β”‚
                β”‚  β€’ Data relay    β”‚
                β”‚  β€’ Permissions   β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Browser A         β”‚         β”‚   Browser B         β”‚
β”‚   (Alice)           │◄───────►│   (Bob)             β”‚
β”‚                     β”‚ WebRTC  β”‚                     β”‚
β”‚  Userbase: app-a    β”‚  P2P    β”‚  Userbase: app-b    β”‚
β”‚                     β”‚ Channel β”‚                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚                               β”‚
           └───────────┐     β”β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β–Ό     β–Ό
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚  Signaling       β”‚
                β”‚  Server          β”‚
                β”‚  (WebSocket)     β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Instance A        β”‚         β”‚   Instance B        β”‚
β”‚   AppID: "app-a"    β”‚         β”‚   AppID: "app-b"    β”‚
β”‚   domain-a.com      │◄───────►│   domain-b.com      β”‚
β”‚                     β”‚WebFingerβ”‚                     β”‚
β”‚  alice@domain-a.com β”‚  +      β”‚  bob@domain-b.com   β”‚
β”‚                     β”‚ Signed  β”‚                     β”‚
β”‚                     β”‚ vCards  β”‚                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


Sync Flow Details with Baical

Push (Contact Manager β†’ BaΓ―cal)

  • User updates contact in web app
  • Bridge uploads vCard via CardDAV PUT
  • BaΓ―cal stores and serves to other devices

Pull (BaΓ―cal β†’ Contact Manager)

  • Other devices update contact via CardDAV
  • Bridge polls BaΓ―cal for changes (PROPFIND)
  • Contact Manager updates local storage
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            User's Contact Manager Account               β”‚
β”‚                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚ Userbase Storage  β”‚        β”‚  User's Bridge   β”‚      β”‚
β”‚  β”‚  (E2E Encrypted)  │◄──────►│   Component      β”‚      β”‚
β”‚  β”‚                   β”‚        β”‚  (Per-User)      β”‚      β”‚
β”‚  β”‚ - My Contacts     β”‚        β”‚                  β”‚      β”‚
β”‚  β”‚ - Shared Contacts β”‚        β”‚  User Config:    β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚  β€’ BaΓ―cal URL    β”‚      β”‚
β”‚                               β”‚  β€’ Username      β”‚      β”‚
β”‚                               β”‚  β€’ Password      β”‚      β”‚
β”‚                               β”‚  β€’ Sync Settings β”‚      β”‚
β”‚                               β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                         β”‚
                                         β”‚ CardDAV Protocol
                                         β”‚ (Bidirectional Sync)
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚  BaΓ―cal Server       β”‚
                              β”‚  (CardDAV Endpoint)  β”‚
                              β”‚                      β”‚
                              β”‚  /dav.php/           β”‚
                              β”‚  addressbooks/       β”‚
                              β”‚  username/contacts/  β”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Client Apps   β”‚    β”‚ Contact Manager β”‚    β”‚ Userbase.com    β”‚
β”‚ (iOS, Android,  │◄──►│                 │◄──►│   (E2E Encryptedβ”‚
β”‚  Thunderbird)   β”‚    β”‚                 β”‚    β”‚    Storage)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                       β”‚
         β”‚                       β”‚
         └───────────────────────▼
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚         BaΓ―cal Server               β”‚
         β”‚    (CardDAV/CalDAV Server)          β”‚
         β”‚                                     β”‚
         β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
         β”‚  β”‚    Bridge Component         β”‚    β”‚
         β”‚  β”‚  (Sync Userbase ↔ BaΓ―cal)   β”‚    β”‚
         β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜



β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    Contact Manager          β”‚ ← Real-time sharing, E2E encryption
β”‚ (Userbase.com storage)      β”‚ ← Advanced features: distribution lists, 
β”‚                             β”‚   individual sharing, revocation
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              β”‚ Bridge Component
              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚       BaΓ―cal Server         β”‚ ← Standard CardDAV server
β”‚    (CardDAV endpoint)       β”‚ ← Compatible with ALL devices
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              β”‚ Standard CardDAV Protocol
              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     Native Device Apps      β”‚
β”‚ β€’ iPhone Contacts           β”‚
β”‚ β€’ Android Contacts          β”‚
β”‚ β€’ Thunderbird Address Book  β”‚
β”‚ β€’ macOS Contacts            β”‚
β”‚ β€’ Any CardDAV client        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”— Baical CardDAV Integration

The contact manager now supports synchronization with any CardDAV server (Baical, Nextcloud, etc.). This enables:

  • Universal Device Sync: Access contacts on iPhone, Android, Thunderbird, etc.
  • Standard Protocol: Uses industry-standard CardDAV for maximum compatibility
  • Bidirectional Sync: Changes sync both ways between contact manager and CardDAV server
  • Self-Service Setup: No admin required - users configure their own connections

Quick Start

# Start CardDAV bridge server (separate project)
cd ../contact-carddav-bridge && npm start  # Port 3001

# Start contact manager
npm run serve  # Port 8080

# Open http://localhost:8080, click "Baical" button

See BAICAL_INTEGRATION.md for complete setup and configuration guide.

Acknowledgements

This project has been developed with assistance from GitHub Copilot.

Releases

No releases published

Packages

 
 
 

Contributors