Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Create and share shift handover checklists, capture photos and export reports
AI summary · website content
BusinessHTML · PLpgSQLGitHub @jrpenalozat-a11yOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Checklist para el traspaso de turno: se marca con el dedo y el estado viaja dentro del link,
así se comparte por WhatsApp y quien lo recibe lo abre tal cual quedó. Sin cuentas ni base de datos:
es un solo archivo (index.html).
2 de 5).+ (o Enter).× a la derecha de cada línea.| Botón | Color | Qué hace |
|---|---|---|
| Registrar y enviar | verde François | Guarda el traspaso (quién entrega, quién recibe, fecha/hora y % de avance) y abre WhatsApp con el resumen + un link que lleva todo adentro. Un traspaso = un envío. |
| cobre | Descarga un PDF del checklist actual (con entrega/recibe, fecha y tareas) para archivar. | |
| Registro semanal | verde pino | Abre el panel con los traspasos de la semana y la efectividad (% promedio de avance). Desde ahí se descarga PDF y se exporta/importa. |
| Desmarcar | oro | Deja todas las tareas sin marcar para empezar un turno nuevo (no borra las tareas). |
| Vaciar | ladrillo | Borra todas las tareas (pide confirmación). |
Paleta institucional François (verde bosque + crema + cobre), tipografía Inter y el emblema de la taza en el encabezado. Colores por función: verde = acción principal, cobre = guardar/descargar, verde pino = reportes, oro = reversible, ladrillo = destructivo.
.json) e Importar
(fusiona un .json), por si quieren juntar registros de varios equipos a mano.Tarjeta 📸 Traspaso verificado: registra un traspaso con foto tomada en vivo con la
cámara (no se puede elegir de la galería), ubicación del momento y hora puesta por
el servidor. Como esta app es vanilla (sin build), usa supabase-js cargado por CDN.
En index.html, bloque CONFIG (busca SUPABASE_URL):
const SUPABASE_URL = "https://TU-PROYECTO.supabase.co";
const SUPABASE_ANON_KEY = "TU_ANON_KEY"; // pública por diseño; la protege RLS
Hasta configurarlo, la tarjeta muestra “Falta configurar Supabase” y el resto de la app funciona igual.
create table if not exists public.traspasos_turno (
id uuid primary key default gen_random_uuid(),
archivo text not null,
colaborador text,
turno text,
lat float8,
lng float8,
precision_m float8,
created_at timestamptz not null default now() -- la HORA la pone el servidor
);
alter table public.traspasos_turno enable row level security;
create policy "insert autenticado" on public.traspasos_turno
for insert to authenticated with check (true);
create policy "select autenticado" on public.traspasos_turno
for select to authenticated using (true);
insert into storage.buckets (id, name, public)
values ('traspasos','traspasos', false)
on conflict (id) do nothing;
create policy "subir traspasos" on storage.objects
for insert to authenticated with check (bucket_id = 'traspasos');
create policy "ver traspasos" on storage.objects
for select to authenticated using (bucket_id = 'traspasos');
La app no tiene login; para cumplir el RLS authenticated usa sesión anónima.
En Supabase: Authentication → Sign In / Providers → Anonymous sign-ins = ON.
La cámara (getUserMedia) y la ubicación (geolocation) solo funcionan en HTTPS
(o localhost). La app ya está en HTTPS en Vercel, así que ✅.
navigator.mediaDevices.getUserMedia (cámara en vivo). Sin
<input type="file"> ni capture → no se puede subir de la galería.created_at timestamptz default now() en el servidor; nunca la fecha del
teléfono.getCurrentPosition({enableHighAccuracy:true, timeout:8000}) en el mismo
momento de la captura. Si el usuario la niega o expira, el traspaso igual se registra
con lat/lng = null y muestra “sin ubicación”.index.html. Sin frameworks, sin build, sin backend.jspdf (por CDN) para generar los PDF.localStorage — checklist en checklist.v1, registro de traspasos en
checklist.reg.v1 — más el estado en el hash del link.Es un sitio estático de un solo archivo.
https://tu-proyecto.vercel.app.Alternativa por CLI: npm i -g vercel, entrar a la carpeta y vercel.
Si algún día son muchísimas tareas, el link se alarga. Ahí conviene pasar a una versión con base de datos (Vercel KV / Upstash). Para el uso normal de turno no hace falta.