Unmanic states GPL version 3 and then pastes an MIT notice
Unmanic - Library Optimiser
At a glance
- What is it?
- Unmanic is a Python library optimiser that queues files for custom commands through a web interface. The page declares the project under the GPL version 3 and then reproduces an MIT style permission notice under it, the file monitor that is one of its four headline features sits in the optional block of the requirements file, and the packaging metadata still lives in a setup script while pyproject holds only lint settings.
- Who is it for?
- Unmanic suits a media library owner who wants transcoding, ad removal, ageing and custom file commands driven by a queue and a web interface rather than by hand, and who is willing to give a running process write access to the library. Before adopting it, read the licence section properly, because the page pairs a GPL version 3 statement with an MIT shaped permission notice and points third party licences at their own sources rather than listing them.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 5, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The licence section names the GPL and then prints an MIT notice
The last section of the page is where the two statements sit next to each other. It opens by saying the project is licensed under the GPL version 3, with the word projected misspelled in the sentence. Under that line comes a permission notice that is the MIT text: permission is granted free of charge to any person obtaining a copy of the software to deal in it without restriction, including the rights to use, copy, modify, merge, publish, distribute, sublicense and sell, provided the copyright notice is included in all copies. Those are two different licences, and only one of them is the one the project files itself under. The page then adds that the project contains libraries imported from external authors and that you should refer to those sources for their licences, which is an honest admission that the dependency set is not homogeneous. The copyright line reads Josh Sunnex, All Rights Reserved, and the contributing link points at a file inside the `docs/` directory rather than at a contributing guide in the root.
Three screenshot headings carry no images
The table of contents promises three subsections under screen-shots, and all three exist as headings with nothing under them: Dashboard, File metrics and Installed plugins. Those are the three views a new user most wants to see, since the dashboard is where queued work would be visible, the file metrics page is where you would confirm the library was indexed, and the plugins page is where you would see what has been installed. The badge row above them has its own gap: one entry is an empty markdown link with no URL inside the parentheses, and three Docker Hub badges point at exactly the same image address, `josh5/unmanic`. The image lives under a personal Docker Hub account rather than the project organisation, which matches the pattern elsewhere on the page: a donation link, a personal copyright holder and a container published by one person.
Packaging lives in a setup script while pyproject holds lint settings only
The build configuration is split across three files, and the modern one carries nothing about the project. `pyproject.toml` contains four ruff tables and nothing else: a target version of py310, a line length of 120, a formatter configured for double quotes and space indentation, and a lint selection of the pycodestyle, pyflakes and import rules. There is no project table and no build system table in it, so the name, version, dependencies and entry point are not declared there. Those live in `setup.py`, which opens with a docstring dated 04 May 2020, imports setuptools and its build command, and starts with a guard that prints a message and exits if the interpreter is Python 2. `setup.cfg` and a `MANIFEST.in` sit beside it, and `versioninfo.py` holds the version as a separate file. So a project built in 2026 still installs through a script whose first job is to reject Python 2. The version itself lives in a separate file, `versioninfo.py`, rather than in either manifest, and `setup.cfg` and a `MANIFEST.in` sit alongside to carry packaging metadata and file lists that the setup script reads. Nothing in the four ruff tables says anything about the package itself, which means a reader who opens the modern configuration file first learns the line length and nothing about what is being distributed.
The file monitor depends on a package in the optional block
The requirements file separates its entries with comments rather than with extras, and one of the four headline features lands in the optional group. The required block holds the scheduler library, the web server, a schema library, an ORM with its migration tool, a process and CPU information library, an HTTP client with its toolbelt, a CPU information package, a JSON log formatter and a hash library. The optional block holds the file system watcher and an error reporting client. The watcher is what the second main function is built on: the file and directory monitor that notices a modified file or a new file and tests it against the presets again. Since the instructions tell you to install the whole file with `python3 -m pip install -r requirements.txt`, the distinction is documentation rather than packaging, but it does mean a reader scanning for the monitor's dependency has to know that the word optional in that file refers to the code path rather than to the install.
What actually happens to your files once it is running
The description is about three moving parts and one interface. A scheduler scans the whole library for files that do not match the configured file presets and queues the ones that need work. A file and directory monitor does the same test again when a file is modified or added. A handler manages running several file manipulation tasks at a time. A web interface configures all of it and shows the progress. What the queued task does is entirely yours: the examples given are transcoding video or audio into a uniform format with FFmpeg, identifying and optionally removing commercials from DVR recordings shortly after they have finished recording, moving files from one location to another after a configured period, running FileBot renames on files as they arrive, compressing files older than a specified age, and running any custom command against files matching an extension or above a configured size. No preset, filename pattern or command is given on the page, so a first run means configuring everything yourself.
Two ways in, and neither documents the Docker route
The install section does two things. It points at the documentation site for up to date instructions, which is the project's own docs domain, and it gives a from source sequence:
# Ensure the submodules are checked out
git submodule update --init --recursive
# Build and install the project into your home directory
python3 ./setup.py install --user
# Run Unmanic
unmanicThen you open a browser at `http://localhost:8888/`. So the local interface is a plaintext HTTP port on the loopback address, started by a command installed into a personal bin directory. Meanwhile three badges point at a container image on Docker Hub, and the tree carries both a `docker/` directory and a `devops/` directory, so there is a container path that the page badges but never explains, and the repository's own documentation is where you would find it.
Python is stated four ways and never as a floor
The dependencies section asks for Python 3.x and links the python.org downloads page. The setup script refuses anything below Python 3 at import time. The lint configuration targets py310, so the code is written against a 3.10 baseline even though nothing tells you that is required. And a `.python-version` file sits at the repository root, which is the file version managers read to pin an interpreter for contributors. Four statements, and not one of them is a number a consumer can act on. That matters for a tool whose whole job is to run indefinitely against a large library: the floor decides which Python your host has to be, and here you would have to infer it from a lint setting and a file that only exists for the project's own development.
Editorial conclusion
Unmanic suits a media library owner who wants transcoding, ad removal, ageing and custom file commands driven by a queue and a web interface rather than by hand, and who is willing to give a running process write access to the library. Before adopting it, read the licence section properly, because the page pairs a GPL version 3 statement with an MIT shaped permission notice and points third party licences at their own sources rather than listing them. Check which dependencies you actually need, since the file monitor depends on one that sits in the optional block of the requirements file. And plan for the packaging shape, which is a setup script with a Python 2 guard rather than a project table in pyproject. It runs commands you configure against your own files, so test on a copy of the library first.
Frequently asked questions
What does Unmanic do?
It is a library optimiser. A scheduler scans a library for files that do not match your configured file presets and queues them, a file and directory monitor re-tests anything modified or added, a handler runs several file manipulation tasks at once, and a web interface configures and monitors it. The tasks are commands you supply, such as FFmpeg transcoding, removing commercials from DVR recordings, moving or compressing files by age, or running FileBot renames.
how to install unmanic
The page sends you to docs.unmanic.app for current instructions. From source it is three steps: `git submodule update --init --recursive`, then `python3 ./setup.py install --user`, then run `unmanic` and open http://localhost:8888/. Dependencies go in first with `python3 -m pip install -r requirements.txt`. Container images are published on Docker Hub under the josh5 account.
Is Unmanic open source?
The licence recorded for the repository is the GNU General Public License version 3, and the page names a copyright holder and a licence version. The same section then reproduces an MIT style permission notice, and it states that the project contains libraries imported from external authors whose own licences should be consulted at their sources.
how to use unmanic
You point it at a library, define file presets, and choose what happens to files that do not match: transcode with FFmpeg, strip commercials from DVR recordings, move or compress by age, run FileBot renames, or run your own command against a matching extension or a size threshold. The web interface on port 8888 is where configuration and queue progress live.
is unmanic free
The page describes no paid edition and no feature gating. It states the GPL version 3 licence, carries a donation link, and links a Docker Hub image. The only cost the page mentions is your own: because it runs commands you configure, the dependencies those commands need have to be installed on your system as well.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/unmanic-unmanic)