Adds Open in EduIDE to GitHub's <> Code menu, directly below "Open in GitHub Copilot app". A click opens the
EduIDE landing page with the repository and a matching language image preselected. After login, Scorpio clones the
repository into /home/project.
A prototype. It builds a link to the landing page's existing appDef and gitUri parameters, so it needs no change to
any other EduIDE repository, and it works for public repositories only.
Plain JavaScript, Manifest V3, no build step and no dependencies. Chrome and Edge 116+.
- Open
chrome://extensions(Edge:edge://extensions). - Turn on Developer mode (top right).
- Load unpacked → select this folder (
eduide-github-extension, the one withmanifest.json). - Pin the extension (puzzle icon → pin "Open in EduIDE"), so the toolbar fallback is one click away.
- Reload any GitHub tab that was already open. Content scripts only enter pages loaded after the install.
After editing the code: click the reload icon on the extension's card, then reload the GitHub tab.
The settings page opens by itself after a fresh install, so the first decision is which EduIDE to open. Later: right-click the toolbar icon → Options, or the Settings link in the popup. The popup also has an EduIDE drop-down for switching quickly.
| Option | Address | Images preselected |
|---|---|---|
| TUM (default) | eduide.artemis.cit.tum.de |
Java, Kotlin, C, C++, JavaScript, TypeScript, Python, Rust, OCaml |
| TUM staging | staging.eduide.student.k8s.aet.cit.tum.de |
as TUM |
| Bonn | bonn.eduide.aet.cit.tum.de |
JavaScript, TypeScript |
| Mannheim | mannheim.eduide.aet.cit.tum.de |
none (its Java 25 image has no Scorpio, so nothing would be cloned) |
| Local cluster | eduide.localhost |
Java, Kotlin. A local kind deployment of EduIDE Cloud (see Local deployments) |
| Local portal | localhost:3100 |
Java, Kotlin. A Docker stand-in for the landing page (see Local deployments) |
| Custom | any address you enter | only your overrides, until you detect them |
Detect images reads the selected installation's /config.js and builds the language → image list from the apps it
really offers. Chrome asks once for permission to read that site, which is why the extension has
optional_host_permissions and no host access by default. The detected list replaces the built-in one for that
address; Use the built-in list undoes it. Overrides apply on top of either.
Suggested public repositories, all small enough to clone quickly:
| Repository | GitHub language | Preselected image (TUM) |
|---|---|---|
spring-guides/gs-rest-service |
Java | java-17-latest |
pallets/itsdangerous |
Python | python-latest |
rust-lang/rustlings |
Rust | rust-latest |
sindresorhus/slugify |
JavaScript | javascript-latest |
octocat/Hello-World |
none | none, the landing page asks |
Open https://github.com/spring-guides/gs-rest-service → <> Code.
- "Open in EduIDE" (orange mortarboard) sits between "Open in GitHub Copilot app" and "Open with GitHub Desktop".
- It matches the other items in light and dark theme (GitHub settings → Appearance).
- Closing and reopening the menu shows exactly one item.
- Go to Issues, back to Code, open the menu again: still exactly one item. (GitHub navigates without page loads; this checks the observer.)
- Keyboard: focus "Open in GitHub Copilot app", press Tab, and focus is on "Open in EduIDE". Enter opens it.
Click Open in EduIDE.
- A new tab opens right next to the GitHub tab, at
https://eduide.artemis.cit.tum.de/?appDef=java-17-latest&gitUri=https%3A%2F%2Fgithub.com%2Fspring-guides%2Fgs-rest-service.git&source=github. - The menu closes.
- Before each repository on TUM: make sure no earlier test session with the same image is still running (see Troubleshooting, "repository from an earlier test").
- Log in with Keycloak. You return to the landing page with the URL parameters still in place.
- Expected today: the landing page shows the language picker instead of starting at once. It starts
automatically only for Artemis links, which carry an
artemisToken. Pick Java 17. (A proposed landing-page change replaces this with a one-click confirmation.) - The IDE opens. Within a few seconds the Explorer shows the repository at the workspace root, and
git remote -vin the terminal showshttps://github.com/spring-guides/gs-rest-service.git. - Note that TUM sessions are ephemeral: unpushed changes are gone after the session ends.
Repeat with one or two of the other repositories. octocat/Hello-World has no language, so its link carries no
appDef.
Open a private repository you have access to → <> Code.
- The item is greyed out and does nothing. Its tooltip says "Private repositories are not supported yet".
- The popup says the same and keeps its button disabled.
On any page of a repository, click the toolbar icon.
- It lists repository, language, image, branch and installation, and opens the same URL as the menu item.
- Switching the EduIDE drop-down updates image and launch URL at once, and the Code menu item uses the new choice on its next click.
- Launch URL shows the exact link.
- On a non-GitHub page it asks you to open a repository. On a GitHub tab opened before the install, it asks you to reload.
- On a subfolder page (
/tree/main/complete) the language is still known if you visited the repository root in this tab first. Without that it says "unknown", and the landing page asks for the language.
Switch the branch picker to a non-default branch and open the Code menu, then the popup.
- The popup shows that branch and says the default branch is cloned. That is today's behaviour: Scorpio has no branch support.
- With Options → Experimental → Send the selected branch as gitRef enabled, the launch URL also carries
gitRef=<branch>. The landing page ignores it until it and Scorpio support a branch.
- Bonn preselects only JavaScript/TypeScript. A Java repository's link carries no
appDef, so Bonn does not show "Invalid default selection value". - Overrides:
{ "Kotlin": "", "Go": "java-17-latest" }updates the table below the text box. Invalid JSON shows an error and is not saved. - Custom refuses to save without an http(s) address.
- Detect images on TUM asks for permission to read
eduide.artemis.cit.tum.de, then lists its apps and shows "Using the images detected on …". Use the built-in list returns to the built-in mapping. - After removing and re-adding the extension, the settings page opens by itself.
See Local deployments. With Local cluster selected, open
spethso/EduIDE-GitHub-Extension-Test →
Open in EduIDE → pick Java 17 on the landing page. The IDE opens with the repository cloned.
The Local cluster and Local portal options target two setups for testing without a shared installation. Their scripts are not part of this repository yet.
- Local cluster (
https://eduide.localhost/): a one-node kind cluster running the real operator, REST service and landing page from EduIDE-Helm, with ephemeral sessions like TUM and no login. TLS comes from mkcert, so runmkcert -installonce and restart Chrome. - Local portal (
http://localhost:3100/): a small Node server that startsghcr.io/eduide/eduide/java-17:latestin Docker with the same environment the landing page would give a session. Every language opens in Java 17.
Until EduIDE/EduIDE-Cloud#147 is deployed, an ephemeral installation reopens your first repository's session when you open a second one with the same image.
npm test: 16 unit tests for parsing, app selection,/config.jsdetection and the launch URL. Detection was also run against the liveconfig.jsof TUM, Bonn, Mannheim and the local cluster.- On the local EduIDE Cloud: the extension's link for
spethso/EduIDE-GitHub-Extension-Testopened the landing page, picking Java 17 started a session, and that session had the repository cloned in/home/project. - The content script, run against live github.com (
ccims/gropius-backend) with a stand-in for the extension API: the item is inserted at the right position, the click sends{ nwo, isPublic, language: "Kotlin", ref: "main" }and closes the menu, reopening and in-page navigation produce exactly one item, and Tab reaches it. - The generated TUM link: the landing page accepts
appDef=java-17-latestand shows the login, with no error. - The full chain through the local portal: a link for
octocat/Hello-Worldstarted an EduIDE container, and Scorpio cloned the repository into/home/project(origin https://github.com/octocat/Hello-World.git) with no Artemis token. - The popup and options pages, rendered with stubbed extension APIs.
Not verified: loading the packed extension in Chrome itself (the built-in test browser cannot load extensions), a logged-in launch on TUM, and private repositories.
npm testNode 18+, no install step.
manifest.json
icons/ from EduIDE/EduIDE logo/edu-ide-hat.png
src/lib/eduide.js installations, app ids, settings, launch URL; shared by every part, tested in Node
src/content/github.js finds the Code menu, injects the item, reads repository details from the page
src/background.js opens the launch tab for menu clicks
src/popup/ toolbar fallback
src/options/ installation, language overrides, experimental gitRef
test/eduide.test.js node:test
All details come from the page. The extension makes no GitHub API calls and no requests to EduIDE: it only opens a
tab. Its only permission is storage, plus content-script access to github.com.
| What | Where on the page |
|---|---|
| Code menu | [data-component="AnchoredOverlay"] ul[aria-label="Repository actions"], watched by a MutationObserver |
| Item styling | cloned from "Open with GitHub Desktop", ids stripped |
owner/repo |
meta[name="octolytics-dimension-repository_nwo"], else the URL path |
| Public or private | meta[name="octolytics-dimension-repository_public"] |
| Branch | the menu's "Download ZIP" link (/archive/refs/heads/<branch>.zip) |
| Language | first entry of the language bar (a[href^="/<owner>/<repo>/search?l="]), cached per tab |
The selectors avoid GitHub's hashed prc-* class names. If GitHub changes the menu, the item disappears and the
toolbar popup keeps working.
| Symptom | Cause |
|---|---|
| No item in the Code menu | The tab was open before the extension was installed or reloaded. Reload the tab. If it is still missing, GitHub changed its markup; use the popup |
| Alert "was updated. Reload this page" | The extension was reloaded while the tab stayed open |
| Opens the wrong EduIDE, or "does not know the EduIDE …" | The files changed on disk but the extension was not reloaded. Chrome reads the popup and settings pages afresh, so they offer the new choice, while the background worker that opens the tab still runs the old code. Click reload on the extension's card in chrome://extensions, then reload the GitHub tab. The popup footer shows the loaded version |
| Landing page: "Invalid default selection value" | The appDef does not exist on that installation. Fix the override, or choose the right installation |
| IDE opens with the repository from an earlier test | On TUM (ephemeral storage) EduIDE-Cloud names a session after user + app only (K8sUtil.launchEphemeralSession → getSessionName(user, appDefinition, false)) and returns an existing session as it is (DefaultSessionResourceClient.launch: get(name).orElseGet(create)). A second repository in the same image therefore lands in the first one's session, and the new GIT_URI is never applied. Close the old IDE tab and wait until it stops (30 min of inactivity), pick a different image, or test with Local portal (one container per repository) |
| IDE opens with an empty workspace | The image has no Scorpio (Mannheim's thm-java-25), or the clone failed. Scorpio shows no notification when a clone fails |
- One repository per image at a time on TUM. While a session for an image is still running, every further repository opened with that image reopens it (see Troubleshooting). Fixed in EduIDE/EduIDE-Cloud#147; this limitation ends once that is deployed.
- Public repositories only. A private one would need credentials in
gitUri, which would end up in URLs, browser history and the session's environment. - The landing page shows the language picker instead of starting at once. It auto-starts only for Artemis links,
which carry an
artemisToken. - The default branch is always cloned. Scorpio has no branch parameter yet; the experimental
gitRefoption only prepares for one. - The built-in image lists were checked against each installation's live
/config.json 22 Oct 2026. Use Detect images when an installation changes its apps. - Mannheim's Java 25 image ships without Scorpio, so nothing is cloned there.