Introduction

Pomelo User Guide

What This Guide Covers

This guide walks you through the full lifecycle of using Pomelo, from launching the platform with the CLI, to configuring infrastructure through the Admin UI, to creating and managing assessments in the main App.

Whether you are an administrator setting up Pomelo for the first time or an instructor building your first coding contest, follow along in order. Each section builds on the previous one.

This guide is for using Pomelo. If you need to install from source, configure environment variables, or set up Docker for development, see the Documentation.

Pomelo CLI

Getting Started with the CLI

The pomelo command is your primary tool for managing a Pomelo deployment from the terminal. It is installed automatically during setup and symlinked to /usr/local/bin/pomelo.

Starting Pomelo

After installation, launch the entire platform (Docker containers, databases, the web server, and the Judge0 code evaluation engine) with a single command:

Terminal
$ pomelo start

The CLI streams progress to your terminal as each service comes online. Once complete, your Pomelo instance is ready for use.

Checking Status

To verify that all services are healthy and running:

Terminal
$ pomelo status

This prints the state of each Docker container (running, stopped, or errored) along with the daemon version.

Stopping Services

When you are done or need to free system resources:

Terminal
$ pomelo stop

All containers are gracefully stopped. Your data is preserved on disk.

Restarting Services

If you have made configuration changes (for example, updating environment variables or domain settings), apply them by restarting:

Terminal
$ pomelo restart

A restart is required after any environment or setup change. The Admin UI will also remind you when a restart is needed.

CLI Command Reference

The full set of commands available through the pomelo CLI:

CommandDescription
pomelo startStarts all Pomelo backend services (Docker containers, databases, server, client, and Judge0 engine).
pomelo stopStops all currently running Pomelo services.
pomelo restartStops then restarts all services. Use this to apply configuration changes.
pomelo statusDisplays the health and running status of all Pomelo services.
pomelo logs [service]Tails the logs of a specific service. For example, pomelo logs caddy or pomelo logs judge0-server.
pomelo uiOpens the Admin UI dashboard in your default web browser (port 8462).
pomelo uninstallSafely uninstalls Pomelo and removes its associated containers, volumes, and systemd service.

Viewing Logs

You can tail logs for any individual service by name:

Terminal
$ pomelo logs caddy
Terminal
$ pomelo logs judge0-server

This is useful for debugging startup failures, network issues, or unexpected submission errors without opening the Admin UI.

Opening the Admin UI

Instead of remembering the port number, use the built-in shortcut:

Terminal
$ pomelo ui

This opens http://localhost:8462 (or your configured Admin CLI port) in your default browser.

Admin UI

Dashboard

The Admin UI is Pomelo’s dedicated interface for infrastructure management. Open it with:

Terminal
$ pomelo ui

System Status

The Dashboard is the first thing you see when you enter the Admin UI. It provides a bird’s-eye view of your deployment across three key metrics:

MetricWhat It Shows
DockerWhether Docker is available and ready on the host machine.
ContainersA count of running containers versus total containers (e.g., 6 / 8).
DatabaseThe current storage footprint of your MongoDB instance.

Quick Actions

Below the status indicators, you will find action buttons that mirror the CLI:

ActionDescription
StartLaunches all services.
StopGracefully shuts down every container.
RestartStops then starts the entire stack.
RefreshRe-fetches the latest status from the daemon.

These are identical to running pomelo start, pomelo stop, and pomelo restart in the terminal.

Container List

A live table of all containers is displayed at the bottom of the Dashboard. Each row shows the container name and a status badge:

StatusDescription
RunningThe container is healthy and operational.
ExitedThe container has stopped.

Storage Overview

At the bottom, you will see a summary of disk usage split into Database, Uploads, and Backups. Use this to monitor growth over time.

If Docker shows as “Offline”, ensure Docker Desktop (or the Docker daemon) is running on the host machine before starting Pomelo services.

Setup & Configuration

The Setup page is where you configure the core infrastructure services that power Pomelo. Navigate to it from the Admin UI sidebar.

MongoDB

Choose how Pomelo connects to its primary database:

OptionDescription
Self-hostedUses the bundled MongoDB container that ships with Pomelo. This is the recommended option for most deployments (no external database is needed).
External MongoDBConnect to your own MongoDB Atlas cluster or a separately managed instance. When selected, provide the full connection URI (e.g., mongodb+srv://user:pass@cluster.example.com/pomelo).

If you choose External, you can click Test Connection to verify read/write access before saving. If the test fails, the save is aborted so you do not accidentally break your deployment.

Judge0 Engine

Configure the code evaluation backend:

OptionDescription
Self-hostedRuns Judge0 server and worker containers locally. This requires Docker privileged mode and is the default.
External Judge0Point Pomelo at a separately hosted Judge0 instance by providing its URL (e.g., https://judge0.example.com:2358).

Domain & Protocol

Set the public-facing address for your Pomelo instance:

ConfigurationDescription
Domain NameThe hostname where Pomelo will be accessible (e.g., contests.example.com). Use localhost for local development.
ProtocolChoose between HTTP (no SSL, suitable for local or internal use) and HTTPS (Caddy will automatically provision SSL certificates via Let’s Encrypt).

Every time you save a section on this page, the required containers are automatically restarted to apply the changes. You do not need to manually restart.

Environment Variables

The Environment tab gives you direct access to Pomelo’s raw environment configuration. Instead of manually editing .env files on the server, you can update values through this interface.

What You Can Configure

Variable CategoryExamplesPurpose
Caddy PortsHTTP port (80), HTTPS port (443)Change these if Pomelo runs behind another reverse proxy or if the default ports are occupied.
Admin CLI PortDaemon communication port (8462)Modify the port the Pomelo daemon uses to communicate with the CLI and Admin UI.
Judge ConfigurationAPI keys, memory limits, execution timeoutsFine-tune Judge0 parameters for code evaluation: adjust memory caps, CPU time limits, and API credentials.
DatabaseMONGODB_URIOverride the MongoDB connection string directly.
ApplicationAUTH_SECRET, DOMAIN, PROTOCOLCore application secrets and routing configuration.

Workflow

  1. Open the Environment tab in the Admin UI sidebar.
  2. Locate the variable you want to change.
  3. Edit the value inline and click Save.
  4. Return to the Dashboard and click Restart to apply the changes.

Changes to environment variables require a service restart to take effect. The Dashboard will show a prompt when a restart is needed.

User Management

The Users page in the Admin UI is for managing accounts that access the Pomelo application. Users are stored in MongoDB and split into two tabs: Administrators and Regular Users.

Creating an Account

  1. Click the Add Account button in the top-right corner.

  2. Fill in the form fields:

    FieldDescription
    NameDisplay name for the account (optional, max 100 characters).
    EmailMust be a valid email address (required).
    PasswordMinimum 6 characters, maximum 72 (required).
    RoleSelect either Admin or User.
  3. Click Create Account.

Admin accounts created here can log into the main Pomelo App and access the /admin dashboard, where tests and questions are managed.

Managing Existing Accounts

The user table displays all accounts for the selected role tab. For each account you can:

ActionDescription
Change the roleUse the inline dropdown to promote a user to Admin or demote an Admin to a regular User.
Delete the accountClick the trash icon and confirm. This action is permanent.

Pagination

When you have many accounts, the table automatically paginates. Use the Previous and Next buttons to navigate between pages.

You must create at least one Admin account here before you can access the App’s admin dashboard. Regular users can self-register through the App’s sign-up page.

Logs & Debugging

The Logs tab provides a real-time, streaming view of your container output. It is the fastest way to diagnose service failures without dropping into a terminal.

When to Use Logs

  • A service fails to start after running pomelo start or clicking Start on the Dashboard.
  • A candidate’s code submission fails unexpectedly or times out.
  • You see container status badges showing “Exited” on the Dashboard and want to know why.

Filtering by Container

You can scope the log stream to a specific container to reduce noise:

ContainerWhat It Shows
serverExpress API logs: authentication, contest operations, submission handling.
clientNext.js frontend logs: page renders, server-side API calls.
judge0-serverJudge0 core server: code submission intake and result dispatch.
judge0-workersJudge0 workers: actual code compilation and execution.
mongoMongoDB database logs.
caddyReverse proxy and SSL certificate logs.

CLI Alternative

You can also tail logs from the terminal without opening the Admin UI:

Terminal
$ pomelo logs server

If a container is not running, its logs will be empty. Start the services first, then return to the Logs tab.

Authentication

The Pomelo App is the main web interface where instructors create assessments and candidates take them. Open it by navigating to your configured domain in a web browser.

Creating an Account

  1. On the landing page, click Sign Up.
  2. Enter your name, email address, and a password.
  3. Click Register to create your candidate account.

You are now logged in and can browse available contests or join a test using a code.

Logging In

If you already have an account:

  1. Click Login on the landing page.
  2. Enter your email and password.
  3. Click Sign In.

Admin Access

To access the App Admin dashboard (where tests and questions are created), you must log in with an account that has the Admin role. Admin accounts are created through the Admin UI → Users page, not through the App’s sign-up form.

Once authenticated as an Admin, you will have access to the /admin route and all management features.

Regular user accounts created through Sign Up can only join and take tests. To create or manage tests, you need an Admin account provisioned via the Admin UI.

Pomelo App

Dashboard

Once logged in as an Admin, you are taken to the App Admin dashboard at /admin. This is your home base for managing assessments.

Dashboard Overview

The dashboard surfaces key metrics at a glance:

MetricDescription
Active ContestsThe number of tests currently in progress.
Upcoming TestsTests that are scheduled to start in the future.
Completed TestsTests that have ended.
Total QuestionsThe combined count of all questions across the question bank.
Total ParticipantsThe total number of users who have joined any test.

Question Bank Breakdown

Below the main stats, you will see a breakdown of your question bank by difficulty:

DifficultyDescription
EasyLower complexity problems.
MediumModerate difficulty.
HardAdvanced algorithmic or conceptual challenges.

Recent Tests

A list of your most recently created tests is displayed at the bottom. Each entry shows the test title, status (waiting, ongoing, or completed), duration, question count, and participant numbers. Click on any test to jump directly to its management page.

Creating a Test

Tests are the core unit of assessment in Pomelo. Each test is a timed container for questions that candidates work through.

Step-by-Step

  1. Navigate to the Admin Dashboard in the main app (/admin).
  2. Click the Create Test button.
  3. Fill in the foundational details:
FieldDescription
TitleThe name of the assessment as candidates will see it.
DescriptionInstructions, rules, or context for the candidates.
Start TimeThe date and time when the test opens for candidates.
End TimeThe date and time when the test closes.
DurationThe time limit allowed for a candidate’s individual attempt once they start (e.g., 01:30 for 90 minutes).
  1. Click Save. You will be redirected to the test management page where you can add questions.

Test Management

Once created, the test management page at /admin/tests/[id] gives you access to:

Tab / SectionDescription
QuestionsAdd, edit, or remove MCQ and Code questions.
EditUpdate the title, description, or duration.
LeaderboardView real-time rankings once the test is live.
SubmissionsReview individual candidate submissions.
ResultsAccess final scores and analytics after the test ends.

A test is scheduled based on its Start Time and End Time. Candidates can only join and view the test while it is open.

Adding MCQ Questions

Multiple Choice Questions (MCQs) are ideal for testing theoretical knowledge, definitions, and conceptual understanding.

Step-by-Step

  1. Open the test you want to add questions to (from the Admin Dashboard or via /admin/tests/[id]).
  2. Navigate to the Questions section.
  3. Click Add Question and select Multiple Choice Question (MCQ).
  4. Fill in the question details:
FieldDescription
PromptThe question text. This is what candidates will read.
OptionsAdd 2 or more possible answers. Each option should be distinct and unambiguous.
Correct AnswerSelect the radio button or checkbox next to the correct option(s).
PointsAssign a score value to the question (e.g., 5 points).
  1. Click Save Question.

Tips

  • Write clear, unambiguous prompts. Avoid trick questions unless intentional.
  • Include plausible distractors (options that look correct but are not) to genuinely test understanding.
  • Assign point values that reflect the difficulty of the question relative to other questions in the test.
  • You can return to any saved question and edit it as long as the test has not started.

Adding Code Questions

Code questions allow candidates to write and submit programs that are automatically compiled, executed, and graded against predefined test cases using the Judge0 engine.

Step-by-Step

  1. Open the test’s Questions section.
  2. Click Add Question and select Code Question.
  3. Fill in the problem details:
FieldDescription
Problem StatementA detailed description of the algorithm or logic the candidate must implement. Be specific about input format, output format, and expected behavior.
ConstraintsDefine input limits (e.g., 1 ≤ N ≤ 10⁵). This helps candidates gauge the expected time complexity.
LanguagesSelect which programming languages candidates are allowed to use (e.g., Python, C++, JavaScript).
PointsAssign a score value for the question.

Adding Test Cases

Test cases are the backbone of automated grading. For each test case:

  1. Click Add Test Case.

  2. Provide the Standard Input (the exact input your program will receive via stdin).

  3. Provide the Standard Output (the expected output the program must produce).

  4. Set the visibility:

    VisibilityDescription
    PublicVisible to candidates as a sample/example. They can use this to verify their approach.
    HiddenUsed only for final grading. Candidates never see the input or expected output.
  5. Click Save Question when you are done adding all test cases.

Best Practices

  • Include at least 1–2 public test cases so candidates can validate their solution before submitting.
  • Add edge cases as hidden test cases (empty input, maximum constraints, boundary values) to ensure solutions are robust.
  • Write the problem statement as if the candidate has never seen the problem before. Include input/output format specifications and a worked example.

Code questions are graded by Judge0. Make sure the Judge0 engine is running (check the Admin UI Dashboard) before candidates begin their attempts.

Scheduling & Joining Tests

Once your test is populated with questions, configure its start and end times to schedule it for candidates.

Scheduling a Test

  1. Navigate to the test management page (/admin/tests/[id]).
  2. Click Edit to configure the Start Time and End Time.
  3. Ensure the times are correct. A unique join code is generated automatically when the test is created.

Share this join code (or the direct test link) with your candidates through email, a messaging platform, or a classroom portal. Candidates can use the code to join, but the test will only open when the scheduled start time is reached.

Candidate Journey

From the candidate’s perspective:

  1. Navigate to the Pomelo App in their browser.
  2. Log in or Sign up for a candidate account.
  3. Go to the Join page at /join.
  4. Enter the join code provided by the instructor.
  5. Begin the attempt: they are redirected to the /attempt interface where the timer starts and questions are presented.

During the Attempt

  • The countdown timer is visible at all times.
  • Candidates can navigate between questions freely.
  • MCQ answers are saved immediately on selection.
  • Code submissions are sent to Judge0 for evaluation. Candidates see results for public test cases in real time.
  • When time expires, the attempt is automatically submitted.

After the Test

  • Admins can view the Leaderboard for live rankings.
  • The Submissions tab shows every candidate’s individual answers.
  • The Results page provides final scores and analytics.

Once a test’s start time has passed and candidates have joined, avoid editing questions. If you need to make corrections, communicate them to candidates directly.