⓪ηηωεε忧世 f87a62138d Deploy/production (#1308)
* decimated

* Remove docs, tests, and artifacts to keep production lean

* Remove service status dashboard feature (compilation issues, not needed for lean prod)

* Remove service status references from main.go and fix WebSocket config

* fix app

* deltions

* big pull fin

* big pull

* lit

* last one

* deploy

* bringing back for local dev

* Fix missing permission checks, remove dead dependencies, and clean up build config

- Add RequirePermission(PermissionManageUsers) to badge award/remove routes
- Migrate all lib/pq usages to pgx/v5 native array handling and remove dependency
- Remove unused zustand dependency from frontend
- Move @types/dompurify to devDependencies
- Update react-is to v19 for React 19 compatibility
- Enable CSS code splitting for smaller initial payloads

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* threejs

* automated playlists

* bug fixes

* feat: add tags and streamers to CategoriesNav, fix empty category clips

- CategoriesNav now has tabs: Categories, Tags, Streamers
- Tags tab shows popular tags with color dots and usage counts
- Streamers tab shows popular broadcasters with clip counts
- Added GET /api/v1/broadcasters/popular endpoint
- Category clips now falls back to recent clips when no games match
- Reduced per-game clip fetch from 1000 to 200

* Apply stashed changes: search fix, deploy script, i18n, websocket refs, category handler, broadcaster repo, UI cleanup

- Fix search API 500: use explicit columns in searchTags instead of SELECT t.*
- Remove auto-stash from deploy script (deploy current working tree)
- Add useEffect wrappers for ref updates in websocket hooks
- Add i18n translations (en, es, fr) for error boundary, pages
- Improve category handler: better error handling, proper total count
- Improve broadcaster repo: add limit validation, filter hidden clips
- Remove ExternalLink component and ServiceStatusPage
- Add comments to CategoriesNav for clarity
- Various admin page and component fixes

* Fix duplicate ListPopularBroadcasters and fetchPopularBroadcasters from stash merge

* Add /health root route for Docker HEALTHCHECK

* deploy script

* broadcaster api

* tailwind fixes

* fix: remove duplicate /broadcasters/popular route causing panic on startup

* fix: remove duplicate fetchPopularBroadcasters export causing build failure

* fix: handle null search_history response to prevent filter TypeError

* automated playlists

* overhaul discorvery

* useclips

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 13:58:28 -06:00
2026-02-21 16:14:32 -06:00
2026-02-21 22:32:33 -06:00
2026-02-22 13:58:28 -06:00
2026-02-22 01:21:59 -06:00
2026-02-22 13:58:28 -06:00
2026-02-21 16:14:32 -06:00
2026-02-21 16:14:32 -06:00
2026-02-21 22:32:33 -06:00
2026-02-21 22:32:33 -06:00
2026-02-21 22:32:33 -06:00
2026-02-21 22:32:33 -06:00
2026-01-23 11:05:04 -06:00
2026-02-08 21:29:16 -06:00
2026-02-21 22:32:33 -06:00
2026-02-08 21:29:16 -06:00
2025-12-15 17:15:01 -06:00
2026-02-06 15:08:36 -06:00
2026-02-08 21:29:16 -06:00
2026-02-08 21:29:16 -06:00
2026-02-21 22:32:33 -06:00

Clipper

A modern, community-driven Twitch clip curation platform

CI Status License

Clipper is a full-stack platform for discovering, curating, and sharing the best Twitch clips. It combines powerful search capabilities, community voting, and social features to help users find and organize memorable gaming moments.

Key Features

  • 🔍 Advanced Search: Hybrid BM25 + semantic vector search with natural language queries
  • ⬆️ Community Curation: Reddit-style voting, comments, and karma system
  • 📱 Multi-Platform: Responsive web app + native iOS/Android apps
  • 💎 Premium Features: Unlimited collections, advanced filters, and cross-device sync
  • 🎮 Twitch Integration: OAuth login, live streams, and clip submission
  • 🚀 Modern Stack: Go backend, React frontend, React Native mobile

🚀 Quick Start

Prerequisites

  • Docker & Docker Compose (recommended)
  • Node.js 20+ (for frontend/mobile development)
  • Go 1.24+ (for backend development)
  • PostgreSQL 17+ (if running without Docker)
  • Redis 8+ (if running without Docker)

Getting Started with Docker

```bash

Clone the repository

git clone https://github.com/subculture-collective/clipper.git cd clipper

Copy environment files

cp .env.development.example .env

Start all services

docker-compose up -d

Run database migrations

cd backend go run cmd/migrate/main.go up

Access the application

Frontend: http://localhost:5173

Backend API: http://localhost:8080

Docs: http://localhost:3000

```

This will start all services in Docker containers.

🚀 VPS Deployment

For deploying to a production VPS with Vault and Caddy:

```bash

Quick deploy

./scripts/deploy-vps.sh

See quick reference

cat DEPLOY_VPS_QUICK.md ```

📖 Complete VPS deployment guide: `docs/VPS_DEPLOYMENT.md`

Development Without Docker

See the complete Development Setup Guide for detailed instructions.

📚 Documentation

Comprehensive documentation is available in the `/docs` directory:

📖 Full documentation index: `docs/index.md`

🏗️ Architecture

Clipper is built as a modern, scalable full-stack application:

``` ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │ Web App │ │ Mobile Apps │ │ Backend API │ │ (React) │─────▶│ (React Native)│─────▶│ (Go/Gin) │ └─────────────┘ └──────────────┘ └───────┬───────┘ │ ┌─────────────────────────┼─────────────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │PostgreSQL│ │ Redis │ │ OpenSearch │ │ (Data) │ │ (Cache) │ │ (Search) │ └──────────┘ └──────────┘ └─────────────┘ ```

  • Frontend: React 19 + TypeScript + Vite + TailwindCSS
  • Mobile: React Native 0.76 + Expo 52
  • Backend: Go 1.24 + Gin + PostgreSQL + Redis
  • Search: OpenSearch 2.11 with hybrid BM25 + vector search
  • Infrastructure: Docker, Kubernetes, GitHub Actions

See Architecture Documentation for details.

🛠️ Tech Stack

Backend

  • Language: Go 1.24+
  • Framework: Gin (HTTP web framework)
  • Database: PostgreSQL 17 with pgx driver
  • Cache: Redis 8 with go-redis
  • Search: OpenSearch 2.11
  • Auth: JWT with Twitch OAuth
  • Queue: Redis-based background jobs

Frontend (Web)

  • Framework: React 19 with TypeScript
  • Build Tool: Vite
  • Styling: TailwindCSS
  • Routing: React Router 7
  • State: TanStack Query + Zustand
  • Forms: React Hook Form

Mobile (iOS/Android)

  • Framework: React Native 0.76
  • Platform: Expo 52 with Expo Router
  • Language: TypeScript (shared types)
  • State: TanStack Query + Zustand

Infrastructure

  • Containers: Docker & Docker Compose
  • Orchestration: Kubernetes (production)
  • CI/CD: GitHub Actions
  • Monitoring: Prometheus + Grafana
  • Secrets: HashiCorp Vault

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for:

  • Code of conduct
  • Development workflow
  • Code style guidelines
  • Testing requirements
  • Pull request process

Quick Contribution Steps

  1. Fork the repository
  2. Create a feature branch (`git checkout -b feature/amazing-feature`)
  3. Make your changes and add tests
  4. Run linters and tests (`make test`)
  5. Commit your changes (`git commit -m 'Add amazing feature'`)
  6. Push to the branch (`git push origin feature/amazing-feature`)
  7. Open a Pull Request

📝 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙏 Acknowledgments

Built with ❤️ by the Subculture Collective

Special thanks to:

  • The Twitch developer community
  • All our contributors
  • Open source projects that make this possible

Status: Active Development | Version: v0.x (Pre-release) | Target: MVP Release Q2 2025

Description
A modern Twitch clip curation platform that allows users to discover, organize, and share their favorite Twitch clips with the community.
Readme MIT 1.6 GiB
Languages
Go 50.5%
TypeScript 43.7%
PLpgSQL 2.4%
Shell 2%
Makefile 0.4%
Other 1%