Dotfiles and One-Command Developer Machine Setup
A DevOps final year project for student societies, labs and small dev teams: a public dotfiles repository and an idempotent Bash installer that turns a fresh Ubuntu, WSL or macOS machine into a working development environment in one command, tested in CI. Small in code, but it teaches the shell, package managers, PATH and safe automation properly.
Beginner
Achievable by one student in a semester with familiar tools.3 to 4 weeks · 1 student
8 to ship
3 optional extrasSuggested stack
What you should ship
- A dotfiles repository with shell, Git, editor and SSH config templates, organised one folder per tool
- An install.sh with strict mode that detects Ubuntu, WSL or macOS and installs a documented package list
- Symlinking with timestamped backups of existing files and an uninstall script that restores them
- Idempotency: a second run on the same machine changes nothing, proven by a test in CI
- A dry-run flag that prints every change without making it
- A secrets policy: tokens and keys loaded from an untracked local file, a committed template, and a secret scanner in CI
- CI that runs ShellCheck and runs the installer on fresh Ubuntu and macOS runners, then checks key tools work
- A README explaining every step, how to undo it, and measured setup time on a fresh machine
If you have time left
- A team profile mode: a shared base for a society or small team plus personal overrides per member
- A short screen recording of a fresh machine set up from one command
- A comparison write-up: the same setup expressed in chezmoi, with trade-offs
The problem: every new laptop costs a day
Every developer rebuilds a machine sooner or later: a new laptop, a reinstall after a crash, a lab PC wiped every semester. It usually happens from memory, with half the settings missing and a day lost. The same pain hits student societies and small teams: every new member spends their first session installing Node, Git, an editor and fixing PATH instead of writing code.
A careful, tested setup script fixes this, and building one exercises most of the terminal and Git skills a developer needs: package managers, PATH, shell startup files, symlinks, permissions, error handling and CI.
What already exists and the gap
- GNU Stow is a symlink farm manager: organise files in folders and it links them into place.
- yadm wraps Git for dotfiles and adds per-machine classes, encryption and bootstrap scripts.
- chezmoi is a feature-rich dotfiles manager with templates, secret manager integration and Windows support.
- The bare Git repository pattern keeps dotfiles in a Git directory pointed at the home folder, with no extra tool.
These tools manage files very well. What they leave to you is the bootstrap: installing packages across operating systems, making a second run safe, proving it works on a clean machine, and documenting it for someone else. Most personal dotfiles repositories are also untested. The gap here is a tested, documented, idempotent setup that a team could adopt, not just one person's config.
What you build
- Repository layout with one folder per tool (shell, git, editor, ssh template, packages).
- install.sh using strict mode, checking its environment, detecting the operating system and installing from package lists.
- Linking with backups and an uninstall script.
- Secrets kept out of Git: a local file sourced by the shell, with only a template committed.
- CI that lints the scripts and runs the installer on clean runners.
Users: you first, then a student society or small team who adopt it as their onboarding script with a shared base and personal overrides.
The technically interesting part
Idempotency. Running the installer twice must produce the same machine with no errors and no duplicate lines in startup files. That means every step checks before it acts: is the package already installed, is the link already pointing at the right file, is the line already in the file. This is the same property configuration tools such as Ansible are built around, and learning it on a small script makes the idea stick.
Show your supervisor a CI job that runs the installer, captures a snapshot of the relevant files and installed packages, runs it again, and diffs the two snapshots. An empty diff is your proof.
How to evaluate it
- Clean install: time from fresh Ubuntu container or runner to working environment, measured across 3 runs.
- Idempotency: second-run diff is empty on Ubuntu and macOS.
- Quality: zero ShellCheck warnings; shell tests with bats-core for the helper functions.
- Adoption: ask 3 classmates or society members to use it on their own machine and record problems they hit.
Suggested plan
- Week 1: inventory your current setup, design the layout, write the package lists.
- Week 2: installer with OS detection, linking, backups, dry-run.
- Week 3: CI on Ubuntu and macOS, idempotency test, secret scanning.
- Week 4: team profile, user trials, README and write-up.
Path to a product
This is a learning and portfolio project, and it should be honest about that. The realistic users are you, your society and small teams who want a documented onboarding script. A well-tested template that others fork is a fine open source outcome, and the same skills lead directly to DevOps and platform internships, where "set up new developers in one command" is a common real task.
Scope warning
Do not write your own configuration management tool. Do not support every Linux distribution; Ubuntu, WSL and macOS are enough. Never commit tokens, private keys or machine-specific secrets, and read every line you copy from other people's dotfiles before adding it to yours.
Learn what you need on Sefism
- DevOps and cloud roadmap : where shell scripting and CI fit in the wider path.
- DevOps and cloud cheat sheet : quick reference for CI pipelines and Linux basics.
- Greg's Wiki: BashGuide : write Bash that does not break on spaces and errors.
- ShellCheck : the linter your CI runs on every push.
- Windows Subsystem for Linux Documentation : set up and test the WSL path properly.
- How to learn Git and GitHub properly : the Git habits this repository depends on.
Get help with this idea
This project is small, so the difference between an average and a strong result is in testing and documentation. A mentor can help you decide what belongs in scope and how to prove idempotency convincingly. If you are new here, create a free account first.
Ideas and guidance, not finished projects
These are project ideas and scoping guidance, published free for students to use as a starting point. I do not build, write, or sell final-year projects, and I do not complete coursework for anyone. Take an idea, make it yours, and build it.
Not sure this one fits you?
I help students pick an idea that matches their skills and their deadline, then scope it down until it is finishable. Guidance only, never done for you.
Stuck on something specific?
Writing only gets you so far. If you want an answer to your situation rather than the general case, book a session and we will work through it together. Sessions are free for approved Sefism members, and a few slots open each week.
Follow along
New writing, resources and project ideas land here first.