{"id":18991442,"url":"https://github.com/aziascreations/circuitpython-customfilesystems","last_synced_at":"2026-06-15T20:31:20.700Z","repository":{"id":100759754,"uuid":"602631471","full_name":"aziascreations/CircuitPython-CustomFileSystems","owner":"aziascreations","description":"A set of examples of custom file systems and block-level devices for CircuitPython that can be used for educational purposes and expanded upon.","archived":false,"fork":false,"pushed_at":"2023-02-20T00:25:30.000Z","size":28,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-21T07:26:29.655Z","etag":null,"topics":["block-level","circuitpython","circuitpython-project","filesystem"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aziascreations.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":"2023-02-16T16:08:07.000Z","updated_at":"2023-05-25T07:24:49.000Z","dependencies_parsed_at":"2023-06-09T16:00:09.487Z","dependency_job_id":null,"html_url":"https://github.com/aziascreations/CircuitPython-CustomFileSystems","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aziascreations/CircuitPython-CustomFileSystems","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aziascreations%2FCircuitPython-CustomFileSystems","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aziascreations%2FCircuitPython-CustomFileSystems/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aziascreations%2FCircuitPython-CustomFileSystems/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aziascreations%2FCircuitPython-CustomFileSystems/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aziascreations","download_url":"https://codeload.github.com/aziascreations/CircuitPython-CustomFileSystems/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aziascreations%2FCircuitPython-CustomFileSystems/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34379915,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["block-level","circuitpython","circuitpython-project","filesystem"],"created_at":"2024-11-08T17:13:53.361Z","updated_at":"2026-06-15T20:31:20.682Z","avatar_url":"https://github.com/aziascreations.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CircuitPython - Custom File Systems\nThis repo contains multiple experiments with virtual file system for [CircuitPython](https://github.com/adafruit/circuitpython)\nthat attempt to emulate a conventional storage device at the file system and block-device level.\n\n## Preamble\nOne of the main advantage of this project is that it give you a strong, clear, and documented starting point for future\nexperiments that may require virtual file systems and block-level devices.\n\nFor example, by using the blank examples, you can easily create a bootstrapping code and file system that connects\nsecurely to a remote server and pulls code directly from it without ever having touch the disk.\u003cbr\u003e\nThis is, at the very least, an interesting experiment from a data forensics and security point-of-view as it forces you\nto dabble in and learn a bit in both of these fields.\n\nThe second main advantage is as an educational tool.\u003cbr\u003e\nDue to the permissive nature of Python and CircuitPython's APIs, it lets someone test out different designs and\nmechanisms for their file systems without running the risk of corrupting unrelated data or bricking their device.\nAdditionally, it is possible add logging to many of the methods which in turn allows you to see and understand parts of\nthe inner workings of CircuitPython itself.\n\n## Warning\nThis project is an experiment and shouldn't be used as-is in any production or remotely sensitive environment as\nthey are vulnerable to many types of attacks if you don't modify them in order to secure them further.\n\nIn CircuitPython 8.0, it appears to be impossible to properly mount a file system inside another folder than the\ndevice's root folder.\u003cbr\u003e\nSee \"[Notes -\u003e Bugs -\u003e Invalid Mounting Point](Notes/Bugs.md#invalid-mounting-point)\" for more info.\n\n## Requirements\n* A device with CircuitPython 8.0 or newer flashed onto it.\n  * Access to the [zlib](https://docs.circuitpython.org/en/latest/shared-bindings/zlib/index.html) module is required for most block-level projects due to space constraints.\n  * Wi-Fi connectivity is required for some projects.\n  * It is recommended to have around 1 MiB of disk space and 48 KiB of RAM free on the device itself.\n* A way to mount disk images on you computer for block-level projects.\n  * [ImDisk's Ram Disk tool](https://sourceforge.net/projects/imdisk-toolkit/) is recommended for Windows.\n  * I don't know about Linux, sorry.\n* A lot of patience to deal with some of CircuitPython's quirks.\n  * See the \"[Notes -\u003e Bugs](/Notes/Bugs.md)\" document for more info on some bugs found during this project.\n\n## Summary\n* File Systems\n  * Blank\n  * Read-Only Memory\n* Block-level devices\n  * Stub\n  * Remote\n\n## File Systems\n\n### [Blank](FS-Blank)\nBlank file system with a lot of comments on how each procedure works and what it should return.\u003cbr\u003e\nWhen its content is listed, it is shown as being empty.\n\nThis file system has a LOT more comments than the others which explains in much more details how each important method works.\n\n### [Read-Only Memory](FS-ReadOnlyMemory)\nSimple read-only file system that provides 3 files contained within a private constant in the \"[fs_rom.py](FS-ReadOnlyMemory/fs_rom.py)\" file.\n\nThe goal of this file system is to illustrate how directory listings are done, and how files openned in `r*` modes are handled internally.\n\n## Block-level Devices\n\n### [Stub](BLD-Stub)\nStub of a generic block-level class without any code, but detailed comments for each required methods and their warnings and notes.\n\nThe reasoning behind not making this one a working class is that block-level devices require quite a bit more code to\nmake them work as you need to create a working MBR and FAT partition.\n\n### [Remote](BLD-Remote)\nBLD class that uses an HTTP connection to get and send sectors from a remote Flask server.\n\nThe inner workings of this example are detailed in the [BLD-Remote/readme.md](BLD-Remote/readme.md) file.\n\n## License\nThis repo is license under the [MIT license](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faziascreations%2Fcircuitpython-customfilesystems","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faziascreations%2Fcircuitpython-customfilesystems","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faziascreations%2Fcircuitpython-customfilesystems/lists"}