{"id":32532690,"url":"https://github.com/yosebyte/boardcast","last_synced_at":"2026-02-10T16:16:39.888Z","repository":{"id":312202227,"uuid":"1046662806","full_name":"yosebyte/boardcast","owner":"yosebyte","description":"轻量极简的实时协作文字白板","archived":false,"fork":false,"pushed_at":"2025-09-04T03:54:07.000Z","size":70,"stargazers_count":19,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-11-17T09:23:59.979Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://boardcast.yobc.de","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yosebyte.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":null,"dco":null,"cla":null}},"created_at":"2025-08-29T03:08:55.000Z","updated_at":"2025-11-10T02:07:40.000Z","dependencies_parsed_at":"2025-08-29T07:38:52.753Z","dependency_job_id":"d6d5d391-a89f-47df-a492-d455eb42bfc7","html_url":"https://github.com/yosebyte/boardcast","commit_stats":null,"previous_names":["yosebyte/boardcast"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/yosebyte/boardcast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yosebyte%2Fboardcast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yosebyte%2Fboardcast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yosebyte%2Fboardcast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yosebyte%2Fboardcast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yosebyte","download_url":"https://codeload.github.com/yosebyte/boardcast/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yosebyte%2Fboardcast/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28572585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T14:39:55.009Z","status":"ssl_error","status_checked_at":"2026-01-19T14:39:01.217Z","response_time":67,"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":"2025-10-28T12:55:53.958Z","updated_at":"2026-02-10T16:16:39.881Z","avatar_url":"https://github.com/yosebyte.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BoardCast\n\nA lightweight, real-time collaborative markdown editor with multi-tab support and persistent storage.\n\n## Features\n\n- **Real-time Collaboration**: WebSocket-based synchronization across multiple clients\n- **Multi-Tab Workspace**: Create, rename, and manage multiple tabs\n- **Persistent Storage**: SQLite database for reliable data persistence\n- **Theme Switching**: System, Light, and Dark modes with full UI adaptation\n- **Adjustable Font Size**: Customize editor font size (10-32px)\n- **Monaco Editor**: Professional code editor with syntax highlighting and line numbers\n- **Session-based Authentication**: Secure HTTP-only cookie authentication\n- **Automatic Reconnection**: Seamless reconnection on connection loss\n- **Optimized Input**: Debounced updates and cursor position preservation for smooth typing\n\n## Quick Start\n\n### Docker Deployment\n\n```bash\ndocker run -d \\\n  -p 8080:8080 \\\n  -e BOARDCAST_PASSWORD=your-secure-password \\\n  -v boardcast-data:/app/data \\\n  ghcr.io/yosebyte/boardcast:latest\n```\n\n### Environment Variables\n\n- `BOARDCAST_PASSWORD` - Authentication password (required)\n- `BOARDCAST_PASSWORD_FILE` - Path to password file (alternative to BOARDCAST_PASSWORD)\n- `BOARDCAST_DATA_DIR` - Data directory path (default: `./data`)\n- `BOARDCAST_PORT` - HTTP server port (default: `8080`)\n\n### Using Password File\n\n```bash\n# Create password file\necho \"your-secure-password\" \u003e /path/to/password.txt\nchmod 600 /path/to/password.txt\n\n# Run with password file\ndocker run -d \\\n  -p 8080:8080 \\\n  -v /path/to/password.txt:/secrets/password:ro \\\n  -v boardcast-data:/app/data \\\n  -e BOARDCAST_PASSWORD_FILE=/secrets/password \\\n  ghcr.io/yosebyte/boardcast:latest\n```\n\n### Docker Compose\n\n```yaml\nversion: '3.8'\n\nservices:\n  boardcast:\n    image: ghcr.io/yosebyte/boardcast:latest\n    ports:\n      - \"8080:8080\"\n    environment:\n      BOARDCAST_PASSWORD: your-secure-password\n      # Or use password file:\n      # BOARDCAST_PASSWORD_FILE: /secrets/password\n    volumes:\n      - boardcast-data:/app/data\n      # If using password file:\n      # - ./password.txt:/secrets/password:ro\n    restart: unless-stopped\n\nvolumes:\n  boardcast-data:\n```\n\n### Manual Build and Run\n\n```bash\n# Clone repository\ngit clone https://github.com/yosebyte/boardcast.git\ncd boardcast\n\n# Build frontend\ncd web\nnpm install\nnpm run build\ncd ..\n\n# Build and run backend\ngo build -o boardcast ./cmd/boardcast\nBOARDCAST_PASSWORD=your-password ./boardcast\n```\n\n## Usage\n\n1. Open http://localhost:8080 in your browser\n2. Enter your password to authenticate\n3. Start editing:\n   - Create new tabs with the \"+ New Tab\" button\n   - Switch between tabs in the sidebar\n   - Rename tabs by clicking the edit icon\n   - Delete tabs by clicking the delete icon (minimum 1 tab required)\n4. Adjust preferences:\n   - Click the +/- buttons to increase/decrease font size\n   - Click the theme button to cycle between System/Light/Dark modes\n5. Your changes are automatically saved and synced across all connected clients\n\n## Architecture\n\n### Backend (Go)\n\n- **HTTP Server**: Serves static files and handles API requests\n- **WebSocket Server**: Real-time bidirectional communication\n- **Session Management**: Server-side sessions with HTTP-only cookies\n- **Storage**: SQLite database with automatic schema initialization\n\n**Database Schema:**\n- `tabs`: Store tab content with unique IDs, names, and timestamps\n\n### Frontend (React + TypeScript)\n\n- **Monaco Editor**: VS Code's editor component for professional editing experience\n- **WebSocket Client**: Manages real-time synchronization with automatic reconnection\n- **State Management**: React hooks for efficient state updates\n- **Theme System**: CSS variables and Tailwind classes for consistent theming\n- **Input Optimization**: Cursor position preservation and debounced updates\n\n## Security\n\n- **Authentication**: Password-based authentication with session cookies\n- **HTTP-only Cookies**: Prevents XSS attacks by making cookies inaccessible to JavaScript\n- **Session Expiration**: Automatic session cleanup (24-hour expiration)\n- **Password Options**: Environment variable or secure file-based password storage\n- **CORS**: Configured for same-origin requests only\n\n## Data Persistence\n\nAll data is stored in SQLite database at the configured data directory (default: `./data`).\n\n**Backup:**\n```bash\n# Stop container\ndocker stop boardcast\n\n# Backup data volume\ndocker run --rm -v boardcast-data:/data -v $(pwd):/backup alpine tar czf /backup/boardcast-backup.tar.gz -C /data .\n\n# Restart container\ndocker start boardcast\n```\n\n**Restore:**\n```bash\n# Stop container\ndocker stop boardcast\n\n# Restore data volume\ndocker run --rm -v boardcast-data:/data -v $(pwd):/backup alpine tar xzf /backup/boardcast-backup.tar.gz -C /data\n\n# Restart container\ndocker start boardcast\n```\n\n## Development\n\n### Requirements\n\n- Go 1.20+\n- Node.js 18+\n- npm or yarn\n\n### Local Development\n\n```bash\n# Terminal 1: Backend\ngo run ./cmd/boardcast\n\n# Terminal 2: Frontend\ncd web\nnpm install\nnpm run dev\n```\n\nFrontend dev server runs on http://localhost:5173 and proxies API requests to the backend on port 8080.\n\n## License\n\nBSD-3-Clause License\n\nCopyright (c) 2026, Mikyla\n\n## Links\n\n- Repository: https://github.com/yosebyte/boardcast\n- Docker Images: https://github.com/yosebyte/boardcast/pkgs/container/boardcast\n- Issues: https://github.com/yosebyte/boardcast/issues\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyosebyte%2Fboardcast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyosebyte%2Fboardcast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyosebyte%2Fboardcast/lists"}