DEV Community

Cover image for From Module to GitHub Repository in One Click
Thomas Hansen
Thomas Hansen

Posted on • Originally published at hyperlambda.dev

From Module to GitHub Repository in One Click

Yesterday one of my modules became a GitHub repository. The whole ceremony: hover the folder, click the branch icon, write a commit message, click Publish.

Behind that one click, Magic created a private repository on GitHub, added it as the module's origin remote, pushed the commit, and configured upstream tracking. Four git operations, zero terminal.

You know the manual version of this dance. Create the repository in GitHub's UI or with gh repo create, copy the URL, git remote add origin, git push -u origin master, and somewhere in the middle a context switch that costs more than all the commands combined. That dance is now a button — because Hyper IDE has Git built in, and this article is the tour.

Where Git lives

Every top level folder inside /modules/ and /etc/ is treated as a repository root. Hover one in Hyper IDE's file tree, and a branch icon appears among its actions — that is the whole discovery story. One repo per module, deliberately: the module is already the unit of install, the unit of deployment, and the unit of meaning in Magic. Now it is the unit of versioning too.

A module folder's action buttons in Hyper IDE's file tree, with the Git branch icon among them

The panel

Click the icon and you get the state of that repository: which branch you are on, whether you are ahead of or behind your remote, and every modified and untracked file. Commit everything with a message, push, pull, fetch, switch branches, create new ones.

Hyper IDE's Git panel showing branch, tracking status, and commit actions for a module

The detail I care most about is what you cannot click. Push is greyed out until you actually have commits your remote does not. Clone demands an empty folder, because git demands an empty folder. A freshly initialized repository disables everything that requires a commit to exist. The panel teaches you git's rules by construction, instead of relaying git's error messages after the fact.

One token, no keychain

Setup is a single dialog: open Configuration, click the hamburger menu, choose Git…, and give it your GitHub username and a fine-grained personal access token with Contents read and write access.

The Git settings dialog on the Configuration screen, with GitHub username, token and host

The architecture behind that dialog matters more than the dialog. Credentials are injected per git invocation, over HTTPS, as a header — nothing is ever written to the server's global git configuration, no credential helper, no SSH keys sitting on disk. And commits are authored as you: the author name and email are resolved from the signed-in user's profile, so your history on GitHub shows your name, not some shared server identity. The token authenticates transport; people author commits.

The one click

Back to the headline. Take any module — say one you have been building all week — and open its Git panel. Not a repository yet? Click Initialize repository. Write a commit message, click Commit. Then click Publish to GitHub…, and give the repository a name — it defaults to the module's folder name, which is almost always the right answer.

Publishing a module to GitHub from Hyper IDE, prompting for the new repository's name

That click creates the repository on GitHub — private by default, flip it to public over there if that is what you want — wires it up as origin, pushes your commit, and sets upstream tracking. Your module has a home, a history, and a URL.

Notice, creating repositories needs one more permission than reading and writing them: the account level repository creation permission on your access token, in addition to Contents. If your token lacks it, the panel will tell you so in plain text, because errors here are never swallowed.

The door swings both ways

Publishing is half the story. The other half: create a new empty folder inside /modules/, open its Git panel, and you get the mirror options — initialize, or clone.

Hyper IDE's Git panel on a folder that is not yet a repository, offering clone and initialize actions

Click Clone into folder, paste the repository's HTTPS URL, and the module lands on your cloudlet with its entire history attached. It checks out whatever the remote's default branch happens to be called — the panel has no opinions in the main-versus-master wars, and after debugging that assumption out of an earlier iteration, neither do I.

Cloning a GitHub repository into a module folder in Hyper IDE, prompting for the HTTPS URL

Modules travel now

Here is why this is more than a convenience feature.

Magic has always let you move modules between cloudlets as zip files — download here, install there. A zip is a snapshot. Git is a history: branches, rollback, blame, and a remote that two cloudlets can both talk to. Develop a module on your dev cloudlet, publish it, clone it into production, and from then on promotion is a pull. The zip workflow did not go anywhere — but the module you care about, the one that grows for months, wants version control, and now the platform it lives on speaks it natively.

And because everything in Magic is reachable by agents, the same is true over MCP — the git workflow tools have been callable by AI agents for a while. What is new is that humans got the good UI too.

The fine print

Big claims, precise edges — as always.

This is not a full git client, and it does not want to be. Commit stages everything the change list shows — there is no per-file staging in v1. There is no diff viewer and no merge-conflict UI; if a pull lands you in conflict territory, clone the repository locally and resolve it with real tooling, then push. The panel covers the module lifecycle — initialize, commit, branch, publish, clone, pull, push — not interactive rebases.

One deliberate sharp edge worth knowing: paths must be repository roots. Git's normal upward discovery is disabled on the server, so a folder that is not itself a repo throws instead of silently operating on some enclosing repository it happened to find above itself. That rule exists because during development, the panel on a repo-less folder cheerfully offered to commit the entire Magic source tree it found two levels up. Loud beats silent, every single time.

The whole feature was built in a day, driving Claude against the running dashboard — including three separate ambushes by a hardcoded main branch assumption and the discovery bug above. That story, bug ledger and all, is its own article.

The keys

Magic is MIT-licensed and open source — the repository is at github.com/polterguy/magic, with documentation at docs.ainiro.io. If you want a cloudlet of your own to publish modules from, it is one copy-paste on a $6 DigitalOcean droplet.

Related reading

Originally published at hyperlambda.dev.

Top comments (0)