{"id":13509032,"url":"https://github.com/micromdm/nanomdm","last_synced_at":"2025-12-25T07:03:28.111Z","repository":{"id":37596756,"uuid":"363723848","full_name":"micromdm/nanomdm","owner":"micromdm","description":"NanoMDM is a minimalist Apple MDM server and library heavily inspired by MicroMDM","archived":false,"fork":false,"pushed_at":"2025-03-26T15:58:11.000Z","size":312,"stargazers_count":273,"open_issues_count":13,"forks_count":50,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-04-01T11:04:13.023Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","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/micromdm.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":"2021-05-02T18:37:27.000Z","updated_at":"2025-03-31T03:11:05.000Z","dependencies_parsed_at":"2023-02-09T13:46:24.144Z","dependency_job_id":"49623dd7-8d8b-45ed-bd28-9689b70d6462","html_url":"https://github.com/micromdm/nanomdm","commit_stats":{"total_commits":201,"total_committers":18,"mean_commits":"11.166666666666666","dds":0.2736318407960199,"last_synced_commit":"bb3a8af93bdf8f26128ad5ddcb9334976fa1d5f0"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micromdm%2Fnanomdm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micromdm%2Fnanomdm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micromdm%2Fnanomdm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micromdm%2Fnanomdm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/micromdm","download_url":"https://codeload.github.com/micromdm/nanomdm/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247838444,"owners_count":21004580,"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":[],"created_at":"2024-08-01T02:01:02.036Z","updated_at":"2025-12-25T07:03:23.057Z","avatar_url":"https://github.com/micromdm.png","language":"Go","funding_links":[],"categories":["Go","Tools :hammer_and_wrench:","others"],"sub_categories":[],"readme":"# NanoMDM\n\n[![CD/CD](https://github.com/micromdm/nanomdm/actions/workflows/on-push-pr.yml/badge.svg)](https://github.com/micromdm/nanomdm/actions/workflows/on-push-pr.yml) [![Go Reference](https://pkg.go.dev/badge/github.com/micromdm/nanomdm.svg)](https://pkg.go.dev/github.com/micromdm/nanomdm)\n\nNanoMDM is a minimalist [Apple MDM](https://developer.apple.com/documentation/devicemanagement) server and library heavily inspired by [MicroMDM](https://github.com/micromdm/micromdm).\n\n## Getting started \u0026 Documentation\n\n- [Quickstart](docs/quickstart.md)  \nA quick guide to get NanoMDM up and running using ngrok.\n\n- [Operations Guide](docs/operations-guide.md)  \nA brief overview of the various command-line switches and HTTP endpoints and APIs available to NanoMDM.\n\n## Getting the latest version\n\n* Release `.zip` files containing the server and supplementals should be attached to every [GitHub release](https://github.com/micromdm/nanomdm/releases).\n  * Release zips are also [published](https://github.com/micromdm/nanomdm/actions) for every `main` branch commit.\n* A Docker container is built and [published to the GHCR.io](http://ghcr.io/micromdm/nanomdm) registry for every release.\n  * `docker pull ghcr.io/micromdm/nanomdm:latest` — `docker run ghcr.io/micromdm/nanomdm:latest`\n  * A Docker container is also published for every `main` branch commit (and tagged with `:main`)\n* If you have a [Go toolchain installed](https://go.dev/doc/install) you can checkout the source and simply run `make`.\n\n## Features\n\n- Horizontal scaling: zero/minimal local state. Persistence in storage layers. MySQL and PostgreSQL backends provided in the box.\n- Multiple APNs topics: potentially multi-tenant.\n- Multi-command targeting: send the same command (or pushes) to multiple enrollments without individually queuing commands.\n- Migration endpoint: allow migrating MDM enrollments between storage backends or (supported) MDM servers\n- Otherwise we share many features between MicroMDM and NanoMDM, such as:\n  - A MicroMDM-emulating HTTP webhook/callback.\n  - Enrollment-certificate authorization\n  - API-driven interaction (queuing of commands, APNs pushes, etc.)\n\n## $x not included\n\nNanoMDM is but one component for a functioning MDM server. At a minimum you need a SCEP server and TLS termination, for example. If you've used [MicroMDM](https://github.com/micromdm/micromdm) before you might be interested to know what NanoMDM does *not* include, by way of comparison.\n\n- SCEP.\n  - Spin up your own [scep](https://github.com/micromdm/scep) server. Or bring your own.\n- TLS.\n  - You'll need to provide your own reverse proxy/load balancer that terminates TLS.\n- ADE (DEP) API access.\n  - While ADE/DEP *enrollments* are supported there is no DEP API access.\n- Enrollment (Profiles).\n  - You'll need to create and serve your own enrollment profiles to devices.\n- Blueprints.\n  - No 'automatic' command sending upon enrollment. Entirely driven by webhook or other integrations.\n- JSON command API.\n  - Commands are submitted in raw Plist form only. See the [cmdr.py tool](tools/cmdr.py) that helps generate raw commands\n  - The [micro2nano](https://github.com/micromdm/micro2nano) project provides an API translation server between MicroMDM's JSON command API and NanoMDM's raw Plist API.\n- VPP.\n- Enrollment (device) APIs.\n  - No ability, yet, to inspect enrollment details or state.\n  - This is partly mitigated by the fact that both the `file` and `mysql` storage backends are \"easy\" to inspect and query.\n\n## Architecture Overview\n\nNanoMDM, at its core, is a thin composable layer between HTTP handlers and a set of storage abstractions.\n\n- The \"front-end\" is a set of standard Golang HTTP handlers that handle MDM and API requests. The core MDM handlers adapt the requests to the service layer. These handlers exist in the `http` package.\n- The service layer is a composable interface for processing and handling MDM requests. The main NanoMDM service dispatches to the storage layer. These services exist under the `service` package.\n- The storage layer is a set of interfaces and implementations that store \u0026 retrieve MDM enrollment and command data. These exist under the `storage` package.\n\nYou can read more about the architecture in the blog post [Introducing NanoMDM](https://micromdm.io/blog/introducing-nanomdm/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicromdm%2Fnanomdm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmicromdm%2Fnanomdm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicromdm%2Fnanomdm/lists"}