{"id":49874829,"url":"https://github.com/alvinluo-tech/intimacy-tracker","last_synced_at":"2026-05-15T11:43:17.592Z","repository":{"id":352751156,"uuid":"1216424101","full_name":"alvinluo-tech/intimacy-tracker","owner":"alvinluo-tech","description":"Encounter — Map your shared journey. A secure digital sanctuary for couples to visualize their footprints, track shared patterns, and celebrate intimacy through data-driven storytelling.","archived":false,"fork":false,"pushed_at":"2026-05-05T18:58:40.000Z","size":1063,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-05T19:32:36.903Z","etag":null,"topics":["couple-app","data-visualization","intimacy-tracker","personal-growth","tailwind-css"],"latest_commit_sha":null,"homepage":"https://encounter.alvin-luo.me","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alvinluo-tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-20T22:25:04.000Z","updated_at":"2026-05-05T18:58:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alvinluo-tech/intimacy-tracker","commit_stats":null,"previous_names":["alvinluo-tech/intimacy-tracker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alvinluo-tech/intimacy-tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alvinluo-tech%2Fintimacy-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alvinluo-tech%2Fintimacy-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alvinluo-tech%2Fintimacy-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alvinluo-tech%2Fintimacy-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alvinluo-tech","download_url":"https://codeload.github.com/alvinluo-tech/intimacy-tracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alvinluo-tech%2Fintimacy-tracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33066124,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["couple-app","data-visualization","intimacy-tracker","personal-growth","tailwind-css"],"created_at":"2026-05-15T11:43:16.810Z","updated_at":"2026-05-15T11:43:17.586Z","avatar_url":"https://github.com/alvinluo-tech.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Encounter\n\n**Privacy-first intimacy tracker with a Linear-inspired aesthetic**\n\n[![Next.js](https://img.shields.io/badge/Next.js-16-black?logo=next.js)](https://nextjs.org/)\n[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)](https://react.dev/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5-blue?logo=typescript)](https://www.typescriptlang.org/)\n[![Supabase](https://img.shields.io/badge/Supabase-Database-3FCF8E?logo=supabase)](https://supabase.com/)\n[![Tailwind CSS](https://img.shields.io/badge/Tailwind-4-06B6D4?logo=tailwindcss)](https://tailwindcss.com/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA progressive web application for tracking intimate encounters with military-grade privacy controls, end-to-end encryption, and a sleek dark-mode-first UI.\n\n[Features](#features) · [Quick Start](#quick-start) · [Documentation](#documentation) · [Contributing](#contributing)\n\n\u003c/div\u003e\n\n---\n\n## Overview\n\nEncounter is a privacy-focused web application built for adults who want to maintain a personal log of intimate encounters. It combines a minimal, fast data entry flow with powerful analytics—all while keeping your data strictly private through encryption, PIN protection, and row-level security.\n\n**Key Principles:**\n- 🔒 **Privacy First**: All data encrypted at rest and in transit\n- ⚡ **Speed**: Log an entry in under 3 seconds on mobile\n- 📊 **Insightful Analytics**: Beautiful charts and heatmaps\n- 🌐 **Offline-Ready**: Full PWA support with offline capabilities\n\n## Features\n\n### Core Functionality\n- **Quick Log** — Single-screen mobile-first form with smart defaults\n- **Timeline** — Chronological card view with cursor-based pagination\n- **Dashboard** — Comprehensive analytics with 7+ chart types\n- **Map** — Mapbox-powered heatmap and point visualization\n- **Playback** — Animated journey replay on the map\n\n### Privacy \u0026 Security\n- **End-to-End Encryption** — AES-256-GCM for notes, HKDF key derivation\n- **PIN Lock** — 4-6 digit PIN with brute-force protection\n- **Row Level Security** — Database-level user isolation via Supabase RLS\n- **Audit Logging** — Track data access and exports\n\n### Data Management\n- **Partner Profiles** — Track with multiple partners, custom colors \u0026 avatars\n- **Tag System** — Categorize encounters with custom tags\n- **CSV Export** — Export all data with audit trail\n- **Photo Attachments** — Client-side compression before upload\n\n### Advanced Features\n- **Couple Sync** — Bind with your partner for shared visibility\n- **Location Modes** — Off / City-level / Exact coordinates\n- **Activity Heatmap** — GitHub-style yearly activity visualization\n- **Dark/Light Theme** — System-aware with manual toggle\n\n### Technical\n- **PWA** — Installable on mobile home screens\n- **i18n** — English and Chinese language support\n- **Mobile-First** — Responsive design with bottom tab navigation\n\n## Tech Stack\n\n| Layer | Technologies |\n|-------|-------------|\n| **Frontend** | Next.js 16 (App Router), React 19, TypeScript 5, Tailwind CSS 4 |\n| **UI Components** | shadcn/ui, Radix UI, Lucide Icons, Recharts, Motion |\n| **State Management** | Zustand 5 |\n| **Maps** | Mapbox GL 3, Turf.js |\n| **Backend** | Next.js Server Actions, Route Handlers |\n| **Database** | Supabase (PostgreSQL) with 37 migrations |\n| **Authentication** | Supabase Auth (email/password) |\n| **Email** | Resend |\n| **Rate Limiting** | Upstash Redis |\n| **PWA** | Serwist (Service Worker) |\n| **Deployment** | Vercel |\n\n## Quick Start\n\n### Prerequisites\n\n- **Node.js** 18+ (recommended: 20+)\n- **pnpm** (recommended) or npm/yarn\n- **Supabase Account** — [supabase.com](https://supabase.com/)\n- **Mapbox Token** (optional) — [mapbox.com](https://www.mapbox.com/)\n\n### 1. Clone the Repository\n\n```bash\ngit clone https://github.com/your-username/encounter.git\ncd encounter\n```\n\n### 2. Install Dependencies\n\n```bash\npnpm install\n```\n\n### 3. Environment Variables\n\nCreate a `.env.local` file in the root directory:\n\n```env\n# Required: Supabase\nNEXT_PUBLIC_SUPABASE_URL=your_supabase_url\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key\nSUPABASE_SERVICE_ROLE_KEY=your_service_role_key\n\n# Required: Encryption\nENCRYPTION_SECRET=your_random_secret_at_least_32_chars\n\n# Required: Email\nRESEND_API_KEY=your_resend_api_key\nRESEND_FROM_EMAIL=noreply@yourdomain.com\n\n# Optional: App Config\nNEXT_PUBLIC_APP_NAME=Encounter\nNEXT_PUBLIC_DEFAULT_TIMEZONE=UTC\n\n# Optional: Mapbox (for map features)\nNEXT_PUBLIC_MAPBOX_TOKEN=your_mapbox_token\n\n# Optional: Rate Limiting (Upstash Redis)\nUPSTASH_REDIS_REST_URL=your_redis_url\nUPSTASH_REDIS_REST_TOKEN=your_redis_token\n```\n\n### 4. Database Setup\n\n1. Create a new project in [Supabase](https://supabase.com/)\n2. Install the [Supabase CLI](https://supabase.com/docs/guides/cli)\n3. Link your project and run migrations:\n\n```bash\nsupabase link --project-ref your-project-ref\nsupabase db push\n```\n\n### 5. Start Development Server\n\n```bash\npnpm dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) in your browser.\n\n## Documentation\n\n| Document | Description |\n|----------|-------------|\n| [Design System](./design.md) | Linear-inspired visual design guidelines |\n| [Development Spec](./intimacy-tracker-dev-spec.md) | Complete product specification (Chinese) |\n| [AI Collaboration Protocol](./AGENTS.md) | Git workflow and coding standards |\n| [AI Code Guidelines](./CLAUDE.md) | AI-assisted development guidelines |\n\n## Project Structure\n\n```\nsrc/\n├── app/                    # Next.js App Router pages\n│   ├── (app)/              # Protected routes (dashboard, timeline, etc.)\n│   ├── (public)/           # Public routes (login, register, etc.)\n│   └── api/                # API route handlers\n├── components/             # React components\n│   ├── ui/                 # Base UI components (shadcn)\n│   ├── layout/             # Layout components (sidebar, nav)\n│   ├── analytics/          # Dashboard \u0026 charts\n│   ├── forms/              # Form components\n│   ├── timeline/           # Timeline views\n│   ├── map/                # Map components\n│   ├── partners/           # Partner management\n│   └── settings/           # Settings panels\n├── features/               # Business logic \u0026 server actions\n│   ├── auth/               # Authentication\n│   ├── records/            # Encounter CRUD\n│   ├── analytics/          # Statistics queries\n│   ├── partners/           # Partner management\n│   ├── map/                # Map data queries\n│   └── privacy/            # PIN \u0026 privacy settings\n├── lib/                    # Utilities \u0026 configurations\n│   ├── supabase/           # Supabase client setup\n│   ├── auth/               # PIN hashing \u0026 verification\n│   ├── encryption/         # AES-256-GCM encryption\n│   └── email/              # Resend email templates\n├── stores/                 # Zustand state stores\n├── hooks/                  # Custom React hooks\n└── i18n/                   # Internationalization config\n```\n\n## Configuration\n\n### Location Modes\n\nEncounter supports three location precision levels:\n\n| Mode | Description | Storage |\n|------|-------------|---------|\n| `off` | No location data collected | None |\n| `city` | City-level approximation | City/country names |\n| `exact` | GPS coordinates | Lat/lng + city/country |\n\n### PIN Security\n\nThe PIN system implements progressive lockout protection:\n\n| Failed Attempts | Lockout Duration |\n|-----------------|------------------|\n| 1-4 | None |\n| 5 | 1 minute |\n| 6 | 5 minutes |\n| 7 | 15 minutes |\n| 8+ | 1 hour |\n\nPIN hashes are stored using scrypt (v2) with automatic upgrade from legacy HMAC (v1).\n\n## Deployment\n\n### Vercel (Recommended)\n\n1. Push to GitHub\n2. Import project in [Vercel](https://vercel.com/)\n3. Configure environment variables\n4. Deploy\n\n### Self-Hosted\n\n```bash\npnpm build\npnpm start\n```\n\n## Contributing\n\nWe welcome contributions! Please follow these steps:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit changes (`git commit -m 'feat: add amazing feature'`)\n4. Push to branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\nPlease read [AGENTS.md](./AGENTS.md) for our Git workflow and coding standards.\n\n## Security\n\nFor security concerns, please email [security@yourdomain.com](mailto:security@yourdomain.com) directly.\n\n**Security Features:**\n- AES-256-GCM encryption for sensitive data\n- Row Level Security (RLS) on all tables\n- PIN brute-force protection\n- Audit logging for data exports\n- No tracking, no analytics, no third-party services\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Built with care for privacy-conscious individuals**\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falvinluo-tech%2Fintimacy-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falvinluo-tech%2Fintimacy-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falvinluo-tech%2Fintimacy-tracker/lists"}