π The Best Open Source Starter Template π GitHub Pages Simple Forum π«
- Copy
.env.exampleto.envand configure your environment variables - Run
npm install - Run
npm run dev
When you run the application, you'll see helpful information in the browser console:
π¦ Bundle Size: 245.67 KB (12 JS files, 3 CSS files)
π GitHub Forum Platform v0.0.1
Template created by: Semyon Fedoseev
GitHub: https://github.com/fedoseevsm
Contact: Feel free to reach out for questions or contributions!
π‘ This platform is built with React, TypeScript, and Tailwind CSS
Features: GitHub API integration, Markdown support, Mobile responsive
Security: Service Worker token protection, CSP headers
For more details about bundle analysis and performance monitoring, see BUNDLE_INFO.md
This application implements several security measures to protect sensitive data:
- β GitHub access tokens (Personal Access or fine-grained tokens) are stored in environment variables only
- β Service Worker Protection: Tokens are stored in IndexedDB and injected by service worker
- β Network Tab Security: Authorization headers are not visible in DevTools Network tab
- β Tokens are never logged in console output or error messages
- β All error messages are sanitized to prevent token leakage
- β Content Security Policy (CSP) headers prevent unauthorized script execution
- β Server-side security headers (XSS protection, frame options, etc.)
- β Secure Token Storage: GitHub tokens stored in IndexedDB within service worker
- β Request Interception: Service worker intercepts GitHub API calls and adds auth headers
- β Token Isolation: Main app never directly accesses the token after initial setup
- β Automatic Cleanup: Tokens cleared from storage on logout
- β Automatic Detection: Rate limit errors are automatically detected from GitHub API responses
- β User-Friendly Modal: Shows helpful modal with VPN/IP change instructions
- β Multilingual Support: Messages in English and Russian
- β Non-Blocking: Users can continue using the app after acknowledging the modal
- β Secure Logging: Rate limit events are logged without exposing sensitive data
For detailed information about rate limit handling, see RATE_LIMIT_HANDLING.md
Create a .env file based on .env.example:
cp .env.example .envRequired environment variables:
VITE_API_KEY: GitHub Personal Access Token or fine-grained token with repository access (repoorcontentspermissions)
Security best practices:
- Never commit
.envfiles to version control - Rotate tokens regularly
- Use minimum required permissions
- Monitor token usage in GitHub settings
- β Sensitive data is automatically redacted from error logs
- β Safe logging functions prevent accidental token exposure
- β Network errors are sanitized before display to users
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΎΠ² ΠΈ ΡΠΎΠΏΠΈΠΊΠΎΠ² Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ°Π½ΡΠ»ΠΈΡΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ:
- β Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΏΠΈΠΊΠΎΠ² Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅
- β Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΎΠ² Ρ ΡΡΡΡΠΊΠΈΠΌ ΡΠ΅ΠΊΡΡΠΎΠΌ
- β ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΠ°Π½ΡΠ»ΠΈΡΠ΅ΡΠ°ΡΠΈΡ Π½Π°Π·Π²Π°Π½ΠΈΠΉ (ΡΡΡΡΠΊΠΈΠΉ β Π»Π°ΡΠΈΠ½ΠΈΡΠ°)
- β Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΈ ΡΡΠ°Π½ΡΠ»ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ
ΠΡΠΈΠΌΠ΅Ρ:
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ: "ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ?"
Π’ΡΠ°Π½ΡΠ»ΠΈΡΠ΅ΡΠ°ΡΠΈΡ: "kak-ispolzovat-freymuork"
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΎ Π΄Π»Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²:
- β ΠΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π·ΡΠΌΠ° ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ ΡΠ΅ΠΊΡΡΠ°
- β ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ touch targets (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 44px)
- β ΠΠ΄Π°ΠΏΡΠΈΠ²Π½ΡΠ΅ ΡΠΎΡΠΌΡ Π΄Π»Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ ΡΠΊΡΠ°Π½ΠΎΠ²
- β ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΡΡΠΎΠΉΡΡΠ² Ρ Π²ΡΡΠ΅Π·Π°ΠΌΠΈ (notch)
- β Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ iOS Safari ΠΈ Android Chrome
Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ:
- Viewport meta tag Ρ
maximum-scale=1.0ΠΈuser-scalable=no - CSS ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π·ΡΠΌΠ° Π½Π° ΡΠΎΠΊΡΡ
- Font-size 16px Π΄Π»Ρ input ΠΏΠΎΠ»Π΅ΠΉ (iOS Safari requirement)
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅: ΡΠΌ. MOBILE_ADAPTATION.md
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΡΡΠΈΡΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄Π»Ρ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²:
- β ΠΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΡΠΎΠΏΠΈΠΊΠΎΠ² ΠΈ ΠΏΠΎΡΡΠΎΠ²
- β ΠΠΏΡΠΈΠΌΠΈΡΡΠΈΡΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
- β Π£Π»ΡΡΡΠ΅Π½Π½Π°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ UX
- β Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
- ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΎΠΏΠΈΠΊ/ΠΏΠΎΡΡ
- ΠΠ΄Π΅ΠΌ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ²Π΅ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
- ΠΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
- UI ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ Π±Π΅Π· Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅: ΡΠΌ. STATE_OPTIMIZATION.md
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π°Π²Π°ΡΠ°ΡΠΎΠΊ Gravatar:
- β ΠΡΠΎΡΠΌΠΎΡΡ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Ρ
- β ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Gravatar ΠΏΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ (Π½ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ)
- β ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π°Π²Π°ΡΠ°ΡΠΊΠΈ (JPG, PNG, GIF, WebP Π΄ΠΎ 2MB)
- β ΠΠ½ΠΎΠΏΠΊΠ° ΡΠ±ΡΠΎΡΠ° Π°Π²Π°ΡΠ°ΡΠΊΠΈ Π½Π° Gravatar ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
- β ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π°Π²Π°ΡΠ°ΡΠΎΠΊ Π°Π²ΡΠΎΡΠΎΠ² Π² ΡΠΎΠΏΠΈΠΊΠ°Ρ ΠΈ ΠΏΠΎΡΡΠ°Ρ
- β ΠΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠΌΡ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- β ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ GitHub Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ:
- ΠΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π°Π²Π°ΡΠ°ΡΠΊΠ° Gravatar Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ username
- ΠΠ»ΠΈΠΊ Π½Π° ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠ°ΠΏΠΊΠ΅ β ΡΡΡΠ°Π½ΠΈΡΠ° ΠΏΡΠΎΡΠΈΠ»Ρ
/profile - ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π°Π²Π°ΡΠ°ΡΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΈΠΊΠΎΠ½ΠΊΡ ΠΊΠ°ΠΌΠ΅ΡΡ (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ)
- ΠΠ½ΠΎΠΏΠΊΠ° "Reset to Gravatar Avatar" Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ Gravatar
- ΠΠ²Π°ΡΠ°ΡΠΊΠΈ Π°Π²ΡΠΎΡΠΎΠ² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΠΎ Π²ΡΠ΅Ρ ΡΠΎΠΏΠΈΠΊΠ°Ρ ΠΈ ΠΏΠΎΡΡΠ°Ρ
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ (May 2026):
- β¨ ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π²Π°ΡΠ°ΡΠΊΠΈ Gravatar ΠΏΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
- β¨ ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π°Π²Π°ΡΠ°ΡΠΎΠΊ Π°Π²ΡΠΎΡΠΎΠ² Π² ΡΠ΅ΠΌΠ°Ρ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ
- β¨ ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ±ΡΠΎΡΠ° Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ Gravatar ΠΈΠ· ΠΏΡΠΎΡΠΈΠ»Ρ
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅: ΡΠΌ. USER_PROFILE.md
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π½ΡΠΉ Markdown ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΡΠ°ΡΠΈΠ²ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ:
- β ΠΠ°ΡΡΠ΅Ρ Markdown Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠΎΠΉ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ
- β Π Π΅Π΄Π°ΠΊΡΠΎΡ Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°ΠΌΠΈ ΠΈ Π³ΠΎΡΡΡΠΈΠΌΠΈ ΠΊΠ»Π°Π²ΠΈΡΠ°ΠΌΠΈ
- β ΠΠ°Π½Π΅Π»Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- β ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΌΠΎΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
- β ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° GFM (GitHub Flavored Markdown)
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°:
- ΠΠΈΡΠ½ΡΠΉ/ΠΊΡΡΡΠΈΠ²:
**text**,*text*ΠΈΠ»ΠΈ Ctrl+B/Ctrl+I - ΠΠΎΠ΄:
`code`ΠΈΠ»ΠΈ Ctrl+` - Π‘ΡΡΠ»ΠΊΠΈ:
[text](url)ΠΈΠ»ΠΈ Ctrl+K - Π‘ΠΏΠΈΡΠΊΠΈ:
- itemΠΈΠ»ΠΈ Ctrl+Shift+8 - Π¦ΠΈΡΠ°ΡΡ:
> textΠΈΠ»ΠΈ Ctrl+Shift+> - Π’Π°Π±Π»ΠΈΡΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅: ΡΠΌ. MARKDOWN_SUPPORT.md