Lea primero la última sección si está evaluando Calcutab. Dice lo que no tenemos: la parte que un proveedor suele hacerle buscar.
Esta página está escrita para la persona que tiene que dar el visto bueno. Describe lo que está realmente construido, no lo que está planeado.
Lo que de verdad importa: sus datos no pueden llegar a otro cliente
Cada registro lleva el espacio de trabajo al que pertenece, y cada consulta está acotada por él. Esa es la respuesta habitual, y por sí sola vale lo que valga el desarrollador que escribió la última consulta.
Por eso la base de datos también lo impone. Los registros de tiempo, las tarifas, las credenciales de Jira y los cierres referencian a su padre mediante una clave externa compuesta de (id, espacio de trabajo). El propio Postgres rechaza una fila que apunte al espacio de otro cliente: no una cláusula WHERE que alguien pueda olvidar, sino una restricción que hace el error imposible de guardar.
Tres de las comprobaciones automáticas de más abajo existen para demostrarlo, intentándolo.
Acceso, y dinero
Cuatro niveles: operador de la plataforma, propietario del espacio, responsable, miembro. Cada página y cada acción comprueban en el servidor. Ocultar una entrada de menú no es control de acceso, y no lo tratamos como tal: las comprobaciones se ejecutan igualmente aunque el enlace nunca se haya mostrado.
El dinero se omite, no se oculta. Un miembro no ve ningún coste, ni siquiera su propia tarifa. Las cifras no se envían a su navegador, así que no hay nada que encontrar en el código de la página.
Credenciales y secretos
| Qué | Cómo se guarda |
|---|---|
| Tokens de API de Jira, tokens de Slack | AES-256-GCM, cifrados antes de llegar a la base de datos, versionados para poder rotar claves. Nunca se devuelven más allá de los últimos cuatro caracteres, nunca se registran, nunca se escriben en una línea del registro de cambios |
| Contraseñas, donde un espacio las usa | scrypt con sal, con el coste guardado junto a cada hash para poder subirlo. Nunca recuperables, ni por nosotros ni por nadie |
| Enlaces de invitación y de restablecimiento | Solo se guarda el SHA-256 del token. Una base de datos filtrada no completa ninguno |
| La propia clave de cifrado | Google Secret Manager, nunca en el repositorio |
La mayoría de los espacios no tienen contraseña alguna: el inicio de sesión es Google o Atlassian, así que rigen las reglas de doble factor y de baja de su proveedor y no hay nada que podamos perder.
En tránsito, y en el navegador
Todo el tráfico va por TLS. Las cookies de sesión son Secure, HttpOnly, SameSite=Lax.
Cada página lleva una Content-Security-Policy construida por petición, con un nonce nuevo; los scripts se permiten por nonce y no por unsafe-inline. frame-ancestors vale none, así que la aplicación no puede incrustarse en un marco.
Qué queda registrado
Un registro de cambios que solo admite añadidos: cambios de tarifa, cambios de pertenencia, ajustes, cierres de periodo y cualquier hoja de tiempo editada en nombre de otra persona: con quién, qué, de qué a qué y cuándo. Exportable en CSV.
Las tarifas nunca se editan. Un cambio inserta una fila con una nueva fecha de inicio, de modo que un informe sacado el año pasado sigue dando la cifra del año pasado.
Abuso
Las escrituras y los intentos de inicio de sesión tienen límite de frecuencia. Ocho fallos consecutivos de contraseña cierran una cuenta durante quince minutos, solo para contraseñas, porque bloquear las vías de Google y Atlassian permitiría a cualquiera dejar sin acceso a un colega adivinando su dirección.
Dónde están sus datos
Google Cloud Run en europe-west1 (Bélgica); PostgreSQL en Neon sobre AWS eu-central-1 (Fráncfort). Las copias de seguridad permanecen en la UE. La lista completa de subencargados está en el [DPA](/legal/dpa), sección 7; es la lista entera, y cambiarla cambia ese documento.
Comprobado antes de cada publicación
Catorce comprobaciones automáticas se ejecutan contra un despliegue real, no una simulación, y cubren:
- un responsable que alcanza las pertenencias, proyectos, informes y exportación CSV de otro espacio de trabajo
- un miembro que alcanza la tabla de tarifas, la exportación del registro o la página del operador
- una sesión firmada con la clave equivocada
- acceso sin autenticar a páginas que la exigen
- trazas de pila, detalles del despliegue y cabeceras de política
El script se niega a ejecutarse siquiera si no se acepta antes una sesión emitida: una versión anterior informaba de once aciertos contra lo que resultaron ser respuestas de redirección vacías, y ese es el tipo de resultado que es peor que no tener ninguno.
Junto a esto: 936 pruebas unitarias, 233 pruebas de extremo a extremo contra un navegador y una base de datos reales, y 216 pruebas de integración.
Si algo sale mal
Un proceso de incidentes escrito define a quién se avisa, en qué orden y en qué plazo. Las alertas de estado y de error llegan al operador si el servicio o su base de datos dejan de ser alcanzables desde dos regiones.
Comunique una vulnerabilidad a support@calcutab.com. Acusamos recibo en un día laborable. Hoy no ofrecemos recompensa.
Lo que no tenemos
Dicho aquí en lugar de dejar que lo descubra:
- Ninguna prueba de intrusión independiente. Las comprobaciones anteriores son nuestras. Se encargará una prueba a terceros cuando un cliente necesite el informe; no fingiremos que ya existe.
- Ni SOC 2 ni ISO 27001. Ninguno está en marcha. Cada uno es un año de trabajo y un coste de cinco cifras, y preferimos decirlo a insinuar otra cosa.
- Sin guardia localizable. La alerta llega a una sola persona. Fuera del horario laboral, la recuperación depende de esa persona.
- Sin compromiso contractual de disponibilidad ni de tiempo de recuperación. Las condiciones también lo dicen.
- Sin claves de cifrado gestionadas por el cliente, sin SAML, sin SCIM. Un OIDC por espacio de trabajo es viable y no está construido; SAML necesitaría un intermediario. Hoy no existe ninguno de los dos.
- Los documentos legales no han sido revisados por asesoría externa. Se publican como versión 1.0 y describen lo que el software hace realmente; su suficiencia jurídica en su país no es algo que hayamos hecho verificar.
Si alguno de estos puntos es un impedimento para usted, dígalo; es mejor saberlo antes de comprar que después.