{"id":47892523,"url":"https://github.com/cipher982/drose_io","last_synced_at":"2026-04-04T03:10:50.220Z","repository":{"id":200621326,"uuid":"705904117","full_name":"cipher982/drose_io","owner":"cipher982","description":"my website","archived":false,"fork":false,"pushed_at":"2026-03-04T22:28:49.000Z","size":47438,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-05T00:49:37.420Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://drose.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cipher982.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":"2023-10-16T23:33:19.000Z","updated_at":"2026-03-04T18:34:38.000Z","dependencies_parsed_at":"2024-05-09T23:30:01.712Z","dependency_job_id":"ee859670-c613-4659-8509-df6ae5c0c7b9","html_url":"https://github.com/cipher982/drose_io","commit_stats":null,"previous_names":["cipher982/drose_io"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cipher982/drose_io","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipher982%2Fdrose_io","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipher982%2Fdrose_io/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipher982%2Fdrose_io/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipher982%2Fdrose_io/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cipher982","download_url":"https://codeload.github.com/cipher982/drose_io/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipher982%2Fdrose_io/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31386001,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T01:22:39.193Z","status":"online","status_checked_at":"2026-04-04T02:00:07.569Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-04-04T03:10:49.629Z","updated_at":"2026-04-04T03:10:50.203Z","avatar_url":"https://github.com/cipher982.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# drose.io - Personal Portfolio \u0026 Feedback System\n\nA real-time personal portfolio with a \"Zerg Glass\" aesthetic and integrated messaging system. Visitors can send direct messages that land on my phone instantly, and I can reply via a mobile-optimized admin interface.\n\n## 🌌 Zerg Glass Theme\nThe site uses a modern glassmorphism design system (\"Zerg Glass\") featuring:\n- **Void Backgrounds**: Deep blacks (`#030305`) with layered grid and nebula effects.\n- **Glass Morphism**: High-blur backdrops for panels and cards.\n- **Neon Accents**: Indigo, cyan, pink, and purple glows.\n- **Animated Motion**: Grid pulses, nebula drifts, and dramatic hover transitions.\n\n## Features\n\n### For Visitors\n- 👋 **One-click interaction** - \"I'm a real person\" button to prove humanity.\n- 💬 **Direct Messaging** - Send messages that persist across browser sessions.\n- 🔴 **Live Replies** - See when I reply in real-time via Server-Sent Events (SSE).\n- ✍️ **Engineering Blog** - Read long-form thoughts on AI agents and agentic systems.\n- ⚡ **Instant Updates** - No refreshing needed for conversation updates.\n\n### For Admin (You)\n- 📬 **Dual Notifications** - Get ntfy push alerts AND optional Twilio SMS.\n- 💻 **Mobile Admin UI** - Reply, manage threads, and publish blog posts from `/admin.html`.\n- 🔐 **Secure Access** - Simple Bearer authentication for all admin operations.\n- 📝 **Blog Management** - Create, edit, and publish Markdown posts with ease.\n- 📊 **Real-time Monitoring** - Live connection stats and thread management.\n\n## Quick Start\n\n### Development\n```bash\nbun install    # Install dependencies\nbun run dev    # Start development server with Umami injection\n```\n\n### Testing\n```bash\nmake test       # Quick API tests\nmake test-full  # Full integration test\nmake test-e2e   # Playwright end-to-end tests\n```\n\n### Deployment\nDeployment is handled automatically by **Coolify** on `clifford` (prod VPS) upon pushing to the `main` branch.\n\n## Architecture\n\n### Tech Stack\n- **Runtime:** Bun (Blazing fast TS execution)\n- **Framework:** Hono (Lightweight and fast web framework)\n- **Frontend:** Static HTML + CSS Tokens + Build-time script injection\n- **Storage:** JSONL append-only files (Simple, transparent, no DB required)\n- **Real-time:** Server-Sent Events (Native, efficient live updates)\n- **Notifications:** ntfy.sh \u0026 Twilio SMS\n\n### File Structure\n\n```\ndrose_io/\n├── server/\n│   ├── index.ts                  # Main entry point\n│   ├── api/                      # API endpoint handlers\n│   │   ├── blog.ts               # Blog management\n│   │   ├── threads.ts            # Messaging logic\n│   │   └── sse.ts                # Real-time streaming\n│   ├── storage/                  # Data persistence layer\n│   └── routes/                   # SSR routes (e.g., Blog)\n├── public/\n│   ├── index.html                # Homepage\n│   ├── admin.html                # Admin Dashboard\n│   └── assets/\n│       ├── css/                  # Zerg Glass design system\n│       └── js/                   # Real-time widget logic\n├── content/\n│   └── blog/                     # Markdown post storage\n├── data/\n│   ├── threads/                  # Conversation history\n│   └── blocked/                  # Visitor blocklist\n├── scripts/\n│   └── inject-umami.ts           # Build-time analytics injection\n└── Makefile                      # Task automation\n```\n\n## API Endpoints\n\n### Public\n- `POST /api/feedback` - Send initial ping or message.\n- `GET /api/threads/:visitorId/messages` - Get history.\n- `GET /api/threads/:visitorId/stream` - Live message stream (SSE).\n- `GET /blog` - View all published posts.\n- `GET /blog/:slug` - Read a specific post.\n\n### Admin (Requires Bearer Auth)\n- `GET /api/admin/threads` - List all active conversations.\n- `POST /api/admin/threads/:visitorId/reply` - Send reply to visitor.\n- `DELETE /api/admin/threads/:visitorId` - Archive/delete thread.\n- `GET /api/admin/blog/posts` - List all posts (including drafts).\n- `POST /api/admin/blog/posts` - Create new post.\n- `PATCH /api/admin/blog/posts/:slug` - Update post content/status.\n\n## Configuration\n\n### Environment Variables\n- `ADMIN_PASSWORD`: For admin dashboard access.\n- `NTFY_TOPIC`: For mobile push notifications.\n- `UMAMI_WEBSITE_ID`: For analytics injection.\n- `TWILIO_*`: (Optional) For SMS notification fallbacks.\n\n## License\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcipher982%2Fdrose_io","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcipher982%2Fdrose_io","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcipher982%2Fdrose_io/lists"}