Orbital Note

Una aplicación multiplataforma de toma de notas sincronizadas en la nube, con autenticación segura mediante Google OAuth y sincronización automática con Google Drive.

¿Qué es Orbital Note?

Orbital Note es una aplicación moderna de notas que te permite:

  • Capturar ideas rápidamente con un editor de texto enriquecido
  • Sincronizar automáticamente tus notas en Google Drive
  • Acceder desde cualquier dispositivo (Android y Web)
  • Organizar tus notas con etiquetas y referencias cruzadas
  • Disfrutar de una interfaz moderna con soporte dark/light mode

Características Principales

Autenticación Segura

Google OAuth 2.0 para login seguro, sin almacenar contraseñas. Tokens seguros con expiración automática.

Sincronización en la Nube

Tus notas se sincronizan automáticamente a Google Drive. Accede desde cualquier dispositivo.

Editor Enriquecido

TipTap en web y TenTap en móvil con formatting, listas, bloques, imágenes y más.

Multiplataforma

Android nativo y Web. Misma experiencia consistente en todos los dispositivos.

Arquitectura del Sistema

Orbital Note sigue una arquitectura modular basada en características con claras separación de responsabilidades.

Capas de la Arquitectura

Capa de Routing

Expo Router - Navegación basada en archivos

Capa de Presentación

Componentes React Native, Hooks personalizados

Capa de Estado

React Context (User, Theme) - Gestión de estado global

Capa de Lógica de Negocio

Servicios: Auth, Drive Sync, Token Management

Capa de Datos

AsyncStorage + Google Drive API - Persistencia

Estructura de Directorios

orbital-note/
├── app/                    # Páginas de Expo Router
│   ├── _layout.tsx         # Layout root
│   ├── (auth)/login.tsx    # Pantalla de login
│   └── (app)/              # Stack principal
│
├── components/             # Componentes reutilizables
│   ├── TextEditor.tsx
│   ├── FloatingNavBar.tsx
│   └── modal/
│
├── context/                # React Context
│   └── UserContext.tsx
│
├── services/               # Lógica de negocio
│   ├── auth/useAuth.ts
│   ├── tokenStorage.ts
│   └── sincronizarWithDrive.ts
│
├── hooks/                  # Custom Hooks
│   ├── use-theme.tsx
│   ├── use-color-scheme.ts
│   └── use-auth.ts
│
└── types/                  # TypeScript types
    └── types.ts

Flujo de Datos

1. Flujo de Autenticación

1. Usuario abre la app
2. Se verifica token almacenado
3. Si no existe, se muestra login
4. Google OAuth redirect
5. Token guardado securely
6. Redirige a app principal

2. Flujo de Notas

Usuario crea/edita nota
Se guarda en AsyncStorage
Sincronización a Google Drive
Se resuelven conflictos
Nota sincronizada ✓

Stack Tecnológico

Runtime & Framework

  • Expo 54+ - Framework mobile multiplataforma
  • React Native - Componentes nativos
  • TypeScript - Type-safe development

Frontend & UI

  • Expo Router - Navegación file-based
  • React Context - State management
  • @expo/vector-icons - Iconografía

Editors

  • TipTap - Editor enriquecido (Web)
  • TenTap - Editor móvil (Android)

Backend & Cloud

  • Google OAuth 2.0 - Autenticación
  • Google Drive API v3 - Sincronización
  • AsyncStorage - Almacenamiento local

Instalación y Setup

Requisitos

  • Node.js 20.x
  • npm 10.x o yarn
  • Expo CLI 54+
  • Para Android: Android Studio o SDK

Pasos de Instalación

# 1. Clonar repositorio
git clone https://github.com/tu-usuario/orbital-note.git
cd orbital-note

# 2. Instalar dependencias
npm install

# 3. Copiar y configurar variables de entorno
cp .env.example .env.local
# Edita .env.local con tus credenciales de Google

# 4. Inicia el servidor de desarrollo
npm run start

# 5. Para Web
npm run web

# 6. Para Android
npm run android

Variables de Entorno

Crea un archivo .env.local con:

EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID=your-web-client-id
EXPO_PUBLIC_GOOGLE_ANDROID_CLIENT_ID=your-android-client-id

Configuración Google OAuth

  1. Ve a Google Cloud Console
  2. Crea un nuevo proyecto
  3. Habilita Google Drive API
  4. Crea credenciales OAuth 2.0:
    • Para Web: Autoriza http://localhost:8081/login
    • Para Android: Autoriza con tu package name
  5. Descarga las credenciales y configura en .env.local

Contribuir al Proyecto

Cómo Empezar

# 1. Fork el repositorio
# 2. Crea una rama feature
git checkout -b feature/tu-feature

# 3. Haz commits con mensajes descriptivos
git commit -m "feat: agregar nueva funcionalidad"

# 4. Push a tu fork
git push origin feature/tu-feature

# 5. Abre un Pull Request
# Describe tus cambios claramente

Estándares de Código

  • TypeScript obligatorio - Sin any types
  • Linting - Ejecuta npm run lint
  • Commits - Usa conventional commits (feat:, fix:, etc.)
  • JSDoc - Documenta funciones públicas

Convenciones de Nombres

  • Componentes: PascalCase (UserButton.tsx)
  • Funciones: camelCase (getUserData)
  • Archivos web: kebab-case (user-service.ts)
  • Constantes: UPPER_SNAKE_CASE (MAX_TIMEOUT)

Seguridad

Medidas de Seguridad Implementadas

  • OAuth 2.0 - No almacenamos contraseñas
  • Token Encryption - Tokens guardados con encryption nativa
  • Google Drive Scopes Limitados - Solo permisos necesarios
  • Input Validation - DOMPurify para sanitizar HTML
  • HTTPS Enforced - En producción

Reportar Vulnerabilidades

Si encuentras una vulnerabilidad de seguridad, no abras un issue público. En su lugar:

Envía un email a vxeque@gmail.com con detalles de la vulnerabilidad.

Buenas Prácticas

  • Nunca commites secretos o credenciales
  • Usa variables de entorno para configuración sensible
  • Revisa dependencias regularmente
  • Mantén las librerías actualizadas

Soporte & Recursos

¿Necesitas Ayuda?

🐛 Reportar Bugs

Abre un issue en GitHub

💬 Preguntas

Inicia una discusión

✨ Sugerencias

Propón una feature

📚 Docs

Lee esta documentación completa

Links Útiles