Baobab · User guide

One page, every task.

A walkthrough of what anyone can actually do in Baobab today — founders, school admins, teachers, registrars, platform staff, and parents — task by task, in plain language. What's designed but not yet built is noted right next to the live task it extends, in the same how-to voice, so it can double as the brief for what gets implemented next — see What's still coming for the full list in one place.

—

Two ideas worth knowing before the rest

Every school is its own address

Each school lives at its own web address (yourschool.baobab-schools.com) and its data never mixes with any other school's. Your account can belong to more than one school at once, each with its own separate access — signing in doesn't pick one for you, see Choose a school.

There are no job titles — only granted abilities

Nobody is "an admin" or "a teacher" as a stored fact. Each of six abilities — settings, staff & permissions, academic management, managing students, viewing students, entering grades — is switched on for a specific person individually, at school-wide reach or narrowed to one classroom or one student, by someone who already holds that same ability. "Grant or revoke a specific permission" below is literally how every other role-shaped task in this guide actually gets built.

A person (one Clerk account) one ability e.g. grades:manage a scope whole school, one classroom, or one student
One grant = one person + one ability + one scope. No fixed bundle of abilities behind a title.

The trail at the top of every page

Every page below the dashboard starts with a trail of its ancestors — e.g. Dashboard › Academic › School years › 2026-2027 › Primary 6A › Grades. Each step is a link, so from deep inside a classroom's grade sheet you reach any level above it in one click instead of backing out a page at a time.

01

Getting started

#

Create an account

Live

baobab-schools.com → Sign up

  1. From the apex site or any school's subdomain, choose Sign up.
  2. Sign up with email + password (Clerk-hosted) — open to anyone, no invite needed.

An account by itself grants zero access to any school's data. Access only starts once you join or create one — see below.

#

Sign in

Live

/sign-in

  1. Sign in with your email + password.
  2. You land on /dashboard — if that's not a specific school's own address, or none of your schools match it, you're sent to /choose-school instead.

To sign out later: open the account menu, top-right of any signed-in page. You always land back on the main Baobab site, not whichever school's address you were on.

#

Choose a school

Live

/choose-school

  1. See every school you belong to, listed plainly — even if it's just one, so you always know what you have access to.
  2. Search for another school by name from the same page; a match you already belong to opens straight to its dashboard, a match you don't belong to sends you to request access.
#

Find your school / request to join

Live

/onboarding

  1. Search schools by name.
  2. Send a request to join, with an optional note for context (e.g. "I'm the new math teacher") — this is context only, not a claimed role.
  3. Wait for a staff member at that school to approve it.

The "create a new school" option only appears here for someone who already holds the dedicated permission to create schools — see Creating a school.

#

Track your join request

Live

/onboarding → Your requests

  1. After requesting to join a school, see it listed on your own Find your school page — pending, approved, or rejected — instead of just waiting silently.
02

Creating & setting up a school

#

Create a school

Live permission: schools:create

baobab-schools.com/onboarding → /schools/new

  1. From the main site (not a school's own address — this only works there), open Find your school and choose create a new school. Only visible if you hold the schools:create permission.
  2. Fill in the school's name and country. A web address is suggested from the name — pick your own if you'd rather.
  3. Optionally add an address: a plain-language landmark description works better here than a formal street address, plus a city/postal code and a map pin you place yourself.
  4. Optionally set a student ID format — a short prefix and how many digits (e.g. STU-00001).
  5. Optionally start your level catalog (Grade 1, Form 3, whatever your system calls them) from one of 19 ready-made regional presets, or start blank and add levels later.
  6. Submit — you land straight on your new school's own dashboard, with full access to it.

This isn't open to every signed-in user. Creating a school requires a dedicated permission that a platform administrator grants — ask one if you don't see the option.

#

Update school settings

Livepermission: staff:manage_access

/dashboard/settings

  1. Edit the school's address (landmark description, city, postal code, map pin) any time after creation.
  2. Switch the parent & guardian portal on or off.

These two are all that a school edits about itself. Its name, country, currency, student ID format, term structure and grading scale are managed by Baobab — changing them after a year has started re-labels amounts and marks that were already issued, so ask support. The school's web address (its subdomain) can't be changed by anyone: renaming it would break every bookmark and login link pointing at it, so get it right at creation.

#

Rename a school or change its country

LiveBaobab support

/platform/schools/[id]/settings → General

  1. Ask Baobab support to correct the school's name or country. A platform administrator edits it; the school cannot.

The web address (subdomain) still isn't editable by anyone — see the note above.

#

Edit grading scale & calendar

LiveBaobab support

/platform/schools/[id]/settings

  1. Ask Baobab support to adjust what the school marks out of, its pass mark, how many decimals a bulletin prints, and the appreciations printed beside a mark.
  2. Term structure (semesters or trimesters) is changed the same way.

Not editable by the school on purpose: the grading scale moves every mark, term result, bulletin and published parent-portal figure at once.

03

Staff & permissions

Anyone holding staff:manage_access at a school can do everything below — bring someone in, let them go, and shape exactly what they can touch.

#

Review join requests

Livepermission: staff:manage_access

/dashboard/requests

  1. See everyone currently asking to join your school, with their note if they left one.
  2. Approve, picking a starting access level — Full access, Manage academic + students, View students only, or grant nothing yet — or reject.

The preset is just a starting point. Fine-tune exactly what someone can do afterward on the permissions page below.

#

View and remove staff

Livepermission: staff:manage_access

/dashboard/staff

  1. See everyone with access to your school.
  2. Remove someone's access — this is reversible; if they rejoin later, permissions can be re-granted.

"Manage permissions" next to a specific person jumps straight to the permissions page with that person already selected — you don't need to re-find them in the list there.

#

Grant or revoke a specific permission

Livepermission: staff:manage_access

/dashboard/staff/permissions

  1. Pick a person and exactly what they can do — staff & permissions, academic management, managing students, viewing students, fees, treasury, payroll, or grades.
  2. Apply it school-wide, or scope it to just one classroom or one student.
  3. Revoke it later the same way.

There's no fixed title like "admin" or "teacher" here — every ability is its own switch, and you can never hand out more than you hold yourself.

#

Grant grading access per course

Live

/dashboard/staff/permissions → Manage gradable items & grades → Course

  1. When granting grade-entry access, the scope picker offers Course alongside Classroom and Student — choose a specific course within a classroom instead of the whole classroom.

Course scoping is only offered for grade-entry access — every other permission still scopes to a Classroom or Student.

04

Students

Set this up before placing anyone into a classroom (Academic structure) or grading them (Grades) — both assume the student already exists here.

#

Add a student

Livepermission: students:manage

/dashboard/students → New

  • optional Student ID (auto-filled)
  • First name
  • optional Middle name
  • Last name
  • Date of birth
  • optional Guardian name
  • optional Guardian email
  • optional Guardian phone

Guardian email is optional, but a student without one is flagged on the roster — without it, that family can't use the parent portal below. This same form also opens from a classroom's roster (see Add a classroom, place students, assign teachers) when a search there turns up no match — finishing it there lands you back on that roster, ready to enroll the student you just created.

#

Search, edit, archive a student

Livepermission: students:manage / students:view

/dashboard/students

  1. Search and browse the active roster; view-only access can look but not edit.
  2. Edit any student's details, including guardian contact info.
  3. Archive a student who's left — this hides them from the active list without deleting their record, and can be undone.
#

Browse and restore archived students

Livepermission: students:manage / students:view

/dashboard/students → Show archived students

  1. From the student list, choose Show archived students to switch to a view of everyone who's been archived, with the same search and pagination as the active roster.
  2. Restore one back onto the active roster; view-only access can browse but not restore.
#

Notify on a guardian email change

PlannedHighest risk
  1. Change a student's guardian email in Students, same as today.
  2. Both the old and new address get an automatic notice, and the change is logged with who made it and when.

Right now this changes who can see a child's grades with no confirmation step and no trace — the single highest real-world risk flagged in this design (custody disputes, estranged relatives, staff error).

05

Academic structure

#

Work with the current school year's classrooms

Livepermission: academic:manage

/dashboard/academic

  1. Open Academic Management from the dashboard — you land straight on this year's classroom list, nothing to pick first.
  2. Open any classroom to see and manage it.
#

Add a classroom, place students, assign teachers

Livepermission: academic:manage

Academic → a classroom

  1. Create a classroom under the current year (an "Add a classroom" button sits right on the Academic hub, alongside course management, whether or not the year has any classrooms yet) and give it a level (e.g. "Grade 6").
  2. Open its Students tab to place students into it for the year. Searching there finds any student not yet enrolled this year; if there's no match, "create student" takes you to Add a student and back again once saved.
  3. Open its Teachers tab to assign a staff member to a course for a given term.

Assigning someone as a classroom's teacher is a roster note, not a permission by itself — they still need grade-entry access granted separately (see Staff & permissions).

#

Maintain the course & level catalogs

Livepermission: academic:manage

/dashboard/academic/courses · Academic → Manage levels (/dashboard/academic/levels)

  1. Keep one reusable list of subjects for the school, and choose which are offered in each classroom.
  2. Keep one list of levels (Grade 1, Form 3, …), each with a position that later suggests promotion order — added from the same 19-preset regional list, not typed freehand (you can rename or reorder one you've added). Levels live under Academic → Year setup, alongside school years and courses.
#

Set up a school year and terms

Livepermission: academic:manage

Academic → School year administration → /dashboard/academic/years

  1. Create a school year with a label and start/end dates, and mark one as current.
  2. Define its terms (e.g. Term 1, Term 2), which grading is organized around.

Deliberately tucked away from the everyday flow above — this is a once-a-year setup task, not something you should need to think about while doing day-to-day academic work.

#

Start a new school year (rollover & promotion)

Plannedlargest remaining domain gap
  1. From Academic → School year administration, choose Start new school year.
  2. Confirm next year's classrooms — suggested automatically from each level's order (Grade 6 → Grade 7), reading each school's promotion rules (currently unconfigured for every school — a rule-setting step likely needs to come before this ever ships).
  3. Review the auto-mapped list of which student goes to which new classroom; override any individual student to repeat a level, withdraw, or move somewhere else — including a classroom whose level has no defined successor, which needs an explicit "hold here" fallback rather than silently failing.
  4. Confirm — the outgoing year's enrollments are each marked promoted, repeated, or withdrawn and the year becomes read-only; the new year becomes current. Its gradable items and scores stay attached to the old year/classroom, still visible in read-only history and still counted correctly by the parent portal for as long as it was the current year.

Placing students into the current year already works today (Enrollment). What's missing is specifically carrying that forward into a new one without redoing it by hand — plus deciding whether this reversible (an undo before staff or parents have acted on the new placements) or a one-way confirmation, since it touches every student in the school at once.

06

Grades

#

See your own classes from the dashboard

Livepermission: grades:manage

/dashboard/my-classes

  1. Sign in — if you hold grade-entry access but not full academic management, the dashboard shows a My classes card instead of (or alongside) Academic Management.
  2. Open it to see every classroom you can grade in the current school year, regardless of whether your access was granted school-wide or to that one classroom specifically.
  3. Click a classroom to go straight to its grade-entry page — no detour through the rest of academic management.

Before this existed, someone granted only grade-entry access saw no dashboard cards at all — nothing pointed them to their classroom's grades page except a direct link someone handed them. This doesn't yet filter by which course you were assigned to teach (see Grant grading access per course) — it shows every classroom your grant covers.

#

Set up gradable items

Livepermission: grades:manage or academic:manage

Classroom → Manage grades

  1. Open a classroom's Manage grades page — reachable even by someone who holds only grade-entry access, not full academic management.
  2. Add a gradable item for a course and term — a quiz, homework, or exam — with a name, a weight, and its own max score.
#

Enter and edit scores

Livepermission: grades:manage or academic:manage

Classroom → Manage grades

  1. Enter each student's score for a gradable item in the grid.
  2. Leave a cell blank for "not graded yet."
  3. Watch each student's weighted average update live — the exact number a guardian will later see for that course.

A blank cell means "not graded yet" — use the status dropdown next to each score to mark a genuinely missed assessment instead. See Mark a grade absent or excused.

#

Mark a grade absent or excused

Live

Classroom → Manage grades

  1. In the grade-entry grid, each score has a status dropdown next to it — mark a cell Absent or Excused instead of leaving it blank (this also disables and clears that cell's score field).
  2. Absent counts against the average the way a genuine zero would; Excused is left out of it, the way "not graded yet" is.
07

Parent & guardian portal

The one part of Baobab a family uses directly — no sign-up, no password, nothing to remember beyond a student ID. Still just one school's feature, same as everything else on this list — it's platform administration below that's the one part of Baobab that actually spans every school at once.

Student ID + date of birth Match check same reply either way Emailed one-time code 1-hour session read-only this student only on match only guardian enters code
No account needed — a guardian's path from student ID to a temporary, read-only grades view.
#

Look up a child's grades

Liveno account needed

{your-school}.baobab-schools.com/parent-portal

  1. Enter the student's ID number and date of birth.
  2. If it matches, a one-time code is emailed to the guardian address on file — enter it to continue.
  3. See the student's name and classroom, and each course's grade for the current school year, for one hour.

The lookup gives the same reply whether or not it matched, so it can't be used to guess whether a given ID exists. A match also requires the student to be placed in a classroom for the current school year and to have a guardian email on file — if a family's email is out of date or missing, or the student hasn't been placed yet, ask the school to fix it (see Students and Academic structure above).

#

Bot protection on the parent lookup form

Planned
  1. A guardian completes a simple human-verification step before the lookup form submits.
#

Alert staff on repeated failed lookups

Planned
  1. After several failed attempts against one student, whoever manages staff access at that school gets notified — not just a silent lockout.
#

Turn the parent portal off per school

Livepermission: staff:manage_access

/dashboard/settings → Parent & guardian portal

  1. From School Settings, switch the parent portal off entirely for schools that aren't ready for email-based access yet — visiting it then shows the same not-found page as an unrecognized address, with no separate messaging.
#

SMS delivery for the access code

Planned
  1. Choose SMS instead of email for the one-time code, where email isn't reliable for a family.
08

Platform administration

For the small team operating Baobab itself across every school, not for school staff — the one part of this guide that isn't scoped to a single school.

#

View and inspect schools

Liveplatform-wide staff:manage_access

/platform/schools · /platform/schools/[id]

  1. See every school on the platform — name, address, country, and staff count.
  2. Open one to see its staff roster and pending join requests. Read-only for now — no changes from here yet.
#

Grant platform-wide permissions

Liveplatform-wide staff:manage_access

/platform/permissions

  1. Grant or revoke any permission — including the ability to create new schools — across every school at once, for a trusted person.

You'll need the person's Clerk user ID (found in the Clerk dashboard) — there's no name search here yet. The very first platform administrator is set up by whoever runs the server, once; every admin after that is added by an existing one through this page. This is the single highest-blast-radius action in Baobab — it reaches every school at once — so treat that Clerk user ID lookup as a deliberate speed bump, not just friction to route around.

#

Platform admin write actions

Planned
  1. Edit a school's settings or force a permission change directly from the platform view, with every change logged.

Held back deliberately until that logging exists — these actions bypass a school's own admin controls.

—

What's still coming, at a glance

Every planned item above lives right next to the live task it extends, so its "why" and its workaround are in context. This is just a flat index of the same items, grouped by area, for a quick "what's left to build" scan.