{"id":47668945,"url":"https://github.com/snaapi/snaapi","last_synced_at":"2026-04-02T12:17:59.012Z","repository":{"id":345334169,"uuid":"934476321","full_name":"snaapi/snaapi","owner":"snaapi","description":"Rapid API development platform without writing code","archived":false,"fork":false,"pushed_at":"2026-03-26T15:08:30.000Z","size":6119,"stargazers_count":0,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T21:48:25.825Z","etag":null,"topics":["ai-tools","api","deno","no-code","openapi","typescript"],"latest_commit_sha":null,"homepage":"https://snaapi.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/snaapi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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":"CLA.md"}},"created_at":"2025-02-17T22:39:14.000Z","updated_at":"2026-03-25T23:23:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/snaapi/snaapi","commit_stats":null,"previous_names":["snaapi/snaapi"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/snaapi/snaapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snaapi%2Fsnaapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snaapi%2Fsnaapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snaapi%2Fsnaapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snaapi%2Fsnaapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snaapi","download_url":"https://codeload.github.com/snaapi/snaapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snaapi%2Fsnaapi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31305984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T09:48:21.550Z","status":"ssl_error","status_checked_at":"2026-04-02T09:48:19.196Z","response_time":89,"last_error":"SSL_read: 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":["ai-tools","api","deno","no-code","openapi","typescript"],"created_at":"2026-04-02T12:17:58.340Z","updated_at":"2026-04-02T12:17:58.999Z","avatar_url":"https://github.com/snaapi.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Snaapi\n\nA production-ready platform that enables rapid API development without writing\ncode. Easily define resources, configure permissions, and instantly get an API\nwith built-in authentication, documentation, role-based access control,\nwebhooks, and event streaming.\n\n![Snaapi Console](.github/assets/edit-view-angled.png)\n\n## Overview\n\nSnaapi transforms API development from weeks to minutes. Define your data models\nthrough a web console or YAML configuration, set up role-based permissions, and\nimmediately get fully-functional API endpoints with authentication, validation,\nand audit trails built in.\n\n- **10x Faster Development**: Launch APIs in minutes instead of weeks\n- **Enterprise-Grade Security**: Built-in RBAC with field-level and row-level\n  access control\n- **Zero Infrastructure Management**: Complete backend platform in a single\n  deployment\n- **Event-Driven Architecture**: Real-time webhooks and async job processing\n  included\n- **Audit \u0026 Compliance**: Full event logging with session context and\n  distributed tracing\n\n## Key Features\n\n### Automatic API\n\n- Define resources through web console or YAML\n- Instant REST endpoints with full CRUD operations\n- 10 field types: string, text, number, boolean, datetime, timestamp, json,\n  uuid, enum, relation\n- Automatic schema validation\n- OpenAPI spec generation (JSON and YAML) at global and per-resource levels\n\n### Enterprise Security\n\n- **Authentication**: Email/password, SSO, API keys with rate limiting (1000\n  req/min)\n- **RBAC**: Role-based access control with granular permissions\n- **Field-Level Security**: Control which fields are accessible per role\n- **Row-Level Security**: Filter data based on user context via JWT claims\n- **Auto-Injection**: Automatically populate fields (e.g., owner_id) based on\n  user context\n- **API Key Management**: Hashed keys with expiration, rate limits, and usage\n  tracking\n\n### Resource Management\n\n- Dynamic resource definitions stored in registry\n- Reusable field library across resources\n- Soft delete support for data retention\n- Resource enable/disable without data loss\n- Import/Export configuration as YAML, GraphQL SDL (`.graphql`/`.gql`), or\n  Excel/CSV\n- Automatic database table creation\n\n### Event System \u0026 Webhooks\n\n- Capture all lifecycle events (created, updated, deleted)\n- Detailed change tracking with old/new state comparison\n- Session variables (userId, role, IP, userAgent)\n- Distributed tracing (traceId, spanId, requestId, correlationId)\n- Webhook subscriptions with pattern matching (wildcards supported)\n- Automatic retry with exponential backoff\n- Delivery status tracking\n\n### Real-Time Streaming\n\n- Server-Sent Events (SSE) for real-time resource event streaming\n- Subscribe to lifecycle events: created, updated, deleted\n- Filter events by type and select specific fields\n- Role-based access control applied to streamed data\n- Automatic heartbeat every 30s to keep connections alive\n- Auto-reconnect with 3s retry directive\n\n### Background Job Processing\n\n- Event-driven job execution system\n- Pattern-based job routing (glob matching)\n- Configurable retry policies with exponential backoff\n- Execution locking prevents concurrent processing\n- Detailed invocation tracking per attempt\n- Built-in processors: resource table creation, webhook delivery\n\n### Admin Console\n\n- Full-featured web UI built with Fresh and Preact\n- Resource creation wizard\n- Permission builder with visual constraint editor\n- User and role management\n- AI Chat Assistant (`/console/chat`) for natural-language resource management\n- Analytics Dashboard (`/console/analytics`) with real-time metrics\n- AI Content Generation for seeding resources with sample data\n- Getting Started wizard for guided initial setup\n- Event log viewer for audit trails\n- Webhook configuration and monitoring\n- Light/dark theme support\n\n## Technical Architecture\n\n### Technology Stack\n\n**Backend:**\n\n- **Runtime**: Deno with TypeScript\n- **Framework**: Fresh (full-stack web framework)\n- **Database**: PostgreSQL with JSONB storage\n- **Authentication**: Better Auth with JWT sessions\n- **Validation**: Valibot (TypeScript-native schema validation)\n- **Observability**: OpenTelemetry integration\n\n**Frontend:**\n\n- **UI Framework**: Preact with server-side rendering\n- **State Management**: Preact Signals\n- **Styling**: Tailwind CSS + DaisyUI components\n- **Build Tool**: Vite\n\n### Data Flow\n\n1. **Request** → Fresh app receives HTTP request\n2. **Authentication** → Validates session/API key via Better Auth\n3. **Resource Resolution** → Loads resource definition and permissions\n4. **Validation** → Request validated against resource schema\n5. **Field Filtering** → Only permitted fields processed\n6. **Store Operation** → CRUD operation executed on PostgreSQL\n7. **Event Emission** → Resource changes trigger events\n8. **Webhook Dispatch** → Events sent to registered endpoints\n9. **Job Processing** → Background jobs process events asynchronously\n10. **Response** → Filtered response returned to client\n\n## Getting Started\n\n### Prerequisites\n\n- Deno 2.6+ installed\n- PostgreSQL 14+ database\n- Environment variables configured (see Configuration section)\n\n### Installation\n\n```bash\n# Clone repository\ngit clone https://github.com/snaapi/snaapi.git\ncd snaapi\n\n# Configure environment\ncp .env.example .env\n# Edit .env with your database URL and settings\n\n# Start server\ndeno task dev\n```\n\n### Initial Setup\n\n1. Navigate to `http://localhost:5173/install`\n2. Enter installation token (from logs or set the `SNAAPI_INSTALL_TOKEN`\n   environment variable)\n3. Create admin user with email and password\n4. Initial API key generated automatically\n5. Access admin console at `http://localhost:5173/console`\n\n### Quick Example: Create Your First API\n\n**Via Web Console:**\n\n1. Navigate to `/console/resources/create`\n2. Define resource (e.g., \"posts\")\n3. Add fields (title, body, author_id)\n4. Configure permissions (admin: full access, user: read-only)\n5. Click Create → API endpoints instantly available\n\n**Via YAML Import:**\n\n```yaml\nresources:\n  - name: posts\n    description: Blog posts\n    enabled: true\n    fields:\n      - name: title\n        type: string\n        required: true\n      - name: body\n        type: text\n        required: true\n      - name: author_id\n        type: uuid\n        required: true\n    permissions:\n      - role: admin\n        action: \"*\"\n      - role: user\n        action: read\n```\n\nUpload via `/console/resources` or POST to `/v1/_registry/import`\n\n### API Usage\n\nOnce a resource is created, use these endpoints:\n\n```bash\n# List all records\nGET /v1/posts\n\n# Create record\nPOST /v1/posts\nContent-Type: application/json\nAuthorization: Bearer YOUR_API_KEY\n\n{\n  \"title\": \"Hello World\",\n  \"body\": \"My first post\",\n  \"author_id\": \"uuid-here\"\n}\n\n# Get single record\nGET /v1/posts/:id\n\n# Update record\nPATCH /v1/posts/:id\n\n# Delete record\nDELETE /v1/posts/:id\n\n# Get resource OpenAPI spec\nGET /v1/posts/openapi.json\n```\n\n## API Reference\n\n### Resource Endpoints\n\n| Method    | Endpoint                     | Description                                            |\n| --------- | ---------------------------- | ------------------------------------------------------ |\n| GET       | `/v1/:resource`              | List all records (with pagination, sorting, filtering) |\n| POST      | `/v1/:resource`              | Create new record                                      |\n| GET       | `/v1/:resource/:id`          | Get single record by ID                                |\n| PUT/PATCH | `/v1/:resource/:id`          | Update record                                          |\n| DELETE    | `/v1/:resource/:id`          | Delete record                                          |\n| GET       | `/v1/:resource/stream`       | Stream real-time events via SSE                        |\n| GET       | `/v1/:resource/openapi.json` | Get resource OpenAPI spec (JSON)                       |\n| GET       | `/v1/:resource/openapi.yaml` | Get resource OpenAPI spec (YAML)                       |\n\n### OpenAPI Spec Generation\n\nSnaapi automatically generates OpenAPI 3.x specifications for your resources,\nenabling integration with API documentation tools like Swagger UI, Redoc, and\nPostman.\n\n**Global Endpoints** — return a combined spec for all resources:\n\n| Method | Endpoint        | Description              |\n| ------ | --------------- | ------------------------ |\n| GET    | `/openapi.json` | Full OpenAPI spec (JSON) |\n| GET    | `/openapi.yaml` | Full OpenAPI spec (YAML) |\n\n**Per-Resource Endpoints** — return the spec for a single resource:\n\n| Method | Endpoint                     | Description                  |\n| ------ | ---------------------------- | ---------------------------- |\n| GET    | `/v1/:resource/openapi.json` | Resource OpenAPI spec (JSON) |\n| GET    | `/v1/:resource/openapi.yaml` | Resource OpenAPI spec (YAML) |\n\nBy default, OpenAPI endpoints require authentication. Set\n`SNAAPI_OPENAPI_PUBLIC=true` to make them publicly accessible without a token\n(see [Configuration](#configuration)).\n\n### Registry Endpoints (Admin Only)\n\n| Method | Endpoint                              | Description                |\n| ------ | ------------------------------------- | -------------------------- |\n| GET    | `/v1/_registry/resources`             | List all resources         |\n| POST   | `/v1/_registry/resources`             | Create new resource        |\n| GET    | `/v1/_registry/resources/:id`         | Get resource details       |\n| PUT    | `/v1/_registry/resources/:id`         | Update resource            |\n| DELETE | `/v1/_registry/resources/:id`         | Delete resource            |\n| PUT    | `/v1/_registry/resources/:id/enable`  | Enable resource            |\n| PUT    | `/v1/_registry/resources/:id/disable` | Disable resource           |\n| POST   | `/v1/_registry/import`                | Import resources from YAML |\n| GET    | `/v1/_registry/export`                | Export resources as YAML   |\n\n**Import Formats:**\n\nSnaapi supports multiple import formats for defining resources:\n\n| Format                          | Method         | Description                                                                     |\n| ------------------------------- | -------------- | ------------------------------------------------------------------------------- |\n| YAML                            | API or Console | Full resource definitions with fields, permissions, settings                    |\n| GraphQL SDL (`.graphql`/`.gql`) | Console UI     | Schema-first import — types map to resources, fields infer types automatically  |\n| Excel/CSV                       | Console UI     | Spreadsheet import — columns become fields with type inference from sample data |\n\nThe **Console Import/Export page** at `/console/registry/import-export` provides\na unified UI for all import formats with preview, field editing, and\nconflict-resolution before committing changes.\n\n### Webhook Endpoints (Admin Only)\n\n| Method | Endpoint            | Description                 |\n| ------ | ------------------- | --------------------------- |\n| GET    | `/v1/_webhooks`     | List all webhooks           |\n| POST   | `/v1/_webhooks`     | Create webhook subscription |\n| GET    | `/v1/_webhooks/:id` | Get webhook details         |\n| PUT    | `/v1/_webhooks/:id` | Update webhook              |\n| DELETE | `/v1/_webhooks/:id` | Delete webhook              |\n\n### Query Parameters\n\n**Filtering:**\n\n```\n?field__operator=value\nExamples:\n  ?status__eq=active\n  ?age__gte=18\n  ?name__like=%john%\n  ?status__in=[\"active\",\"pending\"]\n```\n\n**Field Selection:**\n\n```\n?fields=field1,field2   # Select specific fields in response\nExamples:\n  ?fields=id,title,status\n  ?fields=name,email\n```\n\n**Sorting:**\n\n```\n?_sort=field          # Ascending\n?_sort=-field         # Descending\n```\n\n**Pagination:**\n\n```\n?_limit=50           # Records per page (max 1000)\n?_offset=0           # Starting position\n```\n\n### User Query Filter Operators\n\nThese operators are available for filtering in API query parameters\n(`?field__operator=value`):\n\n| Operator                 | Description                                | Example                           |\n| ------------------------ | ------------------------------------------ | --------------------------------- |\n| `eq`                     | Equal                                      | `status__eq=active`               |\n| `neq`                    | Not equal                                  | `status__neq=draft`               |\n| `gt`, `gte`              | Greater than (or equal)                    | `age__gte=18`                     |\n| `lt`, `lte`              | Less than (or equal)                       | `price__lt=100`                   |\n| `in`, `nin`              | In/not in array                            | `status__in=[\"active\",\"pending\"]` |\n| `is_null`, `is_not_null` | Null check                                 | `deleted_at__is_null=true`        |\n| `like`, `ilike`          | Pattern match (case-sensitive/insensitive) | `name__ilike=%john%`              |\n\n### Real-Time Streaming (SSE)\n\nConnect to the stream endpoint to receive real-time resource events via\nServer-Sent Events. The stream respects role-based access control and field\npermissions. See `src/resources/handlers.ts` streamHandler and\n`src/resources/stream_handler.ts` for implementation details.\n\n```bash\n# Stream all events for a resource\ncurl -N -H \"Authorization: Bearer YOUR_API_KEY\" \\\n  \"https://your-app.com/v1/posts/stream\"\n\n# Filter by event type and fields\ncurl -N -H \"Authorization: Bearer YOUR_API_KEY\" \\\n  \"https://your-app.com/v1/posts/stream?events=created,updated\u0026fields=title,body\"\n```\n\n```javascript\n// Browser usage with EventSource\n// Note: EventSource does not support custom headers.\n// Pass the token as a query parameter or use a polyfill library.\nconst stream = new EventSource(\n  \"/v1/posts/stream?events=created,updated\u0026fields=title,body\u0026token=YOUR_API_KEY\",\n);\n\nstream.onmessage = (event) =\u003e {\n  const data = JSON.parse(event.data);\n  console.log(`${data.eventType}:`, data.payload);\n};\n```\n\n**Query Parameters:**\n\n| Parameter | Description                                 | Default                     |\n| --------- | ------------------------------------------- | --------------------------- |\n| `events`  | Comma-separated event types to subscribe to | `created,updated,deleted`   |\n| `fields`  | Comma-separated fields to include in events | All fields allowed for role |\n\n### Permission Constraint Operators\n\n\u003e **Note:** The following operators are only available in permission constraint\n\u003e definitions (configured via the admin console or YAML import). They cannot be\n\u003e used in API query parameters.\n\n| Operator                 | Description                                | Example                           |\n| ------------------------ | ------------------------------------------ | --------------------------------- |\n| `eq`                     | Equal                                      | `status__eq=active`               |\n| `neq`                    | Not equal                                  | `status__neq=draft`               |\n| `gt`, `gte`              | Greater than (or equal)                    | `age__gte=18`                     |\n| `lt`, `lte`              | Less than (or equal)                       | `price__lt=100`                   |\n| `in`, `nin`              | In/not in array                            | `status__in=[\"active\",\"pending\"]` |\n| `is_null`, `is_not_null` | Null check                                 | `deleted_at__is_null=true`        |\n| `like`, `ilike`          | Pattern match (case-sensitive/insensitive) | `name__ilike=%john%`              |\n| `regex`, `iregex`        | Regular expression                         | `email__regex=.*@example\\\\.com`   |\n| `contains`               | JSON contains                              | `tags__contains=[\"featured\"]`     |\n| `has_key`                | JSON has key                               | `metadata__has_key=published`     |\n| `exists`, `not_exists`   | Relation exists                            | `author__exists=true`             |\n| `_and`, `_or`, `_not`    | Logical operators                          | Complex nested conditions         |\n\n## Configuration\n\n### Environment Variables\n\n**Database:**\n\n```bash\nDATABASE_URL=postgresql://user:pass@localhost:5432/snaapi\n```\n\n**Authentication:**\n\n```bash\nBETTER_AUTH_URL=http://localhost:8000\nSNAAPI_INSTALL_TOKEN=your-install-token-here\nSNAAPI_DEFAULT_ROLE=user\nENABLE_EMAIL_PASSWORD_LOGIN=true\nREQUIRE_EMAIL_VERIFICATION=false\n```\n\n**Application:**\n\n```bash\nAPP_ENV=development                 # development | production\nSNAAPI_AUTO_MIGRATE=true           # Auto-run migrations on startup\nSNAAPI_ENABLE_WORKER=true          # Enable background job processing\nSNAAPI_OPENAPI_PUBLIC=false        # Serve OpenAPI specs without authentication\nLOG_LEVEL=info                     # debug | info | warn | error\nLOG_FORMAT=pretty                  # pretty | json\n```\n\n**Analytics (Optional):**\n\n```bash\nANALYTICS_PROVIDER=prometheus        # prometheus | deno_deploy\nPROMETHEUS_URL=http://localhost:9090  # Prometheus server URL\nTEMPO_URL=http://localhost:3200      # Tempo tracing URL\nDENO_DEPLOY_TOKEN=                   # Deno Deploy access token (if using deno_deploy provider)\nDENO_DEPLOY_PROJECT=                 # Deno Deploy project ID (if using deno_deploy provider)\n```\n\n**Observability (Optional):**\n\n```bash\nOTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318\nOTEL_SERVICE_NAME=snaapi\n```\n\n### Deno Tasks\n\n```bash\ndeno task dev              # Start development server with watch mode\ndeno task start            # Start production server\ndeno task migrate          # Run database migrations\ndeno task test             # Run test suite\ndeno task test:watch       # Run tests in watch mode (re-runs on file changes)\ndeno task test:integration # Run integration test suite\ndeno task ok               # Run tests with coverage\ndeno task check            # Format, lint, and typecheck in one command\ndeno task lint             # Lint code\ndeno task fmt              # Format code\n```\n\n## Use Cases\n\n### Multi-Tenant SaaS Backend\n\nDefine resources with tenant_id constraints, use row-level security to isolate\ndata, and leverage JWT claims for automatic tenant filtering.\n\n### Internal Admin Portals\n\nRapidly build admin tools for managing production data with full audit trails,\nrole-based access, and real-time monitoring.\n\n### API Prototyping\n\nValidate product ideas quickly by creating functional APIs in minutes, iterate\nbased on feedback, then migrate to production.\n\n### Event-Driven Microservices\n\nUse webhook subscriptions to trigger downstream services, leverage background\njobs for async processing, and maintain event sourcing.\n\n### Mobile App Backends\n\nGenerate secure REST APIs for mobile apps with authentication, fine-grained\npermissions, and offline-sync friendly endpoints.\n\n### IoT Data Collection\n\nDefine sensor data resources, use API keys for device authentication, leverage\nevents for real-time monitoring and alerting.\n\n## Security Best Practices\n\n1. **Use API Keys for Service-to-Service**: Generate dedicated API keys for each\n   service with rate limits\n2. **Enable Row-Level Security**: Use filters to restrict data access based on\n   user context\n3. **Implement Field-Level Permissions**: Only expose necessary fields per role\n4. **Use Auto-Injection for Ownership**: Automatically set owner_id using checks\n   with JWT claims\n5. **Enable Email Verification**: Set `REQUIRE_EMAIL_VERIFICATION=true` for\n   production\n6. **Rotate Installation Tokens**: Change after initial setup\n7. **Monitor Event Logs**: Review audit trails regularly for suspicious activity\n8. **Use HTTPS in Production**: Ensure `APP_ENV=production` for secure cookies\n\n## Observability \u0026 Monitoring\n\n### OpenTelemetry Integration\n\nSnaapi includes built-in OpenTelemetry support for distributed tracing:\n\n```bash\n# Configure OTLP endpoint\nOTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318\nOTEL_SERVICE_NAME=snaapi\n```\n\n**Trace Context Propagation:**\n\n- All events include traceId, spanId, parentSpanId, requestId, correlationId\n- Webhooks propagate trace context to downstream services\n- Job executions linked to originating request traces\n\n### Event Logging\n\nEvery resource operation generates detailed events:\n\n- Event type (created, updated, deleted)\n- Old and new state with field-level changes\n- Session variables (userId, role, IP, userAgent)\n- Timestamp and unique event ID\n\nAccess via Admin Console (`/console/events`) or query directly:\n\n```bash\nGET /v1/_events?resourceName__eq=users\u0026eventType__eq=resource.updated\n```\n\n### Metrics \u0026 Statistics\n\nAdmin dashboard provides real-time statistics:\n\n- Resource counts and usage\n- User registrations and verifications\n- Role and permission distribution\n- Webhook delivery success rates\n- Event volume by type\n\n## Development\n\n### Testing\n\n```bash\n# Run all tests\ndeno task test\n\n# Run with coverage\ndeno task ok\n\n# Run specific test file\ndeno test src/registry/fields_test.ts\n```\n\n### Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit changes (`git commit -m 'Add amazing feature'`)\n4. Push to branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## Performance Characteristics\n\n- **Startup Time**: ~500ms (includes migrations if enabled)\n- **Request Latency**: \u003c10ms for simple CRUD operations\n- **Database Connections**: Max 20 concurrent (configurable)\n- **API Key Rate Limit**: 1000 requests/minute (configurable per key)\n- **Event Processing**: Batches of 10 events, 5 concurrent jobs\n- **Webhook Retries**: Exponential backoff up to 5 attempts\n\n## License\n\nThis project is licensed under the\n[GNU Affero General Public License v3.0 (AGPL-3.0)](LICENSE). See the LICENSE\nfile for full terms.\n\nFor enterprises requiring alternative licensing arrangements, commercial\ndual-licensing options are available. Contact\n[licensing@snaapi.dev](mailto:licensing@snaapi.dev) for details.\n\n## Support\n\n- **Documentation**:\n  [https://github.com/snaapi/snaapi](https://github.com/snaapi/snaapi)\n- **Issues**: [GitHub Issues](https://github.com/snaapi/snaapi/issues)\n- **Discussions**:\n  [GitHub Discussions](https://github.com/snaapi/snaapi/discussions)\n\n## Acknowledgments\n\nBuilt with:\n\n- [Deno](https://deno.land/) - Modern JavaScript/TypeScript runtime\n- [Fresh](https://fresh.deno.dev/) - Next-gen web framework\n- [Better Auth](https://better-auth.com/) - Authentication library\n- [PostgreSQL](https://www.postgresql.org/) - Reliable database\n- [Preact](https://preactjs.com/) - Lightweight React alternative\n- [Tailwind CSS](https://tailwindcss.com/) - Utility-first CSS framework\n- [DaisyUI](https://daisyui.com) - Tailwind CSS component library\n\n---\n\n**Snaapi** - Build production APIs in minutes, not weeks.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnaapi%2Fsnaapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsnaapi%2Fsnaapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnaapi%2Fsnaapi/lists"}