{"id":51244409,"url":"https://github.com/lv-0/plumb","last_synced_at":"2026-07-01T08:00:42.369Z","repository":{"id":338167638,"uuid":"1156842910","full_name":"Lv-0/plumb","owner":"Lv-0","description":"A lightweight macOS window manager that auto-centers and auto-tiles your apps.","archived":false,"fork":false,"pushed_at":"2026-06-29T01:26:23.000Z","size":23791,"stargazers_count":11,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-29T03:19:29.003Z","etag":null,"topics":["accessibility","desktop","mac","mac-application","macos","menu-bar","productivity","swift","swiftui","tiling-window-manager","window-manager","windows"],"latest_commit_sha":null,"homepage":"","language":"Swift","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/Lv-0.png","metadata":{"files":{"readme":"README.es.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-13T05:38:19.000Z","updated_at":"2026-06-29T01:26:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Lv-0/plumb","commit_stats":null,"previous_names":["lv-0/centerwindows","lv-0/plumb"],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/Lv-0/plumb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lv-0%2Fplumb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lv-0%2Fplumb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lv-0%2Fplumb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lv-0%2Fplumb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lv-0","download_url":"https://codeload.github.com/Lv-0/plumb/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lv-0%2Fplumb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34997947,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["accessibility","desktop","mac","mac-application","macos","menu-bar","productivity","swift","swiftui","tiling-window-manager","window-manager","windows"],"created_at":"2026-06-29T03:00:37.040Z","updated_at":"2026-07-01T08:00:42.327Z","avatar_url":"https://github.com/Lv-0.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/AppIcon-base.png\" width=\"140\" height=\"140\" alt=\"Plumb\"\u003e\n\n# Plumb\n\nUna línea desciende y encuentra su punto.\n\n\u003e Haz que tu Mac se sienta más elegante de usar.\n\nCentra y coloca en mosaico las apps de macOS automáticamente — ¡una bendición para los amantes del orden!\n\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](./LICENSE)\n[![Platform](https://img.shields.io/badge/platform-macOS%2026%2B-lightgrey.svg?style=flat-square)](#requisitos)\n[![Swift](https://img.shields.io/badge/Swift-6.2-F05138.svg?style=flat-square)](https://swift.org)\n[![Release](https://img.shields.io/badge/release-v2.0.0-success.svg?style=flat-square)](#descarga-e-instalación)\n\n[English](./README.md) · [简体中文](./README.zh.md) · **Español** · [Français](./README.fr.md) · [日本語](./README.ja.md)\n\n\u003c/div\u003e\n\n---\n\n## 📖 Índice\n\n- [Acerca de](#acerca-de)\n- [✨ Funciones](#-funciones)\n- [📐 Mosaico automático](#-mosaico-automático)\n- [📸 Capturas](#-capturas)\n- [Descarga e instalación](#descarga-e-instalación)\n- [Uso](#uso)\n- [Permisos](#permisos)\n- [Requisitos](#requisitos)\n- [Compilar localmente](#compilar-localmente)\n- [Empaquetar y publicar](#empaquetar-y-publicar)\n- [Preguntas frecuentes](#preguntas-frecuentes)\n- [Licencia](#licencia)\n\n## Acerca de\n\n`Plumb` es un **gestor de ventanas en la barra de menús de macOS** que soporta tanto el centrado automático como el mosaico automático por aplicación.\n\nRecibe el nombre de la **plomada** (plumb line) — el peso que el carpintero deja caer para encontrar la verdadera vertical, el verdadero centro. Eso es justo lo que hace Plumb: colocar suavemente una ventana en el centro exacto de la pantalla o en una posición designada.\n\n- 🪧 Vive en la barra de menús — sin icono en el Dock, cero intrusiones\n- 🎯 Centra una vez al iniciar, y después solo cuando se reabre una ventana o se enfoca una nueva\n- 🖥️ Calcula dentro del área útil de la pantalla (excluye automáticamente el Dock y la barra de menús), estable en configuraciones multi-pantalla\n- 📐 Mosaico automático por aplicación (lista de permitidas) con un margen uniforme configurable\n- 🪟 Interfaz de ajustes Liquid Glass (macOS 26) — vidrio esmerilado, búsqueda de apps, interruptores en píldora\n\n## ✨ Funciones\n\n| Función | Descripción |\n| --- | --- |\n| 🎯 Centrar una vez | Centra una vez al iniciar; después solo cuando se reabre una ventana o se enfoca una nueva |\n| ✋ No lucha con tu disposición | Arrastrar una ventana nunca vuelve a disparar el centrado |\n| 🖥️ Evita con precisión el Dock/barra de menús | Basado en `screen.frame - screen.visibleFrame`, estable en multi-pantalla |\n| 📐 Mosaico automático por app | Mecanismo de lista de permitidas con margen uniforme configurable (px) |\n| 🎚️ Margen de mosaico por app | Toca cualquier app en mosaico para fijar un margen personalizado solo para esa app; las que no tengan ajuste usan el margen global predeterminado |\n| 🔄 Refresco en vivo de la lista de apps | Las apps recién instaladas aparecen en el selector de ajustes de inmediato, sin reiniciar |\n| 🪟 Interfaz Liquid Glass | Vidrio esmerilado de macOS 26, búsqueda, interruptores en píldora |\n| 🧠 Detección inteligente de coordenadas | Detecta automáticamente el espacio de coordenadas de cada app y lo cachea para estabilidad |\n| 🪧 Presencia no intrusiva en la barra de menús | Solo icono en la barra de menús, no ocupa el Dock |\n\n## 📐 Mosaico automático\n\nAbre `Ajustes de mosaico…` desde la barra de menús para activar/desactivar la función y gestionar tu flujo de trabajo.\n\n- Configura un único margen uniforme (px)\n- **Margen de mosaico por app**: toca cualquier app en la lista de mosaico para desplegar un cajón de margen integrado y fijar un margen personalizado solo para esa app; las apps sin ajuste personalizado siguen usando el margen global predeterminado. Un botón «Usar predeterminado» restablece una app al valor global.\n- Selecciona las apps permitidas entre las aplicaciones instaladas (las apps del sistema se ocultan por defecto, conmutable)\n- Para las apps permitidas, **el mosaico tiene prioridad** sobre el centrado automático\n- El ámbito de disparo es una vez por inicio de proceso (PID); sin mosaico repetido dentro del mismo proceso\n- Si una ventana no se puede redimensionar, se omite\n- Las apps de documentos (Pages, Numbers, Word, Excel) omiten automáticamente el selector de plantillas/archivos; solo se coloca en mosaico el documento abierto\n\n\u003e La semántica está inspirada en los conceptos de configuración de Amethyst:\n\u003e - `window-margin-size`: equivalente al margen de mosaico de este proyecto\n\u003e - `floating + floating-is-blacklist=false`: equivalente al mosaico automático por lista de permitidas aquí\n\n## 📸 Capturas\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" align=\"center\"\u003e\u003cb\u003eCentrar — lista de apps permitidas\u003c/b\u003e\u003c/td\u003e\n    \u003ctd width=\"50%\" align=\"center\"\u003e\u003cb\u003eMosaico — cajón de margen por app\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" align=\"center\"\u003e\u003cimg src=\"assets/Centering.png\" alt=\"Pestaña Centrar\"\u003e\u003c/td\u003e\n    \u003ctd width=\"50%\" align=\"center\"\u003e\u003cimg src=\"assets/Tiling.png\" alt=\"Pestaña Mosaico con cajón de margen por app\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"100%\" colspan=\"2\" align=\"center\"\u003e\u003cb\u003ePermisos — Accesibilidad, Grabación de pantalla, Inicio al iniciar sesión\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"100%\" colspan=\"2\" align=\"center\"\u003e\u003cimg src=\"assets/Permissions.png\" alt=\"Pestaña Permisos\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Descarga e instalación\n\n### Opción 1: Descargar el DMG (recomendado)\n\n1. Descarga la última versión de `Plumb.dmg` desde [Releases](../../releases).\n2. Abre el DMG y arrastra `Plumb.app` a `Applications`.\n3. En `Applications`, haz clic derecho en `Plumb.app` → `Abrir` → vuelve a hacer clic en `Abrir`.\n4. Si se bloquea, ve a `Ajustes del sistema → Privacidad y seguridad` y haz clic en \"Abrir de todos modos\".\n\n### Opción 2: Compilar desde el código fuente\n\n```bash\nswift build -c release\n./.build/release/Plumb\n```\n\nConsulta [Compilar localmente](#compilar-localmente).\n\n## Uso\n\n1. Tras el inicio, aparece un icono de gota de agua en la barra de menús.\n2. Concede el permiso de [Accesibilidad](#accesibilidad) — el centrado depende de él.\n3. (Opcional) Concede el permiso de [Grabación de pantalla](#grabación-de-pantalla) para mejorar la estabilidad de la detección de coordenadas en multi-pantalla.\n4. Haz clic en el icono de la barra de menús:\n   - Dispara el centrado manualmente\n   - Abre `Ajustes de mosaico…` para configurar la lista de permitidas y el margen\n\n\u003e 💡 **Principio de diseño**: cada ventana se centra/coloca en mosaico **solo una vez** (con clave `pid:windowNumber`). Arrastrar manualmente una ventana nunca se \"corrige\" — Plumb no lucha con tu disposición manual.\n\n## Permisos\n\n### Accesibilidad\n\n- **Ruta**: `Ajustes del sistema → Privacidad y seguridad → Accesibilidad`\n- **Por qué es necesario**: La app usa las APIs de accesibilidad de macOS para leer el marco de la ventana frontal y escribir una nueva posición para centrarla.\n- **Sin él**: La app no puede leer la geometría de la ventana ni mover ventanas, por lo que el centrado no funcionará.\n\n### Grabación de pantalla\n\n- **Ruta**: `Ajustes del sistema → Privacidad y seguridad → Grabación de pantalla`\n- **Por qué es necesario**: La app necesita el contexto completo de la pantalla para calcular de forma fiable los límites de visualización utilizables y evitar el Dock/barra de menús al centrar.\n- **Sin él**: El centrado dependiente del contexto de pantalla puede volverse inestable en multi-pantalla o disposiciones complejas.\n\n### Límite de permisos\n\n- ❌ La app **no sube contenido de la pantalla** y **no realiza recolección de telemetría**.\n- ✅ Los permisos se usan **solo** para cálculos locales de geometría de ventanas y posicionamiento.\n\n## Requisitos\n\n- **macOS 26+** (compilado con el SDK de macOS 26 y la interfaz Liquid Glass; las versiones anteriores no son compatibles)\n- Xcode Command Line Tools (`xcode-select --install`)\n\n## Compilar localmente\n\n```bash\n# Ejecutar pruebas\nswift test\n\n# Compilar un binario Release\nswift build -c release\n\n# Ejecutar directamente\n./.build/release/Plumb\n```\n\n## Empaquetar y publicar\n\n### Empaquetar como .app y .dmg\n\n```bash\nscripts/build_app.sh      # produce dist/Plumb.app\nscripts/create_dmg.sh     # produce dist/Plumb.dmg\n```\n\nEl DMG incluye:\n\n- `Plumb.app`\n- `Applications` (acceso directo a la carpeta Applications del sistema)\n\n\u003e Instala arrastrando `Plumb.app` a `Applications`.\n\n### Firmar y notarizar (Developer ID)\n\n```bash\nexport DEVELOPER_ID_APP=\"Developer ID Application: YOUR_NAME (TEAMID)\"\nexport NOTARY_PROFILE=\"AC_NOTARY\"\nscripts/sign_and_notarize.sh\n```\n\n### Flujo de publicación en un solo paso (para GitHub Releases)\n\n```bash\nexport DEVELOPER_ID_APP=\"Developer ID Application: YOUR_NAME (TEAMID)\"\nexport NOTARY_PROFILE=\"AC_NOTARY\"\nscripts/release_build.sh              # compilar + empaquetar + firmar/notarizar + verificar\n\nGITHUB_TOKEN=... scripts/publish_release.sh v1.0.0   # publicar en GitHub Releases\n```\n\n\u003e ⚠️ Los DMG no firmados/no notarizados pueden ser bloqueados por Gatekeeper en un Mac nuevo y aparecer como \"dañados\".\n\n## Preguntas frecuentes\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e¿Aviso de \"dañado\" o \"desarrollador no identificado\" al abrir Plumb.app?\u003c/b\u003e\u003c/summary\u003e\n\nEste es el flujo normal de Gatekeeper para distribuciones no notarizadas — **no** es una corrupción del código de la app. Ejecuta:\n\n```bash\nxattr -dr com.apple.quarantine /Applications/Plumb.app\n```\n\nO ve a `Ajustes del sistema → Privacidad y seguridad` y haz clic en \"Abrir de todos modos\" al final.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e¿El centrado no funciona?\u003c/b\u003e\u003c/summary\u003e\n\nAsegúrate de haber concedido el permiso de **Accesibilidad**: `Ajustes del sistema → Privacidad y seguridad → Accesibilidad`, y de que Plumb esté activado. Puede que necesites reiniciar Plumb tras concederlo.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e¿El centrado de ventanas es impreciso en una configuración multi-pantalla?\u003c/b\u003e\u003c/summary\u003e\n\nConcede el permiso de **Grabación de pantalla**. Plumb usa la API `CGWindowList` como señal secundaria para identificar con mayor precisión la pantalla y el espacio de coordenadas de la ventana.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eArrastré una ventana y se volvió a centrar, ¿no?\u003c/b\u003e\u003c/summary\u003e\n\nNo. Plumb centra/coloca en mosaico cada ventana **solo una vez** — las arrastradas manuales nunca se \"corrigen\".\n\n\u003c/details\u003e\n\n## Licencia\n\nEste proyecto es de código abierto bajo la [Licencia MIT](./LICENSE).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n[English](./README.md) · [简体中文](./README.zh.md) · **Español** · [Français](./README.fr.md) · [日本語](./README.ja.md)\n\nSi Plumb te ayuda, se agradece un ⭐ Star.\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flv-0%2Fplumb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flv-0%2Fplumb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flv-0%2Fplumb/lists"}