RosterManager v2 is a lightweight PHP/MySQL roster cut simulator for NFL fan projects.
It is currently published by German Sea Hawkers e.V. and developed by Simon Kell. The app is built around a public Seahawks cutdown simulator, a protected admin backend, direct ESPN roster sync, and link-based sharing with club branding.
- Public 90-to-53 roster simulator
- Team and club branding via
.env - Localized UI: German, English, Spanish, French, Portuguese
- Personalized roster sharing with short links
- Social-preview-ready share pages
- Protected admin backend for player management
- Manual player CRUD
- Direct ESPN import from the admin area
- Automated ESPN import via CLI and cron
- Optional local player image hosting
- PHP 8.2+
- MySQL or MariaDB
- PDO
- Server-rendered PHP views
- Session-based admin authentication
- Small vanilla JavaScript for simulator interactivity
There is no full framework, no frontend build step, and no Node dependency for production.
public/web rootsrc/controllers, core classes, repositories, views, helpersconfig/app, team and branding configurationdatabase/schema and migration helpersdocs/architecture.mdarchitecture overviewdocs/import.mdroster import workflowsscripts/import_roster.pyoptional local ESPN-to-CSV helperscripts/import_espn.phpCLI ESPN sync entrypoint
- Point your web root to
public/. - Create a database and import
database/schema.sql. - Copy
.env.exampleinto your own environment configuration. - Make sure your web server routes requests through
public/index.php. - Ensure PHP can write to
public/uploads/players/if you want local image hosting.
For existing installations, run the relevant migration files in database/ before deploying newer versions.
Most project-specific values come from .env.
Important app settings include:
APP_NAMEAPP_BASE_PATHDB_*ADMIN_USERNAMEADMIN_PASSWORD_HASH
Important team settings include:
TEAM_NAMETEAM_CITYTEAM_SLUGTEAM_ESPN_IDTEAM_COLOR_PRIMARYTEAM_COLOR_SECONDARYTEAM_COLOR_SURFACETEAM_COLOR_SURFACE_ALTTEAM_COLOR_TEXTTEAM_COLOR_INKTEAM_COLOR_MUTEDTEAM_COLOR_LINE
Important club branding settings include:
CLUB_NAMECLUB_LOGO_PATHCLUB_URL
The simulator uses the team layer for NFL/team branding and the club layer for the publishing fan club.
The public simulator lets visitors:
- choose their final 53-man roster
- personalize it with a custom name
- switch between derived palette variants
- create a short share link only when they actively share
The share flow is database-backed:
- the simulator sends the current selection, locale, author name and palette to
POST /share/create - the backend stores or reuses a short token
- share links use
?s=TOKEN - opening the simulator with a share token restores the saved roster and personalization
The share page also exposes Open Graph and Twitter metadata so shared links generate rich previews on social platforms.
The admin backend currently supports:
- login/logout
- player CRUD
- CSV import
- CSV + ZIP import for local headshots
- direct ESPN import from the browser
The player model currently uses:
idnamepositionexperienceweight_kgheight_cmimageordering
ordering is only a manual display-order field. Imports intentionally use spaced values like 10, 20, 30 so later manual adjustments are easier.
There are three practical ways to keep the roster up to date:
This is the easiest workflow.
In the admin area, enter an ESPN team ID such as 26 for the Seahawks and optionally enable local image download. PHP then:
- fetches the ESPN roster API
- normalizes players into the internal model
- syncs by ESPN player ID
- updates existing players
- creates new players
- removes players no longer present in the roster
- preserves manual ordering for existing players
If local image download is enabled, player photos are stored under public/uploads/players/.
You can run the same sync from the command line:
php scripts/import_espn.phpOptional flags:
php scripts/import_espn.php --team-id=26 --download-imagesThis is intended for cron-based offseason syncs.
If you still want a local preprocessing step, the Python helper can build a CSV and optional image ZIP:
python3 scripts/import_roster.py --team-slug seahawks --local-imagesThat workflow is documented in docs/import.md.
php -lis enough for quick PHP syntax checksnode --check public/assets/simulator.jsis useful for a fast JS syntax check- the app can run on classic hosting without Node or Composer-based runtime requirements
- Username:
admin - Development password fallback:
admin123
For production, set your own ADMIN_PASSWORD_HASH and do not rely on the fallback password.
The source code in this repository is licensed under the MIT License and attributed to German Sea Hawkers e.V..
That license does not automatically apply to third-party names, logos, trademarks, player images, or imported external assets. If you publish or redistribute a public instance, make sure you have the necessary rights for all non-code materials.