Skip to content

Eministar/starpaste

Repository files navigation

⭐ StarPaste

Ein moderner, stylischer Paste-Service mit Matrix-UI

Next.js TypeScript Tailwind CSS MySQL


Code teilen, Wissen verbreiten – schnell, sicher und mit Stil.

✨ Features

Feature Beschreibung
🎨 Syntax-Highlighting Serverseitiges Highlighting mit Shiki für 100+ Sprachen
🔐 Discord OAuth Login über Discord mit next-auth – inkl. Profilbild-Integration
📝 Paste-Verwaltung Erstellen, Bearbeiten, Löschen – mit Owner-Schutz für eingeloggte Nutzer
🔢 Zeilennummern Ein-/ausblendbare Zeilennummern im Code-Viewer
📋 Copy / Download / Share Code kopieren, als Datei herunterladen oder Link teilen – alles mit einem Klick
⌨️ Keyboard Shortcuts Ctrl+Enter zum schnellen Erstellen eines Pastes
🔍 Filter & Sortierung Pastes nach Sprache filtern und nach Datum/Beliebtheit sortieren
🛡️ Report-System Pastes melden – mit Moderationsstatus und Admin-Modell
🌐 REST API Versionierte API unter /api/v1 mit Bearer-Token-Auth
🤖 Discord Bot Integration Shared-Secret Endpoints für Account-Resolution und Uploads im Namen eines Discord-Users
📊 Dashboard Persönliches Dashboard mit Stats, Paste-Übersicht und API-Token-Verwaltung
🔔 Toast-Benachrichtigungen Animierte Feedback-Meldungen für alle Aktionen
🌑 Matrix-UI Dunkles, kompaktes Design mit Glow-Effekten und Glassmorphism

🖼️ Vorschau

Homepage Dashboard
Paste-Erstellung mit Live-Preview Stats, Profil & Paste-Verwaltung
Paste-Ansicht API-Docs
Syntax-Highlighting mit Code-Tools Interaktive API-Dokumentation

🚀 Schnellstart

Voraussetzungen

Installation

# Repository klonen
git clone https://github.com/dein-user/starpaste.git
cd starpaste

# Abhängigkeiten installieren
npm install

# Umgebungsvariablen einrichten
cp .env.example .env.local

Konfiguration

Bearbeite .env.local mit deinen Zugangsdaten:

# Datenbank
DATABASE_URL=mysql://user:password@localhost:3306/starpaste

# Auth
NEXTAUTH_URL=http://localhost:3000
AUTH_SECRET=dein-geheimer-schluessel

# Discord OAuth
AUTH_DISCORD_ID=deine-discord-app-id
AUTH_DISCORD_SECRET=dein-discord-app-secret

# Admin (kommagetrennte Discord User IDs)
ADMIN_DISCORD_IDS=123456789,987654321

# Discord Bot Integration
DISCORD_INTEGRATION_SECRET=lange-zufaellige-secret-zeichenkette

Discord OAuth einrichten

Füge im Discord Developer Portal diese Redirect-URIs hinzu:

http://localhost:3000/api/auth/callback/discord

Starten

# Development
npm run dev

# Production
npm run build
npm start

💡 Tipp: StarPaste erstellt die Datenbank und alle Tabellen automatisch beim ersten Start. Schema-Änderungen werden automatisch nachgezogen.

🗄️ Datenbank

StarPaste verwaltet sein Schema vollautomatisch:

  • 🏗️ Datenbank wird automatisch angelegt, falls sie nicht existiert
  • 📐 Fehlende Tabellen, Spalten, Indizes und Foreign Keys werden beim ersten Zugriff erstellt
  • 🔄 Schema-Drift wird regelmäßig geprüft und additive Abweichungen automatisch korrigiert
  • ♻️ Der Schema-Sync ist idempotent und darf auf jedem Request laufen (intern gedrosselt)

Optionales Referenzschema: mysql/schema.sql

🌐 API

Die öffentliche StarPaste API liegt unter /api/v1.

Endpoints

Methode Endpoint Beschreibung
GET /api/v1/pastes Alle öffentlichen Pastes abrufen
POST /api/v1/pastes Neuen Paste erstellen
GET /api/v1/pastes/:id Einzelnen Paste abrufen
PATCH /api/v1/pastes/:id Paste bearbeiten
POST /api/v1/pastes/:id/report Paste melden
POST /api/v1/integrations/discord/accounts/resolve Discord-User einem StarPaste-Account zuordnen
POST /api/v1/integrations/discord/pastes Upload im Namen eines Discord-Users als Paste speichern

Authentifizierung

curl -H "Authorization: Bearer DEIN_API_TOKEN" \
     http://localhost:3000/api/v1/pastes

Discord-Bot-Integrationen nutzen stattdessen ein Shared Secret:

curl -X POST \
  -H "Authorization: Bearer DISCORD_INTEGRATION_SECRET" \
  -H "Content-Type: application/json" \
  http://localhost:3000/api/v1/integrations/discord/accounts/resolve

API-Regeln

  • 🔑 Bearer Token erforderlich (erstelle Tokens im Dashboard nach Discord-Login)
  • 📊 Jeder API-Request wird am Token protokolliert
  • 🌍 language ist optional – bei Code wird sie automatisch erkannt
  • 📄 Bei log und note wird intern immer Plain-Text verwendet
  • 🏷️ API-erstellte Pastes müssen attribution.name und attribution.url enthalten
  • 🔗 Integrationen müssen Powered by StarPaste API sichtbar anzeigen und auf StarPaste verlinken
  • 🤖 Die Discord-Integration legt Accounts per discord_id automatisch an und speichert Uploads direkt im späteren Nutzerkonto

Discord-Bot-Integration

Der Discord-Flow ist für vertrauenswürdige Bots gedacht, die im Auftrag eines Discord-Users hochladen. Wenn sich derselbe User später per Discord-Login anmeldet, sieht er diese Uploads direkt im eigenen Dashboard.

Account auflösen oder anlegen:

curl -X POST http://localhost:3000/api/v1/integrations/discord/accounts/resolve \
  -H "Authorization: Bearer DISCORD_INTEGRATION_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"user":{"id":"123456789012345678","username":"emin","displayName":"emin"}}'

Langen Upload oder Log im Namen des Users speichern:

curl -X POST http://localhost:3000/api/v1/integrations/discord/pastes \
  -H "Authorization: Bearer DISCORD_INTEGRATION_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"user":{"id":"123456789012345678","username":"emin"},"message":{"filename":"latest.log","deleteOriginal":true},"paste":{"content":"[INFO] boot ok\n[ERROR] redis timeout"}}'

Die Response enthält:

  • account mit lokalem User-Mapping und Login-/Dashboard-Links
  • paste mit dem frisch erstellten Paste
  • botActions.deleteOriginal, botActions.pasteUrl und botActions.replyText für den Discord-Bot-Flow

📖 Vollständige API-Dokumentation: /api-docs

🏗️ Tech-Stack

Technologie Verwendung
Next.js 16 React-Framework mit App Router & Turbopack
TypeScript 5 Type-Safety im gesamten Projekt
Tailwind CSS 4 Utility-First Styling
MySQL 8 Relationale Datenbank für Pastes, User & Reports
Shiki Serverseitiges Syntax-Highlighting
next-auth Discord OAuth & Session-Management
Lucide Icon-Library
Zod Schema-Validierung

📁 Projektstruktur

starpaste/
├── src/
│   ├── app/                    # Next.js App Router
│   │   ├── api/                # API Routes (intern + v1)
│   │   ├── dashboard/          # Dashboard-Seite
│   │   ├── paste/[id]/         # Paste-Detailseite
│   │   ├── login/              # Discord Login-Seite
│   │   ├── admin/              # Admin-Bereich
│   │   ├── api-docs/           # API-Dokumentation
│   │   ├── impressum/          # Impressum
│   │   ├── datenschutz/        # Datenschutz
│   │   ├── kontakt/            # Kontakt
│   │   ├── layout.tsx          # Root Layout
│   │   ├── page.tsx            # Homepage
│   │   └── globals.css         # Globale Styles
│   ├── components/             # React-Komponenten
│   │   ├── code-surface.tsx    # Code-Viewer mit Tools
│   │   ├── create-paste-form.tsx
│   │   ├── edit-paste-form.tsx
│   │   ├── select-control.tsx  # Custom Dropdown
│   │   ├── custom-select.tsx   # Filter Dropdown
│   │   ├── paste-filters.tsx   # Filter-Leiste
│   │   ├── toast.tsx           # Toast-System
│   │   └── ...
│   ├── lib/                    # Utilities & Backend-Logik
│   └── types/                  # TypeScript Types
├── mysql/                      # SQL Schema
├── public/                     # Statische Assets
└── next.config.ts              # Next.js Konfiguration

📝 Hinweise

  • Anonymous-Pastes sind absichtlich read-only
  • Accountgebundene Pastes können über die Detailseite bearbeitet werden
  • API-erstellte Pastes werden sichtbar als solche markiert
  • Das Moderationsmodell ist vorbereitet für Admin-Views, Locks und Hidden-Flows
  • Aktuell gibt es keine Rate Limits für die API

📄 Lizenz

Privates Projekt – alle Rechte vorbehalten.


Built with ❤️ and ☕ using Next.js 16

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors