{"id":44316317,"url":"https://github.com/bitkarrot/nostr-cms","last_synced_at":"2026-02-11T05:11:46.789Z","repository":{"id":333447270,"uuid":"1137045412","full_name":"bitkarrot/nostr-cms","owner":"bitkarrot","description":"nostr simple cms meetup template","archived":false,"fork":false,"pushed_at":"2026-02-08T03:32:39.000Z","size":1413,"stargazers_count":1,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-08T11:04:51.376Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://cms-meetup-site.vercel.app/","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/bitkarrot.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-18T20:15:36.000Z","updated_at":"2026-02-08T03:28:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bitkarrot/nostr-cms","commit_stats":null,"previous_names":["bitkarrot/meetup-site","bitkarrot/cms-meetup-site","bitkarrot/nostr-cms"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/bitkarrot/nostr-cms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitkarrot%2Fnostr-cms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitkarrot%2Fnostr-cms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitkarrot%2Fnostr-cms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitkarrot%2Fnostr-cms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bitkarrot","download_url":"https://codeload.github.com/bitkarrot/nostr-cms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitkarrot%2Fnostr-cms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29327137,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T03:52:29.695Z","status":"ssl_error","status_checked_at":"2026-02-11T03:52:23.094Z","response_time":97,"last_error":"SSL_read: 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":[],"created_at":"2026-02-11T05:11:46.699Z","updated_at":"2026-02-11T05:11:46.781Z","avatar_url":"https://github.com/bitkarrot.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# A Nostr CMS for Organizations\n\nDeploy with Vercel \n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fbitkarrot%2Fmeetup-site) \n\nYou Must configure your .env in vercel before running the app\n\n```sh\n# Remote nostr.json for admin authentication\nVITE_REMOTE_NOSTR_JSON_URL=\n\n# Default relay for reading content\nVITE_DEFAULT_RELAY=\n\n# Master pubkey (owner of the site)\nVITE_MASTER_PUBKEY=\n```\n\nA comprehensive meetup or small organization and event management system built with React, TypeScript, and Nostr. This project provides both an admin CMS for content management and a public-facing website for community engagement.\n\n## Features\n\n### Admin Dashboard\n- **Authentication**: Remote `nostr.json` validation for admin access control.\n- **Admin Roles**: Support for **Primary** and **Secondary** admin roles with different publishing permissions.\n- **Content Management**: Full CMS with TipTap rich text editor for blogs and events.\n- **Static Pages**: Create and manage static HTML/Markdown pages via **Kind 34128** (nsite) with Blossom storage.\n- **Blog Management**: Create, edit, and manage long-form content (**NIP-23**) with username-based filtering.\n- **Event Management**: Create and manage events with RSVP functionality (**NIP-52**) and username-based filtering.\n- **Draft Support**: Save drafts to default relay before publishing.\n- **Site Configuration**: Customize logos, titles, favicons, and navigation menus.\n- **Relay Management**: Configure a **Primary Relay** (prioritized) and additional **Publishing Relays** for redundancy.\n- **Media Library**: Manage uploaded images and files via Blossom servers.\n- **Feed Management**: Curate and manage content feeds.\n- **Zaplytics**: Comprehensive analytics dashboard for tracking zap earnings, top contributors, and content performance.\n- **Reset to Defaults**: Quickly reset all site settings to environment variable defaults and clear local caches.\n\n### Public Website\n- **Zaps \u0026 Tips**: Integrated support for **Lightning Zaps (NIP-57)** for community appreciation.\n- **NWC Integration**: Support for **Nostr Wallet Connect (NIP-47)** for seamless zapping.\n- **Hero Section**: Customizable hero with background image and text.\n- **Event Listings**: Browse upcoming and past events with filtering and author attribution.\n- **Event Details**: Full event pages with RSVP functionality and attendee lists.\n- **Blog Section**: Display published blog posts with rich formatting and author metadata.\n- **Navigation**: Customizable navigation menu with submenus and mobile-responsive labels.\n- **Responsive Design**: Mobile-friendly interface with light/dark mode support.\n\n### AI Integration\n- **Shakespeare API**: Built-in `useShakespeare` hook for integrating AI chat completions.\n- **Streaming Support**: Support for streaming AI responses.\n- **Model Selection**: Dynamic model discovery and selection.\n- **Nostr Authentication**: Secure authentication with the AI provider using Nostr keys.\n\n## Technical Stack\n\n- **React 18.x**: Modern React with hooks and concurrent features.\n- **TypeScript**: Type-safe development.\n- **Vite**: Fast build tool and development server.\n- **TailwindCSS \u0026 shadcn/ui**: Utility-first CSS and high-quality UI components.\n- **Nostrify**: Nostr protocol integration.\n- **TipTap**: Rich text editor for content creation.\n- **TanStack Query**: Data fetching and state management.\n- **Blossom**: Media and static content storage.\n- **WebLN**: Lightning Network integration for zaps.\n- **Shakespeare AI**: AI chat completion API integration.\n\n## Configuration\n\n### Relays\n- **Primary Relay**: Configured via `VITE_DEFAULT_RELAY`. This is the main source for reading and the first destination for publishing.\n- **Additional Publishing Relays**: \n  - `wss://relay.damus.io`\n  - `wss://relay.primal.net` \n  - `wss://nos.lol`\n- **Admin Control**: Admins can dynamically add or remove publishing relays via the system settings.\n\n### Admin Access\nAdmin access is controlled by a remote `nostr.json` file (configured via `VITE_REMOTE_NOSTR_JSON_URL`). The site automatically detects users and maps roles based on the Master Pubkey.\n\n## NIPs Used\n\n- **NIP-01**: Basic protocol flow\n- **NIP-05**: Mapping Nostr keys to DNS-based identifiers\n- **NIP-23**: Long-form content for blog posts\n- **NIP-47**: Nostr Wallet Connect (NWC)\n- **NIP-52**: Calendar events for meetups\n- **NIP-25**: Event RSVP functionality\n- **NIP-57**: Lightning Zaps\n- **NIP-nsite (Type 34128)**: Static page mapping\n- **NIP-04/17**: Direct messaging support\n\n## Project Structure\n\n```\nsrc/\n├── components/\n│   ├── admin/          # Admin dashboard components (Blogs, Events, Pages, Settings)\n│   ├── ui/              # shadcn/ui components\n│   └── ...            # Other shared components\n├── contexts/             # React contexts (App, DM, NWC, Wallet)\n├── hooks/               # Custom hooks (useNostr, useZaps, useAuthor, etc.)\n├── pages/              # Page components\n│   ├── admin/          # Admin pages\n│   └── ...            # Public pages\n└── lib/                # Utility functions and shared logic\n```\n\n## Development\n\n### Prerequisites\n- Node.js 18+\n- npm or pnpm\n\n### Installation\n```bash\nnpm install\n```\n\n### Development Server\n```bash\nnpm run dev\n```\n\n### Building\n```bash\nnpm run build\n```\n\n## Admin Features In-Depth\n\n### Settings Structure\nThe application uses a layered configuration approach:\n\n1. **Environment Variables (`.env`)**: \n   - Immutable infrastructure keys (Relays, Master Pubkey, Remote Admin JSON).\n   - Serves as the hardcoded default state.\n\n2. **Site Settings (Admin UI)**: \n   - Customizable branding (Logo, Title, Description, Navigation).\n   - Stored as Replaceable Events (Kind 30078) on Nostr.\n   - Overrides defaults when present.\n\n3. **System Settings (Admin UI)**:\n   - Administrative configuration (Relay List, Admin Roles).\n   - Controls strictly limited to the Master User.\n\nThe **Reset to Defaults** feature allows admins to purge the Nostr-based Site Settings and revert to the `.env` configuration.\n\n### Static Pages (Kind 34128)\nAdmins can create custom URL paths (e.g., `/about`, `/contact`) and upload content (HTML/Markdown) to Blossom. These are mapped using Kind 34128 events, allowing the site to serve decentralized static content.\n\n## Public Features In-Depth\n\n### Community Zapping\nUsers can send Bitcoin via Lightning Network zaps to authors of blog posts and events. The site supports:\n- **WebLN**: Browser extensions like Alby.\n- **NWC**: Cross-device wallet connections.\n- **QR Codes**: Manual scanning for mobile or desktop wallets.\n\n## Security\n- Admin access is cryptographically verified based on the remote `nostr.json`.\n- Sensitve configurations are stored in environment variables.\n- No private keys are stored on the server; all signing happens via local clients or NWC.\n\n## Developer Documentation\n\nThe project includes specialized documentation in the `docs/` directory:\n\n- **[AI Chat](docs/AI_CHAT.md)**: Implementation guide for AI chat interfaces using the Shakespeare API.\n- **[Nostr Direct Messages](docs/NOSTR_DIRECT_MESSAGES.md)**: Guide for implementing NIP-04 and NIP-17 direct messaging.\n- **[Nostr Comments](docs/NOSTR_COMMENTS.md)**: Guide for comment systems.\n- **[Infinite Scroll](docs/NOSTR_INFINITE_SCROLL.md)**: Guide for feed interfaces.\n\n## License\nThis project is open source and available under the MIT License.\n\n## Note\nThis project was vibe coded by bitkarrot as an experiment with antigravity.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitkarrot%2Fnostr-cms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbitkarrot%2Fnostr-cms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitkarrot%2Fnostr-cms/lists"}