Yesterday, GitLab, where git projects were formerly hosted, announced changes to their terms of service to incorporate mandatory1 telemetry – both on its SaaS website, and its proprietary self-managed products – causing significant consternation among many. This follows the acquisition of GitHub by Microsoft last year, after which (on 20 January 2019) I had previously migrated my git projects from GitHub to GitLab.

While this is not in itself hugely concerning, I am a strong believer in software freedom. Indeed, this is why I left GitHub after its acquision by Microsoft – the creator of the ‘Embrace, Extend, Extinguish’ model. Mandatory telemetry violates freedom 1 of the four essential software freedoms, and the dilution of free software approaches by ‘open core’ models and conflicting commercial interests is unfortunate (though admittedly better than nothing).

Since circa 2015,2 I have been moving away from commercial/SaaS cloud software towards self-hosted free software for many of my needs, including email, file storage and DDNS. My continued reliance, then, on proprietary cloud software to host my own free software projects has been a bit of an outlier. GitLab's changes to its terms of service provide an apt opportunity to rectify this.

My current git projects have now been transferred from GitLab to this server, accessible through a cgit web interface at

To assist in the migration of git repositories from GitLab to cgit, I whipped up a small bash snippet to initialise a bare git repository with the appropriate name and description, rename the git remote corresponding to GitLab, and push to the new one:

DESC="GNU PSPP kernel for Jupyter"
cd "/path/to/cgit/"
git init --bare "$NAME"
echo "$DESC" > "$NAME/description"
cd "$GDIR/$NAME"
git remote rename origin gitlab
git remote add origin "/path/to/cgit/$NAME"
git push -u origin --all
git push origin --tags

Each git repository migrated off GitLab (and, prior to that, off GitHub) has also been replaced with a message directing viewers to the new location. For example, above. I created a small bash snippet to help with this also:

git clone$NAME.git
cd $NAME
git remote add gh$NAME.git
echo "This project has moved to$NAME/" >>
echo Edit as required, delete all other files, then press Enter to continue
git add .
git commit -S -m "Moved to$NAME/"
git push
git push gh --all

As with the GitHub-to-GitLab migration that preceded it, this present migration to self-hosted cgit has left some inactive legacy projects on GitLab. At this time, the end of a chapter, it seems appropriate to briefly reflect on some of these:

  • RevisionBank, an (incomplete) wiki-style website, designed to host a collaboratively-editable source of notes for the Monash medicine course, with machine-indexable multiple-choice and short-answer questions built into the document structure, à la TempleOS's DolDoc. This was an ambitious project embarked upon in my second year of medicine, as Vice-President (Preclinical) at the Monash University Medical Students' Society. That year, the course was altered so that all preclinical examinations were formative, greatly reducing the need for such a tool, and work was discontinued. Lately, the Monash University Coding Interest Group in Medicine and Healthcare has taken up the mantle on a similar revision-based project, AORTA.

  • reader.js, a lightweight browser-based EPUB reader with cloud-based annotation functionality. I used this to annotate texts in my senior school English class (fat lot of good that did!). The annotation functionality interfaced with AnnotateIt, which is now defunct, and I have Kobo e-reader now anyway.

  • pyNSrecruit, a moderately-popular tool for the NationStates recruitment API. It is still functional, but has always been a bit buggy and a headache to debug. I am no longer active on NationStates (though I keep my account, South Jarvis, alive) and have not actively developed the tool for years. (As an aside, putting the letters ‘pyNS’ together is an illustration of why programmers are often not good at naming software.)

  • LibreNS++, a userscript-based extension to add functionality to NationStates, à la RES for Reddit. I developed this after the leading tool, NationStates++, was misused by its creator to push an in-game political campaign. Looking back, it's clear that my positions about software freedom and moral values have been around for a long time.

  • Log, a very (very!) old Minecraft Bukkit project to log user actions.3 Data was stored in a plaintext file, which was read back every time a query was performed – absolutely no ACID here; even SQLite seemed too daunting at the time. Now, of course, I know better! It was envisaged that Log would be rewritten as exLog, with things like SQLite support, but that never got off the ground.


  1. A separate GitLab blog post notes that ‘ and GitLab Self-Managed’ will, however, ‘honour the Do Not Track (DNT) mechanism in web browsers’, and browsers supplying the DNT header will not be served telemetry scripts. 

  2. See here a blast from the past – an earlier post of mine on this topic from 2016 

  3. Looking back, I see that I licensed Log under a zlib/libpng licence! How quaint!