Class Hosting Guide
How to host your own class
A "class" is your own private trial group. You set the questions, decide who gets in, and see how everyone did. No admin approval needed — you own everything under /me/.
How to build your own class, invite members, and let them try the exams you set up.
1What is a "class" here?
A quick map of the pieces before you touch anything.
You are the owner
Every category, topic, question, and test you create is tagged with your user id. Only you can edit them. Public exams (SAT, CSAT, Gaokao, …) stay separate.
A "class" == an invite link
There is no separate "class" table. A class is a test you built + the invite link you handed out. Anyone with the link can attempt — logged in or as a guest.
You see everyone's attempts
Whenever a member submits, you get an entry under "People who took my tests" with their score, time spent, and per-question breakdown.
Why is it modelled this way?
Fewer moving parts. You already have categories and tests — the invite link is the only new concept. No need to manage member rosters, roles, or approvals.
2Sign in and open your workspace
Everything owner-side lives under /me/. The hamburger dropdown on the top right is your entry point.
Sign in from the landing page
Click "Sign in" on the top-right. Email + password or Google works. If Google is enabled on this instance, the button appears in the login modal.
Open the hamburger menu
Once signed in, the top-right button turns into ☰. Click it to see two sections: "My workspace" (dashboard, question bank, tests, AI tools) and "Records" (results, takers).
The dashboard is your daily start
Cards for category / question / test / attempt counts, plus a "recent results" feed. If the takers card climbs, that means new attempts came in overnight.
3Categories — the top level
A category is a bucket of related questions. Every question you write must belong to one.
What a category holds
Name (native)
Displayed as-is. Write it in the language your members will read.
Default locale
Locks the category to one language. Non-native fields are hidden in the editor to keep data clean.
Description (MD)
Optional. Markdown supported. Shown on category detail pages.
Sort order (seq)
Lower numbers appear first in your bank listing.
How to create one
- Open the hamburger → "New category".
- Fill in name + default locale. Save.
- On the same page there is an AI-assist panel on the right — describe your bank once and it drafts a batch of ready-to-save categories at once.
Tip — start small
Three or four categories is plenty. You can always split later. Members see category names when browsing your tests, so keep them scannable.
4Topics — the shape of the curriculum
Topics live under a category and describe the shape of what you are testing.
What a topic holds
Name (native)
Curriculum-facing label — "Reading Comprehension", "Trigonometry", "Grammar", etc.
Weight
Controls how the AI generator distributes questions across topics. 10 is neutral; 20 doubles the share.
Order (seq)
Ordering of topics inside the modal — cosmetic only.
How to add topics
- Go to the bank listing → click "Topics" beside a category.
- The modal shows every topic. Add / edit / delete rows.
- Save. Topics feed into the AI generator prompt so batches distribute correctly.
Why bother with topics?
Without topics the AI has nothing to balance. With three or four topics and non-trivial weights, generation runs return covering sets instead of piling into whichever topic the model finds easiest.
5Questions — the atoms
Every question belongs to exactly one category. Type, points, correct answer, choices — all held here.
Question fields you actually fill
Title
One-line summary shown in listings. Not shown to the member during attempts.
Body (MD)
The stem. Markdown + LaTeX ($…$ inline / $$…$$ block) both render.
Answer type
Single-choice, multi-choice, ordering, fill-in-the-blank, short answer, or open response.
Choices
For multiple-choice types. Mark one or more as correct. Order can be shuffled per attempt.
Points
Score awarded on a correct answer. Total test score = sum of question points.
Difficulty
Easy · Medium · Hard · Very hard · Extreme. Metadata only — no score effect.
Status
Draft → Live. Only questions marked Live can actually appear during an attempt.
Two ways to add questions
- Manual — hamburger → "New question", pick a category, write it, save.
- AI — hamburger → "AI generate", pick category + template + count, watch cards stream in, edit inline, approve to bank.
Tip — publish before testing
Draft questions are invisible to attempts. If your test comes up short on questions, check that the underlying questions are actually published.
6Tests — the actual exam
A test picks N questions from one category and runs an attempt.
Test fields
Name
What members see in the invite landing and result page.
Category (source)
The bucket the questions are drawn from.
Question count
How many questions per attempt. If the category has fewer, all are used.
Draft algorithm
random / sequential. Random shuffles every attempt; sequential preserves category seq.
Mode
trial (unlimited replay) or timed (single attempt with hard deadline).
Time limit (sec)
Blank = no limit. Otherwise the server cron auto-submits when it expires.
Total / pass score
Total is derived from points; pass score is what counts as "PASS" on the result page.
Create a test
- Hamburger → "My tests" → "+ New test".
- Fill in the form. Save.
- Land back on the test edit page — this is where the invite link controls live.
7Invite link — how members join
The share token is the access grant. Anyone with the link can attempt, whether or not they have an account.
Generate and share
- Open your test → edit page → "Share link" section.
- Click "Generate share link". A 40-char token is created; the URL is /i/{token}.
- Copy → paste it into your class chat / email / whatever. Members open the link and start attempting.
Guests are OK
A member without an account still gets a cookie-based session and their attempt shows up in your takers list, keyed by the last 8 chars of the cookie id.
Rotate or revoke
"Regenerate" replaces the token — old links die instantly. "Revoke" clears the token; no one can attempt from any link until you generate again.
Treat the token as the password
Anyone who has the URL can attempt. If it leaks (screenshot in a public forum, forwarded email), regenerate.
8Attempts & results
Two views: yours (as owner) and theirs (as member).
What you see
People who took my tests
Dashboard aggregate across every test you own — attempts per member, latest attempt.
Per-test attempts
On a test's edit page click "Attempts" → total attempts, average %, pass rate, sortable table.
Per-attempt detail
Click a row → per-question breakdown showing the member's answer, the correct answer, and points earned.
What the member sees
Result page
Immediately after submit — total score, pass/fail badge, time spent.
Explanations
If the question had an explanation, it renders below their answer on the breakdown.
My results
Signed-in members get "My results" in their own dropdown — every test they have attempted.
9FAQ
Do members need to sign up?
No. The invite link works for anyone. Signing up just lets them see their own attempt history later.
Can I revoke access from one specific member?
Not directly today — the link is the grant. To cut off one member, regenerate the token and re-send only to the members you want to keep.
Can I use my own AI key to generate questions?
Yes. Hamburger → "AI keys" → register a provider key. If your workspace admin has "platform absorbs user keys" turned on, the menu is hidden because they cover the cost for you.
Can I import questions from a spreadsheet?
Not yet — AI generation is the fastest bulk path. CSV import is on the deferred list.
What time zone are the attempt timestamps in?
KST (Asia/Seoul, UTC+9) everywhere in this app, including your dashboards.