Container infrastructure for the PPBDS GitHub organization. This repo publishes one Docker image to the GitHub Container Registry:
ghcr.io/ppbds/devcontainer
It serves everyone: students taking the data science course (via codespace-starter) and developers working on PPBDS packages.
Note: this image replaced the old
devcontainers/base,devcontainers/dev, anddevcontainers/studenttrio in v1.0.0. The old packages remain on GHCR at their final tags so existing pins keep working, but they receive no new versions — switch toghcr.io/ppbds/devcontainer.
In a downstream repo's .devcontainer/devcontainer.json:
Replace X.Y.Z with the latest tag from the releases page. Pin to a specific semver tag — :latest floats with main and is not for student-facing (or, since 2026-07, package-repo) config.
:latest— most recent successful build frommain. Convenient, not stable.:X.Y.Zand:X.Y— semver tags from a GitHub release on this repo. The canonical stable pin.
- R — the rocker/tidyverse foundation, the PPBDS course packages (
tutorial.helpers,vscode.tutorials,misc.tutorials,primer.tutorials), thearfconsole, Quarto,httpgd, andpak. - Modeling —
tidymodelsplus engines (xgboost,lightgbm,catboost,randomForest,ranger,glmnet,bonsai) andbrmsfor Bayesian regression via Stan. - Inference reporting & presentation —
gt,marginaleffects,patchwork,easystats(used throughout the primer book and tutorials). - Mapping / census —
sf+tidycensus(withtigris) for census-tract maps, plus the Kyle Walker toolkit:mapgl(token-free WebGL vector maps via MapLibre + CARTO styles),crsuggest, andidbr. Live census queries need a free Census API key. - Interactive web viz + Shinylive — R htmlwidgets (
plotly,leaflet,DT,crosstalk) and Python (plotly,altair,folium,itables) emit self-contained client-side JS; Shinylive (R & Python) runs Shiny apps as WebAssembly — everything publishes to static hosting (GitHub Pages). - Python — a data-science stack installed with
uvinto/opt/venvfrom a pinned lockfile: numpy, pandas, matplotlib, seaborn, scikit-learn, statsmodels, jupyter, ipykernel. DefaultpythononPATH, registered Jupyter kernel, group-writable sopip installworks. - Observable — Quarto's
{ojs}cells render Observable Plot / OJS out of the box; the Observable Framework CLI is installed for standalone data-app projects. - Package development —
devtools,pkgdown,roxygen2,testthat,usethis, and the R CMD check toolchain (incl.qpdf). - AI coding assistants — see below.
The image ships four AI coding CLIs so users can pick the model that fits their cost and quality needs:
claude— Claude Code. Anthropic's CLI, single-provider, uses Claude models. Highest quality, highest cost.codex— Codex CLI. OpenAI's CLI, uses GPT/Codex models. Included with a ChatGPT Plus/Pro plan.agy— Antigravity CLI. Google's terminal coding agent — the successor to the Gemini CLI, which Google retired on 2026-06-18.aider— Aider. Multi-provider. Point it at DeepSeek, OpenRouter, OpenAI, Anthropic, or any OpenAI-compatible endpoint. The cost-flexible option.
The image ships no credentials. The recommended way to authenticate is to sign in on first run: start the CLI and complete the account sign-in (a ChatGPT plan for codex, a Claude plan for claude, a Google account for agy). This bills against a flat-rate subscription rather than metered API calls. As a fallback — and the only option for aider — supply an API key via Codespaces user secrets (below); each CLI stays inert until it has either a sign-in or a key.
Configure each key as a personal Codespaces secret so it appears as an environment variable in every Codespace you launch.
-
Under Codespaces secrets, click New secret.
-
Add the secret name and value for each tool you plan to use:
Secret name Used by Where to get it ANTHROPIC_API_KEYclaude(or sign in instead)https://console.anthropic.com ANTIGRAVITY_API_KEYagy(or sign in instead)https://aistudio.google.com/apikey OPENAI_API_KEYaider→ OpenAI modelshttps://platform.openai.com/api-keys DEEPSEEK_API_KEYaider→ DeepSeek directlyhttps://platform.deepseek.com OPENROUTER_API_KEYaider→ any model via OpenRouterhttps://openrouter.ai/keys (
codexauthenticates by signing in with a ChatGPT plan, or viacodex login; it does not readOPENAI_API_KEY.) -
Under Repository access, grant access to the repos you launch Codespaces from.
-
Save. The next Codespace you launch will have those env vars available.
# DeepSeek directly — typically ~$0.02–0.05 per 50K-token coding session
aider --model deepseek/deepseek-chat
# Or via OpenRouter — one key, hundreds of models you can swap between
aider --model openrouter/deepseek/deepseek-chat
aider --model openrouter/qwen/qwen-3-coder
aider --model openrouter/google/gemini-2.5-flashFor frontier-quality answers on hard problems, use claude directly (charged at Anthropic's rates) or aider --model anthropic/claude-sonnet-4-6.
See CLAUDE.md and the comments in the Dockerfile — the Dockerfile comments are the canonical record of what's installed and why.
{ "image": "ghcr.io/ppbds/devcontainer:X.Y.Z" }