Challenges, help, exams and shared material
How the community half of ZNetLab works — every screen, every rule and every address, written down once so the screen itself does not have to explain itself.
/learn/ run in your
browser whether you sign in or not. What signing in adds is other people — a challenge
somebody set you, an answer to a question, a study group, a shelf of shared notes.Where everything is
Two places, and they do different jobs. The portal is where people and records live; the simulator is where the work happens.
| Screen | Address | What it is for |
|---|---|---|
| Portal | /community |
Everything below, on one page. |
| Community → Challenges | /community |
Challenges people set each other, by category. |
| /community → Help | same screen, Help tab | Questions, their conversations, and your inbox. |
| Community → Material | same screen, Material tab | Links, notes and files people study from. |
| Community → Exams | same screen, Exams tab | Study groups, their papers and the marking. |
| Community → Leaderboard / Me | same screen | Standings, and your own rank, badges and readers. |
| Simulator | /learn/lab |
Where a lab or a challenge is actually built. |
| A challenge, opened | /learn/lab#challenge:<id> |
The challenge's own topology, loaded and ready. |
| Marketing → Video & images | /lab/ → Admin portal → Marketing |
The social library and the A–Z post generator. |
Challenges
A challenge is a lab you built, published for other people to rebuild. It sits in one of the five categories the built-in labs already use — Enterprise, Telecom, Service Provider, Automation, Custom — so it is found beside the labs it belongs with.
Setting one
/learn/lab, build the topology, and — if you want it marked
automatically — add an activity: assessment items and connectivity tests, the ones behind
Check Results..nblab file. That one file carries
the topology, every device's configuration and the checks..nblab file.Solving one
/learn/lab and puts a bar across the top saying what it is worth. Opening it
is counted as an attempt.Help
Help is a category like any other, and a request for help opens a conversation that reads like a chat: messages in order, by name, anybody may reply.
| What | How |
|---|---|
| Ask | /community → Help → title, what you tried, what happened. Say the lab or challenge it is about and the answer comes faster. |
| Reply | Open the conversation and write. Everybody already in it is notified, not only the person who asked. |
| Mark the answer | Only the person who asked, and only one per conversation — so ten helpful replies to one problem are not ten Mentor points. |
| Close it | The asker, when it is done. It can be reopened. |
| Remove a message | Its author. The row stays as removed so the replies that answered it still make sense. |
--smtp.Exams
Ten to fifteen people join a group, every one of them writes a paper, and everybody sits the papers the others wrote. Writing a question is harder than answering one, so the group learns twice and nobody has to be the teacher.
The three duties
Everybody in a group owes the same three things, and the screen shows which are outstanding:
| Duty | Done when |
|---|---|
| Set a paper for the group | You have published at least one. |
| Sit every other member's paper | None of theirs is left unsat. |
| Mark the open answers on your own paper | Nothing of yours is waiting. |
Writing a paper
A paper is JSON, written in the box on the group screen — the form starts with a working example you can edit. Three kinds of question:
| Kind | Carries | Marked |
|---|---|---|
mcq | options and answer, the index of
the right one | The moment it is handed in |
short | answer, plus any
answers you will also accept |
The moment it is handed in — case and spacing are ignored |
open | no answer key, and a guide note to
yourself | By you, afterwards |
{ "questions": [
{ "kind": "mcq", "text": "Which protocol resolves an IP to a MAC?",
"points": 2, "options": ["ARP","DNS","DHCP","NTP"], "answer": 0 },
{ "kind": "short", "text": "Which TCP port does BGP use?", "points": 2, "answer": "179" },
{ "kind": "open", "text": "Explain why OSPF will not adjacency with mismatched MTUs.",
"points": 4, "guide": "Looking for: DBD exchange, EXSTART." }
] }
Sitting one
Press Sit it. The paper arrives without its answer key — the marking happens on the server, and a paper handed out with its answers is not an exam. Hand it in and the multiple choice and short answers are marked immediately; the open ones go to whoever set the paper. You see the key only once everything is marked.
Material
One list of everything shared about a subject: a link, a page of notes, or a file. Filed by the same categories, ranked by how many people found it useful.
| Kind | What it takes |
|---|---|
| A link | http:// or https:// and nothing else. |
| Notes | Typed or pasted. Line breaks are kept; it is shown as text, never as markup. |
| A file | PDF, pictures, text, CSV, packet captures (.pcap) and
saved labs (.nblab). Not HTML or SVG — those run in a
browser. |
Useful is one per person and can be taken back. It ranks the list, and the person who shared it earns 2 points when somebody marks it — writing the notes everybody uses is work too.
Points, ranks, badges and readers
| What you did | Points |
|---|---|
| Solved a beginner challenge | 10 |
| …intermediate | 25 |
| …advanced | 50 |
| …expert | 100 |
| Somebody solved a challenge you set | 2 |
| Sat an exam paper | 5 |
| Somebody sat a paper you set | 3 |
| Marked somebody's answers | 2 |
| Somebody found your material useful | 2 |
| Rank | At |
|---|---|
| Newcomer | 0 |
| Apprentice | 100 |
| Technician | 300 |
| Engineer | 750 |
| Senior Engineer | 1 500 |
| Architect | 3 000 |
| Principal | 6 000 |
Badges mark different things on purpose, so a wall of them does not say one thing six times: First solve, Ten solves, Fifty solves, Author (published a challenge), Set the pace (five published, each solved by somebody), Mentor (answered ten requests for help), Well read (ten readers), All-rounder (solved something in every category), First light (first person to solve a challenge).
Readers are the people who follow what you publish. Click anybody's name anywhere on the screen to see their profile and read them.
A–Z posts for social media
Twenty-six networking topics, A to Z, each as a 1080×1350 picture and a fourteen-second clip, filed into the social library with a caption ready to paste.
| Where | What it does |
|---|---|
| Admin → Marketing → Video & images | Upload from your machine, download anything, and the A–Z generator. Rendered in your browser: Chrome and Edge produce MP4, Firefox and Safari only WebM. |
node tools/make-posts.js |
The same posts made on the server, no browser needed. --all remakes
all twenty-six, --only A,V picks some. It stops the server for the few
seconds it files them, and starts it again through
server/start.sh. |
Every URL
Pages
| Address | What |
|---|---|
/ | The site. |
/learn/ | The labs and the browser simulator. |
/learn/lab | The simulator on its own. |
/learn/lab#challenge:<id> | A challenge, loaded. |
/lab/ | Real labs on real images, on the lab server. |
/lab/ → Accounts | Every account on the server, for administrators. |
/profile.html | Your own details. |
/login.html | Sign in. |
/plans.html | Plans and prices. |
/guide.html | The product guide. |
/community-guide.html | This page. |
/noc/ | The operations screen. |
/sitemap.html | Every page. |
/policies.html, /terms.html, /privacy.html,
/licenses.html | The legal documents. |
/docs/… | The long-form guides. |
The API
Every route below needs a signed-in account and nothing more — these are what a registered
account is for, not an administrator's screen. Send the session as
Authorization: Bearer <token>.
Challenges, people and conversations
| Method | Route | What |
|---|---|---|
| GET | /api/community | Categories, levels, ranks, your profile, unread count. |
| GET | /api/community/challenges | List. ?category= &level= &mine=1 &solved=1 &unsolved=1 |
| POST | /api/community/challenges | Publish one. Takes the .nblab as document. |
| GET | /api/community/challenges/:id | One, with its document. |
| DELETE | /api/community/challenges/:id | Take yours down. |
| POST | /api/community/challenges/:id/attempt | Count an attempt. |
| POST | /api/community/challenges/:id/solve | Record a solve. |
| GET | /api/community/leaderboard | Standings. ?limit= |
| GET | /api/community/people/:userId | Somebody's profile and challenges. |
| POST / DELETE | /api/community/people/:userId/follow | Read them, or stop. |
| GET | /api/community/threads | Conversations. ?category= &lab= &challenge= &mine=1 &in=1 &open=1 &unanswered=1 |
| POST | /api/community/threads | Ask for help. |
| GET | /api/community/threads/:id | One, with its messages. |
| POST | /api/community/threads/:id/reply | Reply. |
| POST | /api/community/threads/:id/accept | Mark the answer. {messageId} |
| POST | /api/community/threads/:id/close · /reopen | Close or reopen. |
| DELETE | /api/community/threads/:id/message | Remove a message. {messageId} |
| GET | /api/community/inbox | What was waiting. ?unread=1 |
| POST | /api/community/inbox/read | Mark read. {ids}, or none for all. |
Exams
| Method | Route | What |
|---|---|---|
| GET | /api/exams | Your groups with their duties, and the ones open to join. |
| POST | /api/exams/groups | Start a group. {name, subject, target} |
| GET | /api/exams/groups/:id | Members, papers, your duties, everybody's duties, results. |
| POST | /api/exams/groups/:id/join · /leave | Join or leave. |
| GET | /api/exams/groups/:id/duties | Who still owes what. |
| POST | /api/exams/groups/:id/papers | Set a paper. {title, minutes, document} |
| DELETE | /api/exams/papers/:id | Take yours down, while nobody has sat it. |
| POST | /api/exams/papers/:id/start | Start sitting it — returns the paper without answers. |
| GET | /api/exams/sittings/:id | A sitting, as you are allowed to see it. |
| POST | /api/exams/sittings/:id/submit | Hand it in. {answers} |
| POST | /api/exams/sittings/:id/mark | Mark the open answers. {marks} |
| GET | /api/exams/duties | Everything owing across every group. |
Material
| Method | Route | What |
|---|---|---|
| GET | /api/material | The list. ?category= &kind= &group= &lab= &mine=1 &q= |
| POST | /api/material | Share a link or notes. {kind, title, url|note, category, tags} |
| PUT | /api/material/file | Upload a file — the body is the file, the rest is query string. |
| GET | /api/material/:id | One item, with a note's text. |
| GET | /api/material/:id/file | The bytes. ?dl=1 to save rather than view. |
| POST | /api/material/:id/useful | Mark useful, or take it back. |
| DELETE | /api/material/:id | Remove yours. |
Limits
| Thing | Limit |
|---|---|
| A challenge document | 4 MB · 300 published per account |
| A reply or a question | 4 000 characters · 2 000 messages per conversation |
| Conversations open at once | 50 per account |
| Notifications kept | 200 per account, newest first |
| A study group | 15 members · a target you set, 10 by default |
| A paper | 60 questions · 20 papers each, per group |
| Shared files | PDF and captures 25 MB · pictures 12 MB · saved labs 8 MB · text 2 MB · the whole library 2 GB |
| Shared notes | 40 KB |
| The social library | pictures 12 MB · clips 220 MB · 6 GB in all |
What it does not do
A challenge solve is marked in your browser. The simulation engine only runs in a page, so when the author included checks the machine decides and when they did not, the solve is a claim you make. Points are given once per challenge and never for your own, so the most an untrue claim ever buys is that one challenge.
Email needs SMTP. Notifications always reach the
portal. They are also emailed, but only when the server was started with
--smtp; without it the message is written to work/outbox as a
file and nothing is sent. The portal's inbox never depends on mail working.
Something here wrong or missing? /community → Help, or the product guide.