{"id":49659218,"url":"https://github.com/alejandroppir/clipboard-sync","last_synced_at":"2026-05-06T11:01:15.890Z","repository":{"id":293654739,"uuid":"984719814","full_name":"alejandroppir/clipboard-sync","owner":"alejandroppir","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-05T23:45:20.000Z","size":83280,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-06T01:21:44.636Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alejandroppir.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2025-05-16T11:51:29.000Z","updated_at":"2026-05-05T23:44:51.000Z","dependencies_parsed_at":"2025-05-16T13:33:25.113Z","dependency_job_id":null,"html_url":"https://github.com/alejandroppir/clipboard-sync","commit_stats":null,"previous_names":["alejandroppir/clipboard-sync"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/alejandroppir/clipboard-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alejandroppir%2Fclipboard-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alejandroppir%2Fclipboard-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alejandroppir%2Fclipboard-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alejandroppir%2Fclipboard-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alejandroppir","download_url":"https://codeload.github.com/alejandroppir/clipboard-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alejandroppir%2Fclipboard-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32690536,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T08:33:17.875Z","status":"ssl_error","status_checked_at":"2026-05-06T08:33:17.221Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-05-06T11:01:12.392Z","updated_at":"2026-05-06T11:01:15.881Z","avatar_url":"https://github.com/alejandroppir.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# Clipboard Sync\n\nSincronizador de portapapeles para Windows que mantiene el portapapeles sincronizado entre máquinas usando Firebase Firestore como backend en tiempo real.\n\nConstruido con **Electron + TypeScript**. Se distribuye como un único ejecutable portable (`ClipboardSync.exe`), sin instalación.\n\n---\n\n## Cómo funciona\n\nAl arrancar, la aplicación:\n\n1. Se minimiza en la **bandeja del sistema** (system tray)\n2. Abre la ventana de configuración automáticamente\n3. Si no hay usuario configurado, muestra el diálogo para introducir el `userId` (email)\n4. Una vez configurado, inicia la sincronización con Firebase Firestore en tiempo real\n\nCualquier texto copiado al portapapeles se sube a Firestore. Si otra máquina con el mismo `userId` copia algo, se descarga y se pega en el portapapeles local.\n\n---\n\n## Interfaz\n\nLa ventana de configuración muestra:\n\n- **Barra de estado** — indicador visual (verde = activo, gris = detenido, rojo = error) y el `userId` actual\n- **Log en tiempo real** — registro de operaciones del sync (subidas, bajadas, errores)\n- **Botones de acción**:\n  - `Cerrar aplicación` — termina el proceso completamente\n  - `Minimizar a la barra de tareas` — oculta la ventana; la app sigue corriendo en el tray\n  - `Detener` — pausa la sincronización sin cerrar la app\n  - `Reiniciar` — reinicia la sincronización (útil tras cambiar el userId)\n- **Botón Cambiar** — permite cambiar el `userId` en cualquier momento\n\nPara volver a abrir la ventana desde el tray: **clic o doble clic** sobre el icono, o clic derecho → _Abrir configuración_.\n\n---\n\n## Estructura del repositorio\n\n```\nclipboard-sync-repo/\n├── src/\n│   ├── main/\n│   │   ├── main.ts        # Punto de entrada Electron (single-instance lock, tray, IPC)\n│   │   ├── config.ts      # Lectura/escritura de config.json en %LOCALAPPDATA%\n│   │   ├── sync.ts        # Motor de sincronización Firebase + clipboard\n│   │   ├── tray.ts        # Icono y menú de la bandeja del sistema\n│   │   ├── window.ts      # BrowserWindow + handlers IPC\n│   │   └── updater.ts     # Auto-actualización con electron-updater\n│   ├── preload/\n│   │   └── preload.ts     # Bridge seguro entre main y renderer (contextBridge)\n│   └── renderer/\n│       ├── settings.html  # Interfaz de configuración\n│       ├── settings.css   # Estilos dark mode\n│       └── renderer.ts    # Lógica del renderer\n├── assets/\n│   ├── logo.svg           # Fuente del icono\n│   └── logo.ico           # Icono generado (usado por Electron y el .exe)\n├── dist/                  # Salida de compilación TypeScript (ignorada en git)\n├── dist-release/          # Salida de empaquetado electron-builder (ignorada en git)\n├── tsconfig.json          # Base TypeScript\n├── tsconfig.main.json     # Compilación main + preload (CommonJS)\n├── tsconfig.renderer.json # Compilación renderer (ESNext)\n├── electron-builder.yml   # Configuración de empaquetado\n└── package.json\n```\n\n---\n\n## Desarrollo local\n\n### Requisitos\n\n- Node.js 24+\n- `npm install`\n\n### Scripts disponibles\n\n| Script                  | Descripción                                                                  |\n| ----------------------- | ---------------------------------------------------------------------------- |\n| `npm run dev`           | Compila TypeScript y lanza la app con Electron                               |\n| `npm run build`         | Solo compila TypeScript → `dist/`                                            |\n| `npm run package`       | Compila + empaqueta → `dist-release/ClipboardSync.exe` (portable)            |\n| `npm run generate-icon` | Convierte `assets/logo.svg` → `assets/logo.ico` (ejecutar al cambiar el SVG) |\n\n### Desarrollo diario\n\n```powershell\nnpm run dev\n```\n\n### Primera ejecución sin config\n\nSi `%LOCALAPPDATA%\\clipboard-sync\\config.json` no existe, la app abre el diálogo de userId automáticamente al arrancar.\n\nPara simular una primera ejecución limpia:\n\n```powershell\nRemove-Item \"$env:LOCALAPPDATA\\clipboard-sync\" -Recurse -Force\nnpm run dev\n```\n\n---\n\n## Empaquetado local\n\n```powershell\nnpm run package\n```\n\nGenera `dist-release/ClipboardSync.exe`. Requiere **Modo de desarrollador de Windows** activado (Configuración → Sistema → Para desarrolladores).\n\n---\n\n## Release / CI\n\nEl workflow `.github/workflows/release.yml` se dispara manualmente (`workflow_dispatch`) con un único parámetro:\n\n- `version`: número de versión (ej. `1.2.3`, sin `v`)\n\nEl workflow:\n\n1. Hace `npm version $version` y crea el tag en git\n2. Compila TypeScript\n3. Empaqueta con `electron-builder --win portable --publish always`\n4. Publica `ClipboardSync.exe` en GitHub Releases automáticamente\n\n---\n\n## Configuración\n\nEl archivo de configuración se guarda en:\n\n```\n%LOCALAPPDATA%\\clipboard-sync\\config.json\n```\n\nContenido:\n\n```json\n{\"userId\": \"email@dominio.com\"}\n```\n\nEl `userId` debe coincidir entre todas las máquinas que quieran compartir portapapeles. Solo se usa como clave de documento en Firestore — no hay autenticación Firebase.\n\n---\n\n## Auto-actualización\n\nCuando la app está empaquetada (`app.isPackaged`), comprueba automáticamente si hay una nueva versión disponible en GitHub Releases al arrancar. Si la hay, descarga e instala la actualización en segundo plano y notifica al usuario.\n\nAl arrancar, la aplicaciÃ³n:\n\n1. Se minimiza en la **bandeja del sistema** (system tray)\n2. Abre la ventana de configuraciÃ³n automÃ¡ticamente\n3. Si no hay usuario configurado, muestra el diÃ¡logo para introducir el `userId` (email)\n4. Una vez configurado, inicia la sincronizaciÃ³n con Firebase Firestore en tiempo real\n\nCualquier texto copiado al portapapeles se sube a Firestore. Si otra mÃ¡quina con el mismo `userId` copia algo, se descarga y se pega en el portapapeles local.\n\n---\n\n## Interfaz\n\nLa ventana de configuraciÃ³n muestra:\n\n- **Barra de estado** â€” indicador visual (verde = activo, gris = detenido, rojo = error) y el `userId` actual\n- **Log en tiempo real** â€” registro de operaciones del sync (subidas, bajadas, errores)\n- **Botones de acciÃ³n**:\n  - `Cerrar aplicaciÃ³n` â€” termina el proceso completamente\n  - `Minimizar a la barra de tareas` â€” oculta la ventana; la app sigue corriendo en el tray\n  - `Detener` â€” pausa la sincronizaciÃ³n sin cerrar la app\n  - `Reiniciar` â€” reinicia la sincronizaciÃ³n (Ãºtil tras cambiar el userId)\n- **BotÃ³n Cambiar** â€” permite cambiar el `userId` en cualquier momento\n\nPara volver a abrir la ventana desde el tray: **clic o doble clic** sobre el icono, o clic derecho â†’ _Abrir configuraciÃ³n_.\n\n---\n\n## Estructura del repositorio\n\n```\nclipboard-sync-repo/\nâ”œâ”€â”€ src/\nâ”‚   â”œâ”€â”€ main/\nâ”‚   â”‚   â”œâ”€â”€ main.ts        # Punto de entrada Electron (single-instance lock, tray, IPC)\nâ”‚   â”‚   â”œâ”€â”€ config.ts      # Lectura/escritura de config.json en %LOCALAPPDATA%\nâ”‚   â”‚   â”œâ”€â”€ sync.ts        # Motor de sincronizaciÃ³n Firebase + clipboard\nâ”‚   â”‚   â”œâ”€â”€ tray.ts        # Icono y menÃº de la bandeja del sistema\nâ”‚   â”‚   â”œâ”€â”€ window.ts      # BrowserWindow + handlers IPC\nâ”‚   â”‚   â””â”€â”€ updater.ts     # Auto-actualizaciÃ³n con electron-updater\nâ”‚   â”œâ”€â”€ preload/\nâ”‚   â”‚   â””â”€â”€ preload.ts     # Bridge seguro entre main y renderer (contextBridge)\nâ”‚   â””â”€â”€ renderer/\nâ”‚       â”œâ”€â”€ settings.html  # Interfaz de configuraciÃ³n\nâ”‚       â”œâ”€â”€ settings.css   # Estilos dark mode\nâ”‚       â””â”€â”€ renderer.ts    # LÃ³gica del renderer\nâ”œâ”€â”€ assets/\nâ”‚   â”œâ”€â”€ logo.svg           # Fuente del icono\nâ”‚   â””â”€â”€ logo.ico           # Icono generado (usado por Electron y el .exe)\nâ”œâ”€â”€ dist/                  # Salida de compilaciÃ³n TypeScript (ignorada en git)\nâ”œâ”€â”€ dist-release/          # Salida de empaquetado electron-builder (ignorada en git)\nâ”œâ”€â”€ tsconfig.json          # Base TypeScript\nâ”œâ”€â”€ tsconfig.main.json     # CompilaciÃ³n main + preload (CommonJS)\nâ”œâ”€â”€ tsconfig.renderer.json # CompilaciÃ³n renderer (ESNext)\nâ”œâ”€â”€ electron-builder.yml   # ConfiguraciÃ³n de empaquetado\nâ””â”€â”€ package.json\n```\n\n---\n\n## Desarrollo local\n\n### Requisitos\n\n- Node.js 24+\n- `npm install`\n\n### Scripts disponibles\n\n| Script                  | DescripciÃ³n                                                                   |\n| ----------------------- | ------------------------------------------------------------------------------ |\n| `npm run dev`           | Compila TypeScript y lanza la app con Electron                                 |\n| `npm run build`         | Solo compila TypeScript â†’ `dist/`                                            |\n| `npm run package`       | Compila + empaqueta â†’ `dist-release/ClipboardSync.exe` (portable)            |\n| `npm run generate-icon` | Convierte `assets/logo.svg` â†’ `assets/logo.ico` (ejecutar al cambiar el SVG) |\n\n### Desarrollo diario\n\n```powershell\nnpm run dev\n```\n\n### Primera ejecuciÃ³n sin config\n\nSi `%LOCALAPPDATA%\\clipboard-sync\\config.json` no existe, la app abre el diÃ¡logo de userId automÃ¡ticamente al arrancar.\n\nPara simular una primera ejecuciÃ³n limpia:\n\n```powershell\nRemove-Item \"$env:LOCALAPPDATA\\clipboard-sync\" -Recurse -Force\nnpm run dev\n```\n\n---\n\n## Empaquetado local\n\n```powershell\nnpm run package\n```\n\nGenera `dist-release/ClipboardSync.exe`. Requiere **Modo de desarrollador de Windows** activado (ConfiguraciÃ³n â†’ Sistema â†’ Para desarrolladores).\n\n---\n\n## Release / CI\n\nEl workflow `.github/workflows/release.yml` se dispara manualmente (`workflow_dispatch`) con un Ãºnico parÃ¡metro:\n\n- `version`: nÃºmero de versiÃ³n (ej. `1.2.3`, sin `v`)\n\nEl workflow:\n\n1. Hace `npm version $version` y crea el tag en git\n2. Compila TypeScript\n3. Empaqueta con `electron-builder --win portable --publish always`\n4. Publica `ClipboardSync.exe` en GitHub Releases automÃ¡ticamente\n\n---\n\n## ConfiguraciÃ³n\n\nEl archivo de configuraciÃ³n se guarda en:\n\n```\n%LOCALAPPDATA%\\clipboard-sync\\config.json\n```\n\nContenido:\n\n```json\n{\"userId\": \"email@dominio.com\"}\n```\n\nEl `userId` debe coincidir entre todas las mÃ¡quinas que quieran compartir portapapeles. Solo se usa como clave de documento en Firestore â€” no hay autenticaciÃ³n Firebase.\n\n---\n\n## Auto-actualizaciÃ³n\n\nCuando la app estÃ¡ empaquetada (`app.isPackaged`), comprueba automÃ¡ticamente si hay una nueva versiÃ³n disponible en GitHub Releases al arrancar. Si la hay, descarga e instala la actualizaciÃ³n en segundo plano y notifica al usuario.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falejandroppir%2Fclipboard-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falejandroppir%2Fclipboard-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falejandroppir%2Fclipboard-sync/lists"}