A self-hosted FFXIV feedback survey application built with Rust and Actix-web. Collect anonymous or identified performance feedback from party members with spam protection, Discord notifications, and a password-protected admin panel.
- Star Ratings: 5-category performance ratings (Mechanics, Damage, Teamwork, Communication, Overall)
- Spam Protection: IP-based rate limiting (configurable window)
- Anonymous Submissions: Optional anonymous feedback
- Character Tracking: Track player names, servers, jobs, and content type
- Admin Panel: Password-protected feedback management with live filtering and deletion
- Discord Notifications: Send formatted feedback summaries to Discord webhooks
- Fully Configurable: Environment variables for all settings, easy multi-instance deployment
- Rust 1.70+ (Install Rust)
- Basic command line knowledge
git clone https://github.com/lunarised/FinalFeedback.git
cd FinalFeedback
cargo build --releasecp .env.example .envEdit .env with your settings. Important: Values with spaces must be quoted!
# Server Configuration
HOST=127.0.0.1
PORT=8080
DATABASE_PATH=feedback.db
# Security - CHANGE THIS!
ADMIN_PASSWORD=your_secure_password_here
# Rate Limiting (minutes between submissions per IP)
RATE_LIMIT_MINUTES=30
# Player Configuration - MUST USE QUOTES FOR SPACES
PLAYER_NAME="Your Character Name"
PLAYER_SERVER=YourServer
PLAYER_DATACENTER=YourDatacenter
# Images (optional)
BANNER_IMAGE=/assets/banner.webp
PROFILE_IMAGE=/assets/profile.webp
# Tagline (optional)
TAGLINE="Ran content with me? Let me know how I did!"
# Discord (optional)
DISCORD_WEBHOOK_URL=cargo run --releaseAccess the feedback form at http://localhost:8080
Access the admin panel at http://localhost:8080/admin/panel (use your ADMIN_PASSWORD)
Values with spaces MUST be quoted:
CORRECT:
PLAYER_NAME="Violet Aerithil"
WRONG - Will fail:
PLAYER_NAME=Violet AerithilHOST: Bind address (default:127.0.0.1)PORT: Port number (default:8080)
DATABASE_PATH: SQLite file path (default:feedback.db)- Auto-created if doesn't exist
- Can be relative or absolute path
ADMIN_PASSWORD: Admin panel password- CRITICAL: Change from default in production!
- Use strong random password
RATE_LIMIT_MINUTES: Time window for spam protection (default:30)- Example:
RATE_LIMIT_MINUTES=60= 1 submission per hour per IP
- Example:
PLAYER_NAME: Character name (quote if spaces)PLAYER_SERVER: Server namePLAYER_DATACENTER: Datacenter name
BANNER_IMAGE: Banner image path (default:/assets/banner.webp)PROFILE_IMAGE: Profile picture path (default:/assets/profile.webp)
TAGLINE: Custom subtitle on the feedback form (default:"Ran content with me? Let me know how I did!")- Can be any text to encourage feedback
DISCORD_WEBHOOK_URL: Discord webhook URL for notifications- Leave empty to disable