Vincent LauriatVincent LauriatVincent Lauriat 20 · MoveApps
GitHub

20MoveApps

Native SwiftUI app for macOSApp SwiftUI native pour macOS原生 SwiftUI macOS 應用程式

Move a whole development project between your iCloud Drive archive and your local working disk — without breaking git, virtualenvs or Xcode.Déplacez un projet de développement entier entre votre archive iCloud Drive et votre disque de travail local — sans casser git, les virtualenvs ni Xcode.在 iCloud Drive 封存區與本機工作磁碟之間搬移整個開發專案——不會弄壞 git、virtualenv 或 Xcode。

RequiresConfiguration系統需求
macOS 26+
DistributionDistribution發行
Signed & notarized DMGDMG signé et notarié已簽章與公證的 DMG
UpdatesMises à jour更新
Sparkle auto-updatesMises à jour automatiques SparkleSparkle 自動更新
LicenceLicence授權
Free & open source (MIT)Gratuit et open source (MIT)免費開源(MIT)

FeaturesFonctionnalités功能

  • Bidirectional transfersTransferts bidirectionnels雙向傳輸

    Pull a project out of the archive to work on it, push it back when you are done. The same guarantees apply in both directions.Sortez un projet de l'archive pour travailler dessus, renvoyez-le quand vous avez fini. Les mêmes garanties s'appliquent dans les deux sens.把專案從封存區取出來工作,完成後再推回去。兩個方向都享有相同的保證。

  • Stack-aware movesDéplacements adaptés à la stack辨識技術堆疊的搬移

    Detects git, Node, Python, Xcode, Rust and Go projects. Python virtualenvs are recreated on arrival — a venv hardcodes its own path and cannot simply be relocated.Détecte les projets git, Node, Python, Xcode, Rust et Go. Les virtualenvs Python sont recréés à l'arrivée — un venv inscrit en dur son propre chemin et ne peut pas simplement être déplacé.偵測 git、Node、Python、Xcode、Rust 與 Go 專案。Python virtualenv 會在抵達後重新建立——venv 會把自己的路徑寫死,無法單純搬移。

  • Built for iCloud DriveConçu pour iCloud Drive為 iCloud Drive 打造

    Files that exist only in the cloud are materialized before the move. When iCloud's FileProvider makes a plain mv time out, the transfer falls back to a verified copy-then-delete.Les fichiers qui n'existent que dans le cloud sont matérialisés avant le déplacement. Quand le FileProvider d'iCloud fait expirer un simple mv, le transfert se replie sur une copie vérifiée suivie d'une suppression.只存在於雲端的檔案會在搬移前先下載到本機。當 iCloud 的 FileProvider 讓單純的 mv 逾時,傳輸會改用經過驗證的「先複製、再刪除」。

  • Multi-Mac checkout lockVerrou d'emprunt multi-Mac多台 Mac 借出鎖定

    Taking a project leaves a trace at its place in the shared archive — which Mac took it, and when — so a second Mac cannot take the same project until it is returned. A Release button clears a stale trace by hand.Prendre un projet laisse une trace à sa place dans l'archive partagée — quel Mac l'a pris, et quand — de sorte qu'un second Mac ne peut pas prendre le même projet tant qu'il n'a pas été rendu. Un bouton Libérer efface à la main une trace périmée.取走專案時,會在共用封存區的原位置留下紀錄——哪台 Mac 取走、何時取走——因此在歸還之前,第二台 Mac 無法取走同一個專案。釋放按鈕可手動清除過期的紀錄。

  • One index, both rootsUn index, deux racines一份索引,涵蓋兩個根目錄

    Generates a unified INDEX.md covering archive and active side by side — category folder, detected stack, disk size, and the description read from each project's README — and writes an identical copy into both roots.Génère un INDEX.md unifié couvrant archive et actif côte à côte — dossier de catégorie, stack détectée, taille sur disque et description lue dans le README de chaque projet — et en écrit une copie identique dans les deux racines.產生一份統一的 INDEX.md,並列封存區與工作區——分類資料夾、偵測到的技術堆疊、磁碟大小,以及從各專案 README 讀取的說明——並在兩個根目錄各寫入一份相同的副本。

  • Menu bar & main windowBarre des menus et fenêtre principale選單列與主視窗

    A menu bar dashboard for quick transfers, plus a window with two hierarchical lists: collapsible folders, ⌘/⇧ multi-select, search, and per-root counters and disk usage.Un tableau de bord dans la barre des menus pour les transferts rapides, plus une fenêtre avec deux listes hiérarchiques : dossiers repliables, sélection multiple ⌘/⇧, recherche, et compteurs et occupation disque par racine.選單列儀表板可快速傳輸,另有一個含兩份階層清單的視窗:可收合的資料夾、⌘/⇧ 多選、搜尋,以及各根目錄的計數與磁碟用量。

Archive and activeArchive et actif封存區與工作區

  • Archive — ~/Documents/GitHubArchive — ~/Documents/GitHub封存區 — ~/Documents/GitHub

    On iCloud Drive. Synced across your Macs, slow for file operations, right for projects you are not touching at the moment.Sur iCloud Drive. Synchronisé entre vos Mac, lent pour les opérations sur fichiers, adapté aux projets auxquels vous ne touchez pas en ce moment.位於 iCloud Drive。在你的多台 Mac 之間同步,檔案操作較慢,適合目前沒有在動的專案。

  • Active — ~/DevAppsActif — ~/DevApps工作區 — ~/DevApps

    A plain local directory. Nothing intercepts your writes, so git, builds and package managers behave normally.Un simple répertoire local. Rien n'intercepte vos écritures, donc git, les builds et les gestionnaires de paquets se comportent normalement.一個普通的本機目錄。沒有任何東西攔截你的寫入,因此 git、建置與套件管理工具都能正常運作。

How a transfer actually worksComment un transfert fonctionne vraiment傳輸實際上如何運作

  1. Everything is downloaded first. iCloud Drive keeps evicted files around as placeholders. MoveApps forces the whole project to be materialized locally before anything moves, so nothing is silently lost on the way.Tout est téléchargé d'abord. iCloud Drive conserve les fichiers évincés sous forme de paramètres fictifs. MoveApps force la matérialisation locale du projet entier avant tout déplacement, pour que rien ne se perde en silence en chemin.先把所有東西下載下來。iCloud Drive 會把已移出本機的檔案留成佔位檔。MoveApps 會在任何搬移之前,強制把整個專案下載到本機,確保途中不會無聲地遺失任何東西。

  2. The move survives iCloud's FileProvider. A native mv between the two roots can fail with Operation timed out even though both live on the same volume. MoveApps then copies, verifies the file count, and deletes the source only once the copy is confirmed complete.Le déplacement résiste au FileProvider d'iCloud. Un mv natif entre les deux racines peut échouer avec Operation timed out alors même que les deux sont sur le même volume. MoveApps copie alors, vérifie le nombre de fichiers et ne supprime la source qu'une fois la copie confirmée complète.搬移撐得過 iCloud 的 FileProvider。兩個根目錄之間的原生 mv 可能以 Operation timed out 失敗,即使兩者位於同一個磁碟區。此時 MoveApps 會複製、核對檔案數量,並只在確認複製完整後才刪除來源。

  3. The project is put back together. Stack-specific fixups run at the destination — virtualenvs rebuilt, git state checked before and after, leftover references to the old path and broken symlinks reported.Le projet est remis en état. Des correctifs propres à chaque stack s'exécutent à destination — virtualenvs reconstruits, état git vérifié avant et après, références résiduelles à l'ancien chemin et liens symboliques cassés signalés.專案會被重新組裝好。目的地會執行針對技術堆疊的修正——重建 virtualenv、前後檢查 git 狀態,並回報殘留的舊路徑參照與失效的符號連結。

  4. You can watch it happen. A dedicated Debug window traces each step of a transfer live, including a single self-updating line for the iCloud download (files fetched, elapsed time, budget) — useful when a large project is taking its time.Vous pouvez le regarder se faire. Une fenêtre Debug dédiée trace chaque étape d'un transfert en direct, avec une ligne unique qui se met à jour pour le téléchargement iCloud (fichiers récupérés, temps écoulé, budget) — utile quand un gros projet prend son temps.你可以看著它進行。專屬的 Debug 視窗會即時追蹤傳輸的每一步,包括一行自動更新的 iCloud 下載狀態(已取得檔案、經過時間、時間預算)——大型專案慢慢來時很實用。

One exception: the top-level Templates folder holds shared scripts referenced by relative path from both roots, so a transfer copies it instead of moving it, and never places a lock on it.Une exception : le dossier Templates de premier niveau contient des scripts partagés référencés par chemin relatif depuis les deux racines ; un transfert le copie donc au lieu de le déplacer, et ne pose jamais de verrou dessus.唯一的例外:最上層的 Templates 資料夾存放兩個根目錄都以相對路徑參照的共用腳本,因此傳輸會複製它而不是搬移,也從不對它上鎖。

InstallInstallation安裝

  1. Download the DMG from the latest release.Téléchargez le DMG depuis la dernière release.從最新版本下載 DMG。

  2. Drag MoveApps.app into Applications.Glissez MoveApps.app dans Applications.把 MoveApps.app 拖進「應用程式」。

  3. Launch it. The app is Developer ID signed and notarized by Apple, so it opens normally — no right-click → Open dance to get past Gatekeeper.Lancez-la. L'app est signée Developer ID et notariée par Apple, elle s'ouvre donc normalement — pas de clic droit → Ouvrir pour passer Gatekeeper.啟動它。此 App 以 Developer ID 簽章並經 Apple 公證,因此能正常開啟——不必用右鍵 → 打開來繞過 Gatekeeper。

Requires macOS 26.0 or later. After the first install, MoveApps checks for new versions at launch through Sparkle and offers them to you — it never installs anything without your confirmation.Nécessite macOS 26.0 ou ultérieur. Après la première installation, MoveApps vérifie les nouvelles versions au lancement via Sparkle et vous les propose — il n'installe jamais rien sans votre confirmation.需要 macOS 26.0 或更新版本。首次安裝後,MoveApps 會在啟動時透過 Sparkle 檢查新版本並提供給你——未經你確認,絕不會安裝任何東西。

Prefer to build it yourself:Vous préférez la compiler vous-même :想自己建置:

brew install xcodegen
git clone https://github.com/vincentlauriat/MoveApps.git
cd MoveApps
xcodegen generate
open MoveApps.xcodeproj   # then ⌘R

The design is written up in ARCHITECTURE_EN.md, and day-to-day usage in the user guide. A legacy shell script, move-app.sh, remains in the repo as a CLI fallback but is no longer actively maintained.La conception est décrite dans ARCHITECTURE_EN.md, et l'usage au quotidien dans le guide utilisateur. Un ancien script shell, move-app.sh, reste dans le dépôt comme solution de repli en ligne de commande, mais n'est plus activement maintenu.設計說明寫在 ARCHITECTURE_EN.md,日常使用方式則在使用者指南。舊的 shell 腳本 move-app.sh 仍留在儲存庫中作為命令列備援,但已不再積極維護。

Download MoveAppsTélécharger MoveApps下載 MoveApps

Free & open source (MIT) · macOS 26+ · signed & notarized DMG · Sparkle auto-updatesGratuit et open source (MIT) · macOS 26+ · DMG signé et notarié · mises à jour automatiques Sparkle免費開源(MIT)· macOS 26+ · 已簽章與公證的 DMG · Sparkle 自動更新