{"id":44301921,"url":"https://github.com/ihkaru/cerdas","last_synced_at":"2026-04-15T15:01:30.073Z","repository":{"id":333217184,"uuid":"1136588162","full_name":"ihkaru/cerdas","owner":"ihkaru","description":"Open-source, self-hosted AppSheet alternative. Build offline-first mobile apps for data collection without code. Unlimited users, Docker-ready, and powered by Vue \u0026 Laravel","archived":false,"fork":false,"pushed_at":"2026-04-13T13:50:57.000Z","size":25216,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T14:25:07.793Z","etag":null,"topics":["android","appsheet-alternative","capacitor","data-collection","docker","form-builder","frankenphp","laravel","no-code","offline-first","pwa","self-hosted","vue"],"latest_commit_sha":null,"homepage":"","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ihkaru.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":"audit-deployment.bat","citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-18T00:42:30.000Z","updated_at":"2026-04-13T13:50:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ihkaru/cerdas","commit_stats":null,"previous_names":["ihkaru/cerdas"],"tags_count":53,"template":false,"template_full_name":null,"purl":"pkg:github/ihkaru/cerdas","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihkaru%2Fcerdas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihkaru%2Fcerdas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihkaru%2Fcerdas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihkaru%2Fcerdas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ihkaru","download_url":"https://codeload.github.com/ihkaru/cerdas/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ihkaru%2Fcerdas/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31846423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T13:28:40.153Z","status":"ssl_error","status_checked_at":"2026-04-15T13:28:29.396Z","response_time":63,"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":["android","appsheet-alternative","capacitor","data-collection","docker","form-builder","frankenphp","laravel","no-code","offline-first","pwa","self-hosted","vue"],"created_at":"2026-02-11T02:21:33.091Z","updated_at":"2026-04-15T15:01:30.068Z","avatar_url":"https://github.com/ihkaru.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🧠 Cerdas\n\n### Open-Source Self-Hosted AppSheet Alternative\n\n**Build, deploy, and manage mobile data collection apps — no code required.**\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Laravel 12](https://img.shields.io/badge/Laravel-12-FF2D20?logo=laravel\u0026logoColor=white)](https://laravel.com)\n[![Vue 3](https://img.shields.io/badge/Vue-3-4FC08D?logo=vue.js\u0026logoColor=white)](https://vuejs.org)\n[![FrankenPHP](https://img.shields.io/badge/FrankenPHP-Octane-8B5CF6?logo=php\u0026logoColor=white)](https://frankenphp.dev)\n[![Build APK](https://github.com/ihkaru/cerdas/actions/workflows/build-android.yml/badge.svg)](https://github.com/ihkaru/cerdas/actions/workflows/build-android.yml)\n[![Octane Audit](https://github.com/ihkaru/cerdas/actions/workflows/octane-audit.yml/badge.svg)](https://github.com/ihkaru/cerdas/actions/workflows/octane-audit.yml)\n\n[Download APK](https://github.com/ihkaru/cerdas/releases/latest) · [Quick Start](QUICKSTART.md) · [Documentation](docs/) · [Roadmap](ROADMAP.md)\n\n\u003c/div\u003e\n\n---\n\n## Why Cerdas?\n\nMost no-code platforms come with **heavy restrictions**. Cerdas was born out of the frustration with AppSheet's limit of **only 10 users** for the free tier.\n\n|                   | AppSheet       | KoboToolbox | **Cerdas**              |\n|-------------------|----------------|-------------|-------------------------|\n| **Self-Hosted**   | ❌             | ✅          | ✅                      |\n| **User Limit**    | 10 (free)      | Unlimited   | **Unlimited**           |\n| **Offline-First** | Partial        | ❌          | ✅                      |\n| **Custom Hosting**| ❌             | Complex     | **Docker one-click**    |\n| **Monthly Cost**  | $10/user       | Free        | **Free**                |\n\n## Key Features\n\n- **📱 Offline-First Mobile Client** — Built with Framework7 + Capacitor. Operates fully offline using SQLite and syncs data when connectivity is restored.\n- **🛠️ Visual Form Editor** — Web-based builder for complex schemas, with support for nested forms, repeating groups, conditional fields, and dynamic options.\n- **🧠 JS Expression Engine** — Write custom JavaScript closures directly in the editor to control validation (`Warning`), field visibility (`Show If`), edit access (`Editable If`), pre-calculated values (`Formula`), and default values (`Initial Value`).\n- **🔄 Bi-directional Sync** — Background synchronization with conflict handling for large datasets and binary media attachments.\n- **🗺️ GPS + Map** — Native coordinate capture with accuracy metadata and offline-capable map previews via MapLibre GL.\n- **📊 Data Export** — Export submissions to Excel/CSV for downstream analysis.\n- **🔐 Role-Based Access** — Granular RBAC via Spatie Laravel Permission.\n- **⚡ High-Throughput Backend** — Laravel Octane with FrankenPHP worker mode for sustained high concurrency.\n- **🤖 Automated CI/CD** — GitHub Actions for APK builds, Octane safety audits, code quality checks, and secret scanning.\n\n## Architecture\n\n```text\n┌─────────────────────────────────────────────────────────┐\n│                    Monorepo (pnpm workspaces)            │\n├──────────────┬──────────────┬──────────────┬────────────┤\n│  apps/client │ apps/editor  │ apps/backend │  packages/ │\n│  Mobile PWA  │  Web Editor  │  Laravel API │  Shared    │\n│  Vue 3 + F7  │  Vue 3 + F7  │  Octane +    │  Libs      │\n│  Capacitor   │              │  FrankenPHP  │            │\n├──────────────┴──────────────┴──────┬───────┴────────────┤\n│           Docker Compose           │     GitHub Actions  │\n│    FrankenPHP · Redis · MySQL      │  APK Build · Audit  │\n└────────────────────────────────────┴─────────────────────┘\n```\n\n| Layer | Technology | Purpose |\n|-------|-----------|---------|\n| **API Server** | Laravel 12 + Octane + FrankenPHP | High-performance API (worker mode) |\n| **Mobile Client** | Vue 3 + Framework7 + Capacitor | Offline-first PWA / Android APK |\n| **Form Editor** | Vue 3 + Framework7 | No-code visual form builder |\n| **Shared Packages** | TypeScript | Form engine, expression engine |\n| **Database** | MySQL (server) · SQLite (client) | Server-side + offline-first storage |\n| **Auth** | Laravel Sanctum + Google OAuth | Token-based API authentication |\n| **CI/CD** | GitHub Actions | APK builds, audits, quality checks |\n| **Deployment** | Docker Compose + Coolify | One-click self-hosted deployment |\n\n## Quick Start\n\n### Prerequisites\n\n- **PHP 8.2+** with `pcntl` extension\n- **Node.js 22+**\n- **pnpm** (`npm install -g pnpm`)\n- **Composer**\n- **Docker** (for the Docker-based workflow)\n\n### Option A — Docker (Recommended)\n\n```bash\ngit clone https://github.com/ihkaru/cerdas.git\ncd cerdas\n\n# Start all services (Backend + Client + Editor) in Docker\n./start-dev-docker.sh\n```\n\n### Option B — Local Setup\n\n```bash\ngit clone https://github.com/ihkaru/cerdas.git\ncd cerdas\n\n# Install all dependencies\npnpm install\n\n# Setup backend\ncd apps/backend\ncomposer install\ncp .env.example .env\nphp artisan key:generate\nphp artisan migrate\ncd ../..\n\n# Start all services (Windows)\n./start-all.bat\n\n# Start all services (Linux/Mac)\n./start-all.sh\n```\n\n### Verification\n\nRun this before pushing to ensure the build is clean.\n\n```bash\n# Linux / Mac\n./verify-local.sh\n\n# Windows (PowerShell)\n./verify-local.ps1\n```\n\n### Production (Docker)\n\n```bash\ndocker compose -f docker-compose.prod.yml up -d\n```\n\n\u003e See [Coolify Deployment Guide](COOLIFY_GUIDE.md) for managed hosting setup.\n\n## Project Structure\n\n```\ncerdas/\n├── apps/\n│   ├── backend/           # Laravel 12 API (Octane + FrankenPHP)\n│   ├── client/            # Mobile PWA (Vue 3 + Framework7 + Capacitor)\n│   └── editor/            # Web Editor (Vue 3 + Framework7)\n├── packages/\n│   ├── form-engine/       # Shared form rendering library\n│   └── expression-engine/ # JS expression evaluator for dynamic field logic\n├── scripts/               # Automation \u0026 audit scripts\n├── .github/workflows/     # CI/CD pipelines\n└── docker-compose.prod.yml\n```\n\n## CI/CD Pipelines\n\n| Workflow | Trigger | Purpose |\n|----------|---------|---------| \n| **Build APK** | Push to `main` (client changes) | Auto-build signed APK → GitHub Releases |\n| **Octane Audit** | Push to `main` (backend changes) | Detect memory leak patterns before deploy |\n| **Code Quality** | Push to `main` (apps changes) | ESLint (Vue/TS) + Laravel Pint (PHP) |\n| **Secret Scan** | Push to `main` (all) | Detect leaked credentials/keys |\n\n## Security\n\n- All secrets managed via GitHub Secrets / environment variables\n- Automated credential leak detection via pre-commit hooks\n- Octane-safe code patterns enforced by CI\n\n## License\n\n[MIT License](LICENSE) — free to use, modify, and distribute.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  Built with ❤️ for field data collection teams.\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fihkaru%2Fcerdas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fihkaru%2Fcerdas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fihkaru%2Fcerdas/lists"}