Codync
免費、開源的 1:1 替代方案,取代 Grok Bot 與 Muse。從 iPhone、Mac 或 Linux 桌面將 Claude Code、Codex、Cursor 與 40+ 程式碼代理人作為持續機器人傳訊。群組聊天、主題串…
AI 翻譯
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證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.