{"id":19010166,"url":"https://github.com/treehouses/builder","last_synced_at":"2026-03-05T05:31:55.486Z","repository":{"id":46130041,"uuid":"92229438","full_name":"treehouses/builder","owner":"treehouses","description":"Treehouses Awesome 👓 Raspberry Pi Image Builder 🏗","archived":false,"fork":false,"pushed_at":"2025-02-20T19:45:10.000Z","size":1566,"stargazers_count":50,"open_issues_count":63,"forks_count":22,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-04-13T10:57:35.597Z","etag":null,"topics":["balena","chroot-environment","debian","docker","docker-compose","hacktoberfest","raspberry-pi","rpi-image","travis-ci","treehouses"],"latest_commit_sha":null,"homepage":"http://download.treehouses.io","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/treehouses.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-23T23:26:55.000Z","updated_at":"2025-03-20T16:23:54.000Z","dependencies_parsed_at":"2025-02-10T19:21:15.740Z","dependency_job_id":"66d7b3dc-bf4d-4f3b-86bc-11a6e0bfe34c","html_url":"https://github.com/treehouses/builder","commit_stats":null,"previous_names":[],"tags_count":553,"template":false,"template_full_name":null,"purl":"pkg:github/treehouses/builder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treehouses%2Fbuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treehouses%2Fbuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treehouses%2Fbuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treehouses%2Fbuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/treehouses","download_url":"https://codeload.github.com/treehouses/builder/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treehouses%2Fbuilder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30111743,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T03:40:26.266Z","status":"ssl_error","status_checked_at":"2026-03-05T03:39:15.902Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["balena","chroot-environment","debian","docker","docker-compose","hacktoberfest","raspberry-pi","rpi-image","travis-ci","treehouses"],"created_at":"2024-11-08T19:10:11.567Z","updated_at":"2026-03-05T05:31:55.462Z","avatar_url":"https://github.com/treehouses.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://github.com/treehouses/builder/workflows/builder/badge.svg)](https://github.com/treehouses/builder/actions) [![Maintainability](https://api.codeclimate.com/v1/badges/748aa39277c63aa17d1a/maintainability)](https://codeclimate.com/github/treehouses/builder/maintainability) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/treehouses/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n# builder\n\n`builder` is based on [Raspbian](https://www.raspbian.org/) and\nallows the user to develop and tailor their own custom Raspberry Pi images.\nThe script will modify the latest Raspbian image by installing packages,\npurging packages and executing custom commands, and then finally\ncreates a bootable .img file that can be burned to the microSD card.\n\n## Instructions\n\nThese instructions will get you a copy of the project up and\nrunning on your local machine for development and testing purposes.\n\n### Prerequisites\n\nSystem requirements:\n\n* Operating System - Debian/Ubuntu\n* microSD card reader\n* class10 microSD card (minimum 8 Gb)\n* Packages - kpartx wget gpg parted qemu-arm-static\n\nNote:\n\nTo install the required packages, run the following command in Debian/Ubuntu:\n\n```bash\nsudo apt-get install kpartx wget gpg parted qemu-arm-static.\n```\n\nFor other operating systems like MacOS or Windows, check out the `Vagrantfile` inside the repository.\n\n### Getting Started\n\n```\ngit clone https://github.com/treehouses/builder.git\ncd builder\n./builder --chroot\n```\n\nYou should be in a chrooted environment when it is completed.\nYou can access the RPi images' files and folders or carry on with any extra modifications.\nTo exit the chrooted environment just type `exit` and\nthen you should be back in your own shell again.\nThe image in this stage is now ready to write to the microSD card.\n\n### Add gpg key\n\n```bash\nsudo bash -c 'wget -O - https://packagecloud.io/gpg.key | apt-key add -'\n```\n\n### Customize\n\n* `INSTALL_PACKAGES` - Install packages found in the APT repositories.\n\n  * To add a custom package not found in the default APT repositories:\n    add the package name into `INSTALL_PACKAGES`,\n    then add the custom repository to `ADD_REPOS`.\n\n* `PURGE_PACKAGES` - Remove packages already installed on the default Raspbian image.\n\n* `CUSTOM_COMMANDS` - Add extra commands to execute upon the completion of\n  the `builder`, which is run under a chroot environment.\n\n  * For instance, to enable ssh on boot for the RPi,\n    the command `sudo touch /boot/ssh` is included in `CUSTOM_COMMANDS`.\n    The semi-colon is there to separate the commands and\n    will execute regardless whether or not the previous command is successful.\n\n### Retrieve builds\n\nAfter exiting from the chroot environment, successful builds\nare found in the `builder/images` directory.\nThere should be a few files in that directory.\nThe .zip file is the unmodified base image,\nwhich is downloaded by the script when executed.\nThe .img file is the new customized image and\nis now ready to be burned onto the microSD card.\n\n#### To remove unwanted modifications otherwise\n\n`bash clean.sh`\n\n### Write to microSD card and try out the image\n\nWe will need a few hardware and software:\n\n* Raspberry Pi 3/4 (or Zero W)\n* 5V 2.4A/3A (1.2A for Pi Zero) power supply with microUSB connector\n* A microSD card reader\n* A [Class 10](https://www.sdcard.org/developers/overview/speed_class/index.html)\n  microSD card (minimal 8GB, but we strongly recommend 16GB or greater)\n* Software for burning OS image to microSD card. We recommend [Etcher](https://etcher.io),\n  but there are many from which to choose\n\nOpen Etcher, select the location of the .img file,\nthe destination drive of the microSD card,\nthen press the flash button to write the image onto the microSD card.\nRemember that this process will wipe out everything on the selected drive,\nso make sure to select the right one.\n\n## Release\n\nThis project uses Github Actions to automatically build and upload a new treehouse image\nto [http://dev.ole.org](http://dev.ole.org). The `builder.yml` configuration file\ntells Github Actions to run the deployment if a tag is applied to the commit.\n\n* New image's name will be `treehouse-` followed by\n  whatever is after `release-` in the tag\n* New image's SHA-1 checksum will be calculated and uploaded as `\u003cimage_name\u003e.img.gz.sha1`\n* If the tag is formated like `release-` followed by only numbers,\n  `latest.img.gz` and `latest.img.gz.sha1` would be a symbolic link of\n  the newly uploaded image and its SHA-1 checksum\n* At this time, both `stable.img.gz` and `branch.img.gz` on [http://dev.ole.org](http://dev.ole.org)\n  are manually linked to their specific image\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftreehouses%2Fbuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftreehouses%2Fbuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftreehouses%2Fbuilder/lists"}