- TypeScript 63%
- Rust 24.1%
- CSS 12.7%
- HTML 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| .vscode | ||
| docs | ||
| public | ||
| src | ||
| src-tauri | ||
| .gitignore | ||
| ARCHITECTURE.md | ||
| index.html | ||
| LICENSE | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README-EN.md | ||
| README.md | ||
| session-ses_50dc.md | ||
| sm_lines.txt | ||
| store_lines.txt | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
| vitest.setup.ts | ||
Petalfly
Petalfly es un cliente de APIs 100 % local-first. Todos los requests, entornos y settings viven como archivos planos dentro del workspace, listos para versionarse en Git. La aplicación combina React + Tauri + Rust para ofrecer un shell de escritorio privado, sin telemetría ni dependencias cloud.
Las capturas se generan al ejecutar
pnpm tauri devcon el workspace de ejemplo. Pueden actualizarse desdedocs/.
Características
- 🗂️ Árbol completo de colecciones basado en
/workspace/collections - ✍️ Editor tabulado estilo Postman para Params, Headers, Body, Auth, Tests, Docs y Raw
.pfs - 📚 Parser bidireccional de Petalfly Script 1.0 (YAML-like + bloques
""") - 🔐 Secret Manager con cifrado ChaCha20-Poly1305 + PBKDF2 y master password en memoria
- ⚙️ Settings avanzados: tema, timeout, SSL, historial, debug logs
- 📜 Historial por request (
workspace/history/<requestId>.json) con restauración de payload - 🧪 Test runner visual con JSONPath, status, headers y body assertions
- 📤 Exportador a curl 100 % equivalente + importador curl →
.pfs - 🧵 Respuesta con tabs: Body pretty/raw, Headers, Tests, Curl, History
- 🪶 UI inspirada en pétalos flotando (gradientes suaves + tipografía JetBrains Mono)
Tecnologías
- Frontend: React 19 + Vite + Zustand + React Markdown
- Backend: Tauri 2 + Rust (
reqwest,serde_yaml,chacha20poly1305) - Lenguaje: Petalfly Script (
petalfly 1.0) con parser propio y tests
Requisitos
- Node.js 20+ y pnpm 9+
- Rust estable + toolchains requeridos por Tauri (MSVC en Windows, Xcode CLI en macOS)
- Workspace accesible en disco (por defecto
./workspace)
Primeros pasos
pnpm install
pnpm tauri dev
El workspace inicial incluye:
collections/sample.pfs– request de demoenvironments/env.dev.yaml– entorno con un secret (token)globals.yaml– variables globalessettings.json– configuración general
Scripts
| Script | Descripción |
|---|---|
pnpm tauri dev |
Ejecuta Petalfly en modo escritorio con recarga en vivo |
pnpm build |
Empaqueta el frontend (Vite) |
pnpm test |
Ejecuta Vitest (parser, resolver, curl, test runner) |
pnpm tauri build |
Genera instaladores nativos |
cargo test --manifest-path src-tauri/Cargo.toml |
Pruebas Rust (FS, history, crypto) |
Lenguaje .pfs
petalfly 1.0
meta:
id: get-user
name: Get User
collection: Demo
tags: [users]
description: Obtiene un usuario
request:
method: GET
url: "{{baseUrl}}/users/{{userId}}"
headers:
Accept: application/json
query:
pretty:
value: true
enabled: true
body:
type: none
docs: """
## Documentación
Se permite markdown renderizado en vivo.
"""
tests:
- name: status 200
expect:
status: 200
examples:
- name: curl
curl: |
curl -X GET "{{baseUrl}}/users/{{userId}}"
- Variables:
{{nombre}}→ se resuelven con entornos (environments/*.yaml) +globals.yaml docsusa bloques""". Cualquier bloque|se conserva como texto multilínea- Tests soportan
status,header.contains/equals,body.contains,json.path/type/equals
Secrets y entornos
- Ve a Secret Manager y define la master password (solo vive en memoria).
- Crea secrets (
secret: true) dentro del entorno activo. - Usa
Revealpara verlos temporalmente;Encrypt & Savelos persiste cifrados en YAML. - Durante la ejecución, los secrets se descifran en memoria y nunca se guardan en logs.
Los entornos se almacenan como YAML/JSON en workspace/environments. Todos los secrets se escriben cifrados; el valor plano se mantiene en caché mientras la app está abierta.
Árbol de colecciones
El sidebar refleja exactamente la estructura de workspace/collections (subcarpetas + .pfs). Desde el menú puedes:
- Crear carpetas/requests
- Duplicar, renombrar o eliminar archivos
- Importar un
curly convertirlo automáticamente a.pfs
Respuesta e historial
- Body: formato pretty para JSON, fallback raw.
- Headers: tabla key/value.
- Tests: resultados del runner + botón “Run Tests Again” (sin re-ejecutar HTTP).
- Curl: comando equivalente al request enviado (copy to clipboard).
- History: últimos
Nresultados (configurable) con timestamp, status y botón “Restore” para volver a un payload anterior.
Cada request guarda su historial en workspace/history/<requestId>.json.
Importar / Exportar curl
- Export: pestaña “Curl” del panel de respuesta →
Copy. - Import: botón “Importar cURL” en el sidebar → pega un comando, se crea un
.pfscon meta e inferencias de headers/body.
Estructura del repo
workspace/
collections/
environments/
globals.yaml
history/
settings.json
src/
components/ # Sidebar, tabs, modales
services/ # pfsParser, variableResolver, httpClient, curl
store/useAppStore # Zustand + lógica de dominio
src-tauri/
commands/fs.rs # FS, settings, env, collections
crypto.rs # ChaCha20-Poly1305 + PBKDF2
history.rs # Persistencia de historiales
http_client.rs # reqwest + métricas
Tests
- Parser, resolver, test runner y curl conversion están cubiertos con Vitest.
- Rust valida FS, parseo
.pfs, guardado y lectura de workspace, además del módulo de history.

