{"id":47683335,"url":"https://github.com/svanvliet/notebook-md","last_synced_at":"2026-04-02T14:19:55.217Z","repository":{"id":344459613,"uuid":"1160408645","full_name":"svanvliet/notebook-md","owner":"svanvliet","description":"WYSIWYG Markdown notebook editor — bring your own cloud storage via OneDrive, Google Drive, or GitHub.","archived":false,"fork":false,"pushed_at":"2026-03-24T02:58:27.000Z","size":17668,"stargazers_count":1,"open_issues_count":17,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-24T17:24:20.491Z","etag":null,"topics":["collab","editor","markdown"],"latest_commit_sha":null,"homepage":"https://www.notebookmd.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/svanvliet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":null,"dco":null,"cla":null}},"created_at":"2026-02-17T22:46:14.000Z","updated_at":"2026-03-18T19:26:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/svanvliet/notebook-md","commit_stats":null,"previous_names":["svanvliet/notebook-md"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/svanvliet/notebook-md","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svanvliet%2Fnotebook-md","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svanvliet%2Fnotebook-md/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svanvliet%2Fnotebook-md/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svanvliet%2Fnotebook-md/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/svanvliet","download_url":"https://codeload.github.com/svanvliet/notebook-md/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svanvliet%2Fnotebook-md/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31307753,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"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":["collab","editor","markdown"],"created_at":"2026-04-02T14:19:54.583Z","updated_at":"2026-04-02T14:19:55.202Z","avatar_url":"https://github.com/svanvliet.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Notebook.md\n\nA web application for creating, editing, and organizing Markdown notebooks through an intuitive WYSIWYG canvas interface. Connect your existing cloud storage (OneDrive, Google Drive, GitHub), or use Cloud notebooks for real-time co-authoring with encrypted storage you control.\n\n## Features\n\n-   **WYSIWYG Markdown editor** — Tiptap/ProseMirror with full GFM support, slash commands, floating table toolbar, and raw markdown toggle\n    \n-   **Bring your own storage** — connect OneDrive, Google Drive, or GitHub repos as notebook sources (local browser storage available too)\n\n-   **Cloud notebooks** — hosted encrypted storage with real-time co-authoring, sharing, and public links\n    \n-   **Real-time co-authoring** — write together with live cursors, presence indicators, and zero merge conflicts\n\n-   **Sharing \u0026 permissions** — invite collaborators as Owner, Editor, or Viewer; create public view-only links\n    \n-   **Multi-provider auth** — email + password, magic link, or OAuth (Microsoft, GitHub, Google)\n    \n-   **Tabbed editor** — multiple documents open simultaneously\n    \n-   **AI content generation** — generate formatted Markdown content with GPT-4.1-nano via slash command or toolbar button\n    \n-   **Notebook tree** — hierarchical file/folder browser with drag-and-drop import\n    \n-   **Settings sync** — display mode, font, margins, and preferences persist across sessions\n    \n-   **Account management** — profile editing, password change, linked accounts, account deletion\n    \n\n## Tech Stack\n\n| Layer | Technology |\n| --- | --- |\n| Frontend | React 19, TypeScript, Tailwind CSS, Tiptap |\n| Backend | Express 5, TypeScript, node-pg-migrate |\n| Database | PostgreSQL 16 (account metadata + Cloud notebook content, encrypted) |\n| Cache | Redis 7 (sessions, rate limiting) |\n| Email | Nodemailer (Mailpit for local dev) |\n| Infrastructure | Docker Compose (local), containers (production) |\n\n## Project Structure\n\n```\nnotebook-md/\n├── apps/\n│   ├── web/          # React frontend (Vite, port 5173)\n│   ├── api/          # Express API server (port 3001)\n│   ├── admin/        # Admin console (React, separate deploy)\n│   └── collab/       # WebSocket collaboration server\n├── packages/\n│   └── shared/       # Shared types and utilities\n├── docker/           # Docker configuration\n├── docs/             # Requirements, plans, and documentation\n├── infra/            # Terraform infrastructure-as-code\n├── e2e/              # Playwright end-to-end tests\n├── dev.sh            # Development startup script\n└── docker-compose.yml\n```\n\n## Prerequisites\n\n-   **Node.js** ≥ 20\n    \n-   **Docker Desktop** (for PostgreSQL, Redis, Mailpit)\n    \n\n## Getting Started\n\nClone the repo and install dependencies:\n\n```sh\ngit clone https://github.com/svanvliet/notebook-md.git\ncd notebook-md\nnpm install\n```\n\nStart all services with the dev script:\n\n```sh\n./dev.sh\n```\n\nThis single command will:\n\n1.  Start Docker services (PostgreSQL, Redis, Mailpit)\n    \n2.  Run database migrations (dev + test databases)\n    \n3.  Start the API server (port 3001)\n    \n4.  Start the Vite dev server (port 5173)\n    \n5.  Start the webhook proxy (smee.io → localhost, if configured)\n    \n6.  Print all service URLs\n    \n7.  Tail logs (Ctrl+C to detach — services keep running)\n    \n\n### Dev Script Commands\n\n| Command | Description |\n| --- | --- |\n| `./dev.sh` | Start everything and tail logs |\n| `./dev.sh stop` | Stop all services |\n| `./dev.sh status` | Check health of each service |\n| `./dev.sh logs` | Tail API and web server logs |\n\n### Service URLs\n\n| Service | URL |\n| --- | --- |\n| Web App | [http://localhost:5173](http://localhost:5173) |\n| API Health | [http://localhost:3001/api/health](http://localhost:3001/api/health) |\n| Mailpit (email inbox) | [http://localhost:8025](http://localhost:8025) |\n| Mock OAuth | [http://localhost:3001/auth/oauth/mock](http://localhost:3001/auth/oauth/mock) |\n\n### Dev Accounts\n\n| Account | Credentials |\n| --- | --- |\n| Admin | `admin@localhost` / `admin123` |\n| Mock OAuth | Use the mock provider form to simulate any profile |\n\n\u003e **Tip:** On the welcome screen, click **Skip to app (dev)** to bypass auth during development.\n\n### Webhook Proxy (GitHub)\n\nGitHub can't deliver webhooks to `localhost`. We use [smee.io](https://smee.io) to proxy them in dev:\n\n1.  Create a channel at [https://smee.io/new](https://smee.io/new) (or reuse an existing one)\n    \n2.  Set `WEBHOOK_PROXY_URL=https://smee.io/YOUR_CHANNEL` in `.env`\n    \n3.  Use the same URL as the **Webhook URL** in your GitHub App settings\n    \n\n`dev.sh` auto-starts the smee proxy when `WEBHOOK_PROXY_URL` is set. Events are forwarded to `http://localhost:3001/webhooks/github`.\n\n## Status\n\n🚀 **Live at [www.notebookmd.io](https://www.notebookmd.io)** — Cloud notebooks, co-authoring, AI generation, and BYO storage all available. See `docs/plans/` for roadmap.\n\n## License\n\nCopyright © Van Vliet Ventures, LLC. All rights reserved.\n\nThis is the final test to see if the PR closure works correctly.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvanvliet%2Fnotebook-md","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsvanvliet%2Fnotebook-md","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvanvliet%2Fnotebook-md/lists"}