Codync
무료 오픈소스 1:1 대안, Grok Bot과 Muse 대신
Jordy Thery의 무료 오픈 소스 macOS 앱으로 Jamf Pro 클래식 프로필을 Jamf Blueprint로 옮깁니다
Free, open-source macOS app by Jordy Thery that migrates Jamf Pro classic configuration profiles for macOS and mobile devices into Jamf Blueprints with Apple's in-place Classic-to-DDM transform.
개발 도구Swift · ShellGitHub @JordyThery온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기macOS app that migrates Jamf Pro classic configuration profiles to Jamf Platform Blueprints via the in-place Classic-to-DDM transform. Created by Jordy Thery.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A native macOS app that migrates Jamf Pro classic configuration profiles (macOS and mobile device) into Jamf Platform Blueprints, using the Apple-supported in-place Classic → DDM transform. It turns a manual, API-driven workflow into a safe, reviewable one.
Status: verified end to end against live Jamf tenants — create, server-side verify, deploy, the in-place transform on a Mac and on an iPhone, and classic scope cleanup with restore. Try every migration on a test device before using it fleet-wide.
Download the latest Profile2Blueprint-X.Y.Z.zip from Releases, unzip it, and move Profile2Blueprint.app to /Applications. The app is signed with a Developer ID certificate and notarized, so Gatekeeper verifies it instead of blocking it. Requires macOS 14 or later.
Choose Demo Mode in the connection picker in the toolbar (or the Connection menu), or click Try Demo Mode on the page shown when no tenant is set up. The full flow — eligibility, scope mapping, create, verify, deploy, unscope and restore — runs against a sample tenant, “Contoso (Demo)”, answered inside the app: no tenant is contacted, nothing is saved to your tenants or the Keychain, and there is nothing to configure. Every window title ends in “— Demo” while it is on. This is the quickest way to see whether the app fits your environment.
In Jamf Account, create an API integration scoped to the platform environment (tenant scope cannot reach the Blueprints API, and the scope level is fixed once the integration is created). Jamf’s Integrations Management guide covers the steps. Grant it:
| Capability | Actions | Needed for |
|---|---|---|
device-groups | Read | Listing platform device groups to map classic scope onto |
configuration-profiles | Read | Reading the classic profiles to migrate |
blueprints | Create, Read, Deploy | Creating, verifying and deploying Blueprints |
configuration-profiles | Update | Optional: only to unscope the classic profile after a deployment |
Jamf Account presents these as per-capability checkboxes; the APIs refer to them as device-groups:read, blueprints:create and so on.
Then in the app, open Settings › Connections → Add Connection… → pick the region → paste the Client ID and Client secret → Load Environments to pick the platform environment (or paste its Environment ID) → Test Connection (requests a token, checks the read permissions and counts platform device groups) → Save. Secrets are stored only in your Keychain. Optionally add the Jamf Pro Web Address you use in a browser to get Open in Jamf Pro links for the classic profile and its Blueprint.
Apple allows a classic (imperative) MDM profile to be transformed in place into a DDM-managed profile — no enforcement gap, no conflict — when all of these hold:
PayloadIdentifier and PayloadUUID of the DDM legacy profile match the classic profile’s.PayloadContent matches.PayloadType, PayloadIdentifier and PayloadUUID match, in the same order.The app walks that workflow stage by stage — fetch → validate → distill (plist → JSON) → map scope → build → create → verify → deploy — with an explicit confirmation gate before anything irreversible. Rules 1–2 cannot be checked through the API; the app says so and leaves them to you.
{name} (the profile’s name), {id} (its Jamf Pro ID) and {platform} (“macOS” or “mobile device”) tokens. All three are optional and default to the original wording, so a test environment can be labeled differently from production; an empty template means no description. Both stay editable per Blueprint before creating.Requires Xcode with the macOS 26 SDK or later (Swift 6, strict concurrency). Open the project and run the Profile2Blueprint scheme; the only dependency is JTKit, resolved from GitHub. ⌘U runs the unit tests.
Profile2Blueprint/
App/ AppModel, Workspace, MigrationSession, HistoryLog,
ActivityEntries, DemoFiles, Log
Models/ Tenant, ClassicProfile, PlistValue (order-preserving),
ProfilePlatform, EligibilityReport, MigrationRecord,
Blueprint (the create request), APIError, LosslessJSON+App
Services/
Auth/ KeychainStore (where the client secrets are kept)
API/ RequestPolicy (allow-list), ClassicAPI, ClassicScopeWriter
Migration/ PlistParser, ClassicXMLParser, PlistToJSON, ScopeMapper,
EligibilityChecker, BlueprintBuilder, FidelityVerifier,
MigrationPipeline (actor, staged state machine),
ClassicScopeService (with ScopeBackupStore)
Persistence/ TenantStore, HistoryStore, SessionStateStore, StoredList
Features/ Connect, ProfileList, ProfileDetail, ScopeMapping, Review,
Deploy, Batch, History, Shared
Resources/ Fixtures (Contoso demo profiles and the demo Classic server)
Profile2BlueprintTests/ Swift Testing suite, on JTKit's fake network
Profile2BlueprintUITests/ Demo Mode smoke tests (run by the release check)
The Platform API client, sign-in, Blueprints, device groups, the activity log, About, Settings, the update check and Demo Mode come from JTKit.
Demo mode uses JTKit’s demo network and Jamf Platform server, with the app’s Classic profiles added to it, so the same client, allow-list, pipeline and UI run in demo mode as against a tenant.
PayloadUUID differs from its PayloadIdentifier is blocked: the Blueprints API overwrites the UUID with the identifier, so the transform would fail on devices. Typical of uploaded profiles; a clone made in Jamf Pro gets matching identifiers.jamf-cli, which wire-probed them; they are instance- and version-specific, so the API remains the authority.com.apple.preferences.users) blocks migration. Rewriting the type would break the rule that every payload type matches the installed profile.PUT /proclassic/{resource}/id/{id}) uses the Classic API’s partial-XML convention. Jamf’s OpenAPI specs don’t document the request body; both the macOS and the mobile form are verified against a live tenant.If Profile2Blueprint saves you time, you can buy me a coffee. ☕️
This tool is provided as-is, without warranty of any kind. Use it at your own risk. This is a personal project. It is not affiliated with or endorsed by my employer, Jamf or Apple. Issues and pull requests are appreciated. Support is best-effort.