Sports management & prediction platform · Version 1.0
The system has two halves. The public site needs no sign-in: fixtures, results, the league table, teams, players, photos, news and the prediction page. The back office is where the work is done and needs an account.
/login.0791525931, no country code — and your password.These are created by the seed data so each role can be tried out. Type
the number exactly as shown. The password for every one of them is
password.
| Phone (type this) | Password | Name | Role |
|---|---|---|---|
0700000001 | password | Brian | Super Admin |
0700000002 | password | Dr. Harriet Malaika | Super Admin |
0700000003 | password | Michael Wandeba | Tournament Admin |
0700000004 | password | Finance Officer | Finance Officer |
0700000005 | password | Match Official | Match Official |
0700000006 | password | Team Manager | Team Manager |
0700000007 | password | Content Editor | Content Editor |
0791525931 | password | Sample Punter | Punter |
0700000001; the system stores
+256700000001. It accepts the number in any of the four
forms people write it — 0700000001,
700000001, 256700000001 or
+256700000001 — and converts it before looking anything
up, so it does not matter which you use.
After signing in you land on the Dashboard. It shows only the tiles your role is allowed to act on, and each tile is a link to the screen that clears it. The menu down the left side works the same way — if you cannot see a section, your role does not have it.
| Role | Can do | Cannot do |
|---|---|---|
| Super Admin | Everything, including amending a confirmed result, managing users and changing settings. | Edit or delete the audit log. Nobody can. |
| Tournament Admin | Teams, players, squad approvals, tournament structure, fixtures, results and confirmation, prediction events. | Approve payouts. Change system settings. |
| Finance Officer | Match payments to slips, approve and release payouts, run financial reports. | Confirm results — and cannot approve a payout on a slip whose result they confirmed. |
| Match Official | Enter the result and match events for fixtures they are assigned to. | Confirm their own result. An admin does that. |
| Team Manager | Submit and edit their own team's squad. | Approve their own squad, or touch another team's. |
| Content Editor | Albums, photos, news posts, static pages. | Anything to do with fixtures, results or money. |
| Punter | Submit predictions, check their slips, set their own stake limits, self-exclude. | See any part of the back office. |
Tournament Admin Super Admin
Go to Teams. A team needs a name and a district; everything else — crest, colours, home ground, chairman and coach contacts — can be filled in later.
name. Optional:
short_name, abbreviation,
district, sub_county, village,
home_ground, founded_year,
chairman_name, chairman_phone,
coach_name, coach_phone.A sample file is in the project at
database/samples/teams-sample.csv.
Teams are archived, never deleted. An archived team disappears from the lists but stays attached to every result it ever played, so old tables and statistics do not break.
Tournament Admin On Players, add a first name and surname. A photograph, date of birth, village and identification are all optional but each one makes an eligibility dispute easier to settle later.
Photographs are re-saved by the system, which removes any location data the phone attached to them. Minimum size is 300×300 pixels.
A squad is a team's list of players for one season. Shirt numbers are unique within a squad.
After the season's squad cut-off date, no new players can be added except by a Super Admin — and that override is written to the audit log.
If you register a player whose identification number already exists, the system refuses and names the existing player. If the name and date of birth match someone already registered, you get a warning but can continue — two cousins in one village genuinely can share both.
Tournament Admin Super Admin
The structure is four levels deep:
| Tournament | The competition itself — "The Villagers Tournament". |
|---|---|
| Season | One running of it — "2026". Only one season is current at a time. |
| Stage | A phase within the season: a league, a group stage, or a knockout. |
| Group | Group A, Group B… inside a group stage. Each produces its own table. |
96 teams do not divide evenly into a bracket. The Knockout planner on the Tournament screen works it out for you: enter the number of teams and it shows the bracket size, how many teams receive a bye, and every round that follows.
For 96 teams: 32 receive byes, 64 play a preliminary round to reduce to 32, and those 32 plus the 32 byes make the Round of 64 — then 32, 16, quarter-finals, semi-finals and the final.
The draw is made with a seed number. That means the same seed always produces the same pairings, so if anyone questions the draw you can re-run it in front of them and show that it comes out identically. The seed and the resulting pairings are written to the audit log. You can preview a draw before saving it, and optionally keep teams from the same district apart in the first round.
Tournament Admin
One at a time on the Fixtures screen, or generate a whole stage at once. Generation always shows you a preview first — nothing is saved until you confirm it.
For a league or group stage the generator produces a full round-robin, alternating home advantage so no team is away every week. For a knockout it makes the draw.
If a team is already playing within 24 hours of the kick-off you are setting, or the venue is booked within three hours, you get a warning. It does not stop you — a double-header at one ground is sometimes deliberate.
Assign a referee, assistants and a commissioner to each fixture. An official sees only the fixtures they are assigned to, and can only file a result for those.
Both ask for a reason. The original kick-off is kept in the record. Both teams and every punter holding a slip on that fixture are sent an SMS.
Match Official Open Enter a result on your phone.
If the goals you listed do not add up to the score you entered, the system says so before sending — correct one or the other.
Tournament Admin Open Results. Everything waiting is listed with its score. Check it, then press Confirm.
An admin who enters a result directly confirms it in the same step, since the admin is the confirming authority.
Super Admin only, and a written reason is required. The table, the bracket and the settlement are all recalculated from the corrected score.
A walkover is recorded against whichever team is awarded it, with a reason, and scores 3–0 by default. An abandoned match records the minute and the decision — replay, award, or void. Either way, predictions on that fixture are voided.
The table is never typed. Every figure is calculated from confirmed results, and there is no screen anywhere in the system that lets anyone edit it directly.
Teams level on points are separated in this order:
That order is configurable per stage.
A deduction is applied to a team's registration with a reason. The table shows the earned points and the deduction separately, with a footnote — so the public can see both what was earned and what was taken away.
Tournament Admin On Prediction events:
On /prediction they type how many goals each team will
score, give their name and Mobile Money number, confirm they are 18 or
older, and submit. They immediately get a reference like
TVS-4KX9-2026, on screen and by SMS.
If money is switched on, the slip stays pending payment until the money is matched to it. The punter sends the stake to the merchant number quoting that reference.
By default a slip wins only if every score it predicted is exactly right. Two alternatives can be chosen per event: one correct score is enough, or a points system where an exact score scores more than a correct outcome.
If a listed fixture is postponed or abandoned, that fixture is voided. The event decides what happens next: void the whole slip and return the stake, or grade the fixtures that were played.
Events close on their own at the closing time, and any slip still unpaid at that moment expires. Settlement runs by itself once the last fixture in the event has a confirmed result. Every punter gets an SMS with their outcome, and winners appear on the public leaderboard by first name and a masked phone number.
Each event has a ceiling on what it could be asked to pay out. As slips come in, the Exposure button shows how close you are. Once the ceiling is reached the system refuses new slips rather than accepting a liability the organisation cannot cover.
Finance Officer
Reconciliation lists every slip waiting for payment. When a Mobile Money transfer arrives, find the slip by its reference or the punter's number, type the MoMo transaction reference into the row, and press Confirm. The slip goes live and the punter is sent an SMS.
No payout is ever automatic. A winning slip creates an entry in the Payout queue and waits there.
The top of the Reconciliation screen shows the day's totals: slips taken, money staked, money paid out, and live exposure. The Dashboard shows Ledger balanced.
Content Editor Tournament Admin
Photos are shrunk on your device before sending, which matters a great deal on a slow connection, and are re-saved on the server. Thumbnails are made in the background, so a photo may take a few seconds to appear.
Deleting a photo is reversible for 30 days before it is permanently removed.
Tagging a photo with a player makes it appear on that player's profile. A player under 18 without recorded guardian consent cannot be tagged.
Posts can be drafted, scheduled and published; a scheduled post goes live on its own. The Rules and Responsible Play pages carry a version number and an effective date, so a change to the rules is dated and visible rather than silent.
On Reports, pick one and press Run to see it on screen, or Download CSV to open it in Excel.
| Teams / players per district | Coverage across the six districts. |
|---|---|
| Squad list | Every registered player with shirt number and eligibility. |
| Fixtures / results | The full schedule or every confirmed result. |
| Top scorers | The goal chart. |
| Prediction revenue | Per event: slips, staked, won, paid out, margin. |
| Payouts | Every payout, its status and who approved it. |
| Daily reconciliation | The figures the Finance Officer signs off each day. |
Every meaningful change is recorded: who did it, what their role was, when, from which address, and what the values were before and after. You can filter by action or date.
The audit log cannot be edited or deleted by anyone, including a Super Admin. That is deliberate: a record that the most powerful user can rewrite is not evidence of anything.
Super Admin
Settings holds the values you may want to change without a developer: the prediction cut-off, the grading rule, the cap on slips per punter, the threshold above which a payout needs two approvers, and the master switch for staked predictions.
Anything not set here falls back to the shipped default, which is shown on the same screen for reference.
| What you see | What it means |
|---|---|
| The site has no styling — plain text and blue links. | The compiled stylesheet is not loading. Ask the developer to run
npm run build and delete public/hot. |
| "Your session expired. Refresh the page and try again." | You were signed in for too long. Reload and sign in again. |
| "The connection is slow. Check your network and try again." | The request did not reach the server. Nothing was saved — try again when you have signal. |
| "You do not have permission to do that." | Your role does not include that action. See section 2. |
| "This account is locked after too many failed attempts." | Five wrong passwords. A Super Admin can unlock it. |
| Signing in appears to work but returns you to the login page. | The password was right — the browser was not given a session.
The address you are using is missing from
SANCTUM_STATEFUL_DOMAINS in .env. Add
it, including the port, and restart. The login page now says
this outright rather than looking like a wrong password. |
| A punter says they paid but their slip is still pending. | The payment has not been matched yet. Find the slip on Reconciliation and confirm it with the MoMo reference. |
| The table has not updated after a match. | The result has been entered but not confirmed. Check the Results screen. |
| "Ledger balanced: NO" | Stop taking payments and report it immediately. |
Tournament and fixture questions: the Tournament Admin. Money questions: the Finance Officer. Anything the system itself is doing wrong: the developer, quoting what you were doing and the exact message on screen.