Status: research and design as of 2026-11-12. Nothing installed. Items marked [unverified] need a hands-on check on one MacBook Neo before imaging the class set. Sources are at the bottom.
The MacBook Neo uses the A18 Pro: a 6-core CPU (2 performance + 4 efficiency cores), a 5-core GPU, 8 GB unified memory with no upgrade option, and 60 GB/s memory bandwidth [1][2]. That shapes everything below:
training-on-apple-silicon.md.| Option | Fit for grades 6–8 | Local OpenAI-compatible endpoint? | Status (Nov 2026) | Verdict |
|---|---|---|---|---|
| VS Code + built-in BYOK “Custom Endpoint” | One app for .py, notebooks (Jupyter extension), terminal and chat. Professional tools that kids can grow into. |
Yes. VS Code’s docs say BYOK and local models work without a Copilot plan and without signing into GitHub [3]. The older “OpenAI Compatible” option was renamed Custom Endpoint [4]. | Actively developed | Primary |
| VS Code + Continue | Good UX and simple config.yaml (provider: openai, apiBase, roles) [5]. Can send custom headers. |
Yes [5] | Reported acquired by Cursor (June 2026). Final release 2.0.0. Repo read-only. It still works with your own models (Apache-2.0) [6][7] [unverified, so confirm on GitHub] | Backup only. Don’t build a course on a frozen extension. |
| JupyterLab + Jupyter AI v3 | Notebook-first and great for the “look inside the model” labs, but it’s a second tool to teach. | Yes. v3 moved to LiteLLM and added api_base [8][9]. Works with JupyterLab 4.6+ [10]. |
Active | Optional for notebook-heavy lessons; not for Bug Hunts |
| Buddy in the browser (a tiny chat page served by the proxy) | Simplest possible. Nothing to configure on the laptop. | n/a (talks to the proxy directly) | Not built yet | Good Phase 0 option for the youngest group. About 150 lines of HTML. |
python3 -m bughunt (scripted, no LLM) |
Zero setup, fully offline, deterministic | n/a | Being built in bughunt/ |
Always available as the fallback |
| Thonny / IDLE | Very kid-friendly | No AI integration | — | Fine for absolute beginners. No Buddy. |
Why not Cursor, Windsurf, Copilot, etc.: they are cloud-first and need accounts, which is incompatible with local-first and student data staying on campus.
Ship a VS Code Profile (.code-profile) or a managed settings.json
containing:
{
// Telemetry off (VS Code + extensions that honour it)
"telemetry.telemetryLevel": "off",
// Keep the AI to "Ask" chat; no autonomous agent editing files or
// running terminal commands for 11-year-olds. [setting names: unverified]
"chat.agent.enabled": false,
// Inline completions off: Bug Hunts are about reading and testing code,
// not tab-accepting it.
"github.copilot.enable": { "*": false },
"editor.inlineSuggest.enabled": false,
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
"extensions.autoUpdate": false
}
Then add the Buddy model via Chat → Manage Models → Custom Endpoint [unverified menu path; it changes between releases, so check [3][4]]:
http://buddy-mini.school.lan:8088/v1class-keys.txtbuddy (free-help mode) and buddy/<challenge-id> (Bug Hunt mode).
The proxy lists these at /v1/models, so the challenge picker is the
model picker.Extensions (pin versions): Python and Jupyter (Microsoft). Nothing else.
# ~/.continue/config.yaml (Continue 2.0.x)
name: Zero to GPT
version: 1.0.0
schema: v1
models:
- name: Buddy (Bug Hunt 1.3)
provider: openai # = "speaks OpenAI chat completions"
model: buddy/1.3
apiBase: http://buddy-mini.school.lan:8088/v1 # camelCase matters [5]
apiKey: SEAT_TOKEN_HERE
roles: [chat]
# requestOptions: # alternative to buddy/<id> model names
# headers: { X-Bughunt-Challenge: "1.3" }
Continue warns that without apiBase, requests go to OpenAI itself [5].
Double-check this field on every laptop.
Pick uv (Astral). It is a single binary that needs no admin rights. It
installs Python itself, creates the venv, and resolves from a lockfile that
the whole class shares. Both nanochat and the nanochat CPU script already
use it (uv sync --extra cpu) [11]. The current release is 0.13.x
(0.13.6, 2026-10-26) [12].
Watch out: uv 0.13.0 changed the default Python it downloads to 3.15 [13]. Pin the course to a version that PyTorch, MLX and Jupyter publish macOS-arm64 wheels for [verify the exact version at imaging time; 3.12 or 3.13 is the safe bet]:
# in the course repo
uv python pin 3.12 # writes .python-version
uv lock # commit uv.lock
uv sync # each laptop: creates .venv from the lock
| Alternative | Why not (for this class) |
|---|---|
Xcode CLT python3 + venv + pip |
Old system Python, no lockfile, per-laptop drift |
| Homebrew Python | Upgrades under you; needs Homebrew on student machines |
| Miniforge / conda | Heavy (GBs), a second package universe, slower |
| pyenv + pip-tools | More moving parts for the same result |
Classroom logistics: run uv sync once per laptop through MDM before
day 1, so 12 laptops don’t each download PyTorch over school Wi-Fi in the
first five minutes of class. You can optionally point uv at a local package
mirror or wheelhouse on the mini (UV_INDEX_URL / --find-links) and use
uv sync --offline in class.
| Docker Desktop | Apple container |
None (native) | |
|---|---|---|---|
| What it is | Linux VM + Docker engine | Each Linux container runs in its own lightweight VM. Swift, Apache-2.0. 1.0 shipped June 2026. Targets macOS 26 on Apple silicon [14][15][16]. | uv venv |
| Metal GPU inside? | No. Linux guests don’t get Apple’s Metal. PyTorch MPS and MLX are macOS-only. [well established; no single authoritative link found. Podman/krunkit offers Vulkan-based GPU passthrough, but not MPS/MLX [unverified]] | No (same reason) | Yes |
| RAM cost on an 8 GB Neo | VM reservation (GBs) | Smaller, per container | 0 |
| License | Free for education and small orgs (<250 staff AND <$10M revenue) [17] | Apache-2.0 | — |
| Verdict for students | ✗ | ✗ | ✓ |
So all training and inference runs natively: PyTorch-MPS and MLX on the laptops, llama.cpp and mlx-lm on the mini.
Things that may belong in containers (Apple container, on the mini
only, Phase 3+): non-GPU sidecars like a Prometheus/Grafana stack or a docs
site for the course. Even those run fine natively via Homebrew, so only
containerize if the sysadmin already has a container workflow. Note that
Docker Compose-style multi-container setups were reported as unsupported in
Apple container [15] [unverified].
uv sync (pre-warmed).lessons/01-…, ask Buddy “hi”, run
python3 -m bughunt list, and run a 1-minute nanoGPT CPU training to check
PyTorch.api_base) - https://newreleases.io/project/github/jupyterlab/jupyter-ai/release/v3.0.0beta7uv sync --extra cpu for CPU/MPS) - https://github.com/karpathy/nanochatcontainer - https://cloudnativenow.com/features/apple-ships-stable-1-0-of-its-native-container-tool-for-macos/