{"id":14632793,"url":"https://github.com/a1ex4/ownfoil","last_synced_at":"2026-02-05T17:07:05.114Z","repository":{"id":71914308,"uuid":"375311414","full_name":"a1ex4/ownfoil","owner":"a1ex4","description":"Switch library manager, with a self-hosted Tinfoil Shop.","archived":false,"fork":false,"pushed_at":"2025-02-24T20:55:44.000Z","size":589,"stargazers_count":513,"open_issues_count":15,"forks_count":56,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-04-01T01:36:30.936Z","etag":null,"topics":["atmosphere","homebrew","nintendo-switch","nintendo-switch-hacking","self-hosted","sigpatches","switch","tinfoil"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/a1ex4.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2021-06-09T10:13:19.000Z","updated_at":"2025-03-31T19:20:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"86f0e52b-e91d-4e0c-89f9-fe23c8b194ca","html_url":"https://github.com/a1ex4/ownfoil","commit_stats":{"total_commits":173,"total_committers":4,"mean_commits":43.25,"dds":"0.36416184971098264","last_synced_commit":"522d52e2b3b0eaae1fa988280e9f69cce1dbb6c5"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a1ex4%2Fownfoil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a1ex4%2Fownfoil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a1ex4%2Fownfoil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a1ex4%2Fownfoil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/a1ex4","download_url":"https://codeload.github.com/a1ex4/ownfoil/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247765353,"owners_count":20992289,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["atmosphere","homebrew","nintendo-switch","nintendo-switch-hacking","self-hosted","sigpatches","switch","tinfoil"],"created_at":"2024-09-09T17:00:39.809Z","updated_at":"2026-02-05T17:07:05.099Z","avatar_url":"https://github.com/a1ex4.png","language":"Python","funding_links":[],"categories":["Software","Python","homebrew"],"sub_categories":["Games - Administrative Utilities \u0026 Control Panels"],"readme":"# Ownfoil\n[![Latest Release](https://img.shields.io/docker/v/a1ex4/ownfoil?sort=semver)](https://github.com/a1ex4/ownfoil/releases/latest)\n[![Docker Pulls](https://img.shields.io/docker/pulls/a1ex4/ownfoil)](https://hub.docker.com/r/a1ex4/ownfoil)\n[![Docker Image Size (latest semver)](https://img.shields.io/docker/image-size/a1ex4/ownfoil?sort=date\u0026arch=amd64)](https://hub.docker.com/r/a1ex4/ownfoil/tags)  \n![Static Badge](https://img.shields.io/badge/platforms-amd64%20%7C%20%20arm64%2Fv8%20%7C%20arm%2Fv7%20%7C%20arm%2Fv6-8A2BE2)\n\nOwnfoil is a Nintendo Switch library manager, that will also turn your library into a fully customizable and self-hosted Tinfoil Shop. The goal of this project is to manage your library, identify any missing content (DLCs or updates) and provide a user friendly way to browse your content. Some of the features include:\n\n - multi user authentication\n - web interface for configuration\n - web interface for browsing the library\n - content identification using decryption or filename\n - Tinfoil shop customization\n\nThe project is still in development, expect things to break or change without notice.\n\n# Table of Contents\n- [Installation](#nstallation)\n- [Usage](#usage)\n- [Roadmap](#roadmap)\n- [Similar Projects](#similar-projects)\n\n# Installation\n## Using Docker\n### Docker run\n\nRunning this command will start the shop on port `8465` with the library in `/your/game/directory` :\n\n    docker run -d -p 8465:8465 -v /your/game/directory:/games -v /your/config/directory:/app/config --name ownfoil a1ex4/ownfoil\n\nThe shop is now accessible with your computer/server IP and port, i.e. `http://localhost:8465` from the same computer or `http://192.168.1.100:8465` from a device in your network.\n\n### Docker compose\nCreate a file named `docker-compose.yml` with the following content:\n```\nversion: \"3\"\n\nservices:\n  ownfoil:\n    container_name: ownfoil\n    image: a1ex4/ownfoil\n   # environment:\n   #   # For write permission in config directory\n   #   - PUID=1000\n   #   - PGID=1000\n   #   # to create/update an admin user at startup\n   #   - USER_ADMIN_NAME=admin\n   #   - USER_ADMIN_PASSWORD=asdvnf!546\n   #   # to create/update a regular user at startup\n   #   - USER_GUEST_NAME=guest\n   #   - USER_GUEST_PASSWORD=oerze!@8981\n    volumes:\n      - /your/game/directory:/games\n      - ./config:/app/config\n    ports:\n      - \"8465:8465\"\n```\n\u003e [!NOTE]\n\u003e You can control the `UID` and `GID` of the user running the app in the container with the `PUID` and `PGID` environment variables. By default the user is created with `1000:1000`. If you want to have the same ownership for mounted directories, you need to set those variables with the UID and GID returned by the `id` command.\n\nYou can then create and start the container with the command (executed in the same directory as the docker-compose file):\n\n    docker-compose up -d\n\nThis is usefull if you don't want to remember the `docker run` command and have a persistent and reproductible container configuration.\n\n## Using Python\nClone the repository using `git`, install the dependencies and you're good to go:\n```\n$ git clone https://github.com/a1ex4/ownfoil\n$ cd ownfoil\n$ pip install -r requirements.txt\n$ python app/app.py\n```\nTo update the app you will need to pull the latest commits.\n\n## Tinfoil setup\nIn Tinfoil, add a shop with the following settings:\n - Protocol: `http` (or `https` if using a SSL enabled reverse proxy)\n - Host: server/computer IP, i.e. `192.168.1.100`\n - Port: host port of the container, i.e. `8000`\n - Username: username as created in Ownfoil settings (if the shop is set to Private)\n - Password: password as created in Ownfoil settings (if the shop is set to Private)\n\n# Usage\nOnce Ownfoil is running you can access the Shop Web UI by navigating to the `http://\u003ccomputer/server IP\u003e:8465`.\n\n## User administration\nOwnfoil requires an `admin` user to be created to enable Authentication for your Shop. Go to the `Settings` to create a first user that will have admin rights. Then you can add more users to your shop the same way.\n\n## Library administration\nIn the `Settings` page under the `Library` section, you can add directories containing your content. You can then manually trigger the library scan: Ownfoil will scan the content of the directories and try to identify every supported file (currently `nsp`, `nsz`, `xci`, `xcz`).\nThere is watchdog in place for all your added directories: files moved, renamed, added or removed will be reflected directly in your library.\n\n## Titles configuration\nIn the `Settings` page under the `Titles` section is where you specify the language of your Shop (currently the same for all users).\n\nThis is where you can also upload your `console keys` file to enable content identification using decryption, instead of only using filenames. If you do not provide keys, Ownfoil expects the files to be named `[APP_ID][vVERSION]`.\n\n## Shop customization\nIn the `Settings` page under the `Shop` section is where you customize your Shop, like the message displayed when successfully accessing the shop from Tinfoil or if the shop is private or public.\n\n# Roadmap\nPlanned feature, in no particular order.\n - Library browser:\n    - [ ] Add \"details\" view for every content, to display versions etc\n - Library management:\n    - [ ] Rename and organize library after content identification\n    - [ ] Delete older updates\n    - [ ] Automatic nsp/xci -\u003e nsz conversion\n - Shop customization:\n    - [ ] Encrypt shop\n - Support emulator Roms\n    - [ ] Scrape box arts\n    - [ ] Automatically create NSP forwarders\n - Saves manager:\n    - [ ] Automatically discover Swicth device based on Tinfoil connection\n    - [ ] Only backup and serve saves based on the user/Switch\n - External services:\n    - [ ] Integrate torrent indexer Jackett to download updates automatically\n\n# Similar Projects\nIf you want to create your personal NSP Shop then check out these other similar projects:\n- [eXhumer/pyTinGen](https://github.com/eXhumer/pyTinGen)\n- [JackInTheShop/FT-SCEP](https://github.com/JackInTheShop/FT-SCEP)\n- [gianemi2/tinson-node](https://github.com/gianemi2/tinson-node)\n- [BigBrainAFK/tinfoil_gdrive_generator](https://github.com/BigBrainAFK/tinfoil_gdrive_generator)\n- [ibnux/php-tinfoil-server](https://github.com/ibnux/php-tinfoil-server)\n- [ramdock/nut-server](https://github.com/ramdock/nut-server)\n- [Myster-Tee/TinfoilWebServer](https://github.com/Myster-Tee/TinfoilWebServer)\n- [DevYukine/rustfoil](https://github.com/DevYukine/rustfoil)\n- [Orygin/gofoil](https://github.com/Orygin/gofoil)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa1ex4%2Fownfoil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fa1ex4%2Fownfoil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa1ex4%2Fownfoil/lists"}