Attendance Delivery Decision
Two Approaches to Replacing the Roster System
June 2026  ·  Pharos Resources  ·  Both options running locally
The Java/GWT Roster application is end-of-life. Two replacement approaches were built during this AI-assisted development exploration: a standalone Laravel app (Present) that runs as a separate server, and an attendance module integrated directly into Pharos360 using the same raw PHP patterns the existing codebase uses. Both connect to live Pharos360 data. Both are running right now. This page compares them honestly.
Option A
Present
Standalone Laravel app · runs at present.aidemo.pharos360.com
  • Complete and working today — all core features built
  • Modern MVC architecture (Laravel 11, Blade templates)
  • Single sign-on via shared Pharos360 session
  • Clean separation — can be updated independently of Pharos360
  • Requires a separate server per client — new infrastructure and hosting cost for every deployment
  • Laravel is unfamiliar to the current team — new framework to learn and maintain
  • Two parallel deployments — Pharos360 updates and Present updates are separate tracks
Feature complete
Open Present
Option B
Integrated into Pharos360
Built into the existing app · runs at p360.aidemo.pharos360.com
  • No new server per client — ships as part of Pharos360
  • Same raw PHP patterns the team already knows
  • Shared auth, session, and database — no bridging required
  • Per-client feature flag — pharos.maintenance enables it through Settings
  • Core features working: Take Attendance, Learn Names, History, Export, Event Types
  • ! Built in a single AI-assisted session — needs full developer review before production
  • ! Email notification endpoints not yet wired up
  • No test suite — same risk that applies to all Pharos360 changes
Core complete · needs review
Open Pharos360
Side-by-Side Comparison
Factor Option A — Present Option B — Integrated
Infrastructure per client New server required None — part of Pharos360
Hosting cost Added cost per client No change
Time to enable for a client Deploy, configure, provision server Toggle a setting in pharos.maintenance
Team familiarity New framework (Laravel) Same PHP codebase
Feature completeness today Complete Core complete; email notifications missing
Production readiness Needs test suite + security review Needs developer review + test suite
Ongoing maintenance Two separate systems One system
Rollout control All-or-nothing per deployment Per-client toggle, can be disabled live
Risk if something breaks Isolated from Pharos360 Inside Pharos360 — broader blast radius
Technical Detail

Option A — What was built

Present is a complete Laravel 11 application. Authentication piggybacks on Pharos360's PHPSESSID cookie — if a user is logged into Pharos360, Present reads their session and logs them in automatically. Courses, students, and photos come from the shared PostgreSQL database. Attendance data is stored in the roster_* tables.

The Laravel app has controllers, Blade views, Eloquent models, and middleware — standard Laravel MVC. It is clean, readable, and well-structured. The cost is that the team would need to learn and maintain Laravel, and every client deployment requires a second server running PHP-FPM.

Option B — What was built

The integrated module adds seven new PHP pages to Pharos360's site/ directory, five helper functions to classes/queries.php, and small edits to three existing files (partials/userland.php, settings.php, login.php). No new tables — it uses the same roster_* tables Present uses. No new server, no new framework, no new deployment process.

The feature flag: has_attendance is a boolean in site_configuration_settings. When false, all attendance pages redirect to home and the nav link is hidden. Pharos360 looks and behaves exactly as it did before. When pharos.maintenance enables it through Settings, faculty immediately see the Attendance link in the top nav.

What Option B does not yet have

Auth and session — both options

Faculty access attendance the same way in both options: they log into Pharos360 and click Attendance in the top navigation. Option A takes them to the standalone Present app (via roster.php redirect). Option B takes them to attendance_courses.php inside Pharos360. The nav entry point is identical; the destination differs.

In a client deployment, only one option would be active at a time: roster_url set → Option A; has_attendance enabled → Option B.

Database

Both options use the same roster_* tables in the shared PostgreSQL database. If a client were to switch from Option A to Option B (or vice versa), no data migration would be needed.

What Neither Option Has Yet

Both approaches were built against fake data in a local Docker environment. Neither is production-ready without:

Option B carries a higher modification risk than Option A — it adds code inside a live production PHP application. A bug in a new page is isolated; a bug in a shared helper function in queries.php is not. Developer review before production is not optional.
Assessment

If the decision is purely operational

Option B wins on every operational dimension — no new infrastructure, one deployment to maintain, per-client toggle, same team skills. The missing email notifications are a few hours of work. The developer review is the same work that would be required for any new Pharos360 feature.

If the decision is about code quality and architecture

Option A is cleaner. Laravel enforces separation of concerns, the codebase is testable by design, and bugs stay isolated from Pharos360. For a team willing to invest in learning Laravel and provisioning per-client infrastructure, it is the more defensible long-term choice.

What AI-assisted development revealed

Option B was built — seven pages, five helper functions, the feature flag, the nav wiring, and the database write — in a single afternoon session. The Pharos360 PHP patterns are simple enough that an AI can produce working code quickly. Option A took longer to rewrite (it replaced a full Java application) but ended up more structured.

The comparison is not "which one is better code" but "what trade-off fits the team and the clients." Both are real, running, and usable today.

The practical path forward: Option B can be production-ready faster and with less ongoing cost, provided a developer reviews the new code before it touches real data. Option A is the right choice if the team is prepared to own Laravel and per-client servers as a permanent part of the support model.
Try Both Right Now

Both options are running in Docker on this machine. Use the flows below to see each one.

Option A

Present — Standalone App

  1. 1 Log into Pharos360 as pharos.maintenance / Maintenance! → Settings → disable Attendance
  2. 2 Use Test User Accounts to become judy.fakey
  3. 3 Click Attendance in the top nav bar
  4. 4 Select a course → Take Attendance → click student cards to mark status
Option B

Integrated — Pharos360 Attendance

  1. 1 Log into Pharos360 as pharos.maintenance / Maintenance! → Settings → enable Attendance
  2. 2 Use Test User Accounts to become judy.fakey
  3. 3 Click Attendance in the top nav bar
  4. 4 Select a course → same workflow as Present, inside Pharos360
  5. 5 Bonus: try the AI Assistant in Manage Attendance

The feature flag can be toggled off at any time to restore the original Pharos360 experience.