{"id":50940954,"url":"https://github.com/fiforms/dronelogapp","last_synced_at":"2026-06-17T14:33:34.254Z","repository":{"id":362412859,"uuid":"1258756657","full_name":"fiforms/dronelogapp","owner":"fiforms","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-04T04:18:20.000Z","size":221,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-04T06:11:51.516Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fiforms.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":null}},"created_at":"2026-06-03T22:22:47.000Z","updated_at":"2026-06-04T04:18:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fiforms/dronelogapp","commit_stats":null,"previous_names":["fiforms/dronelogapp"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/fiforms/dronelogapp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fiforms%2Fdronelogapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fiforms%2Fdronelogapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fiforms%2Fdronelogapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fiforms%2Fdronelogapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fiforms","download_url":"https://codeload.github.com/fiforms/dronelogapp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fiforms%2Fdronelogapp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34453431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-17T14:33:31.223Z","updated_at":"2026-06-17T14:33:34.247Z","avatar_url":"https://github.com/fiforms.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DroneLog\n\nA Part 107-compliant drone flight logging PWA. Log flights in the field with or without internet connectivity — records sync to a Laravel backend when you're back online.\n\nSee [ARCHITECTURE.md](ARCHITECTURE.md) for the full design and [CLAUDE.md](CLAUDE.md) for developer context.\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|---|---|\n| Backend | Laravel 11 + Breeze API (Sanctum cookie auth) |\n| Database | SQLite (dev) / MySQL (production) |\n| Frontend | Vue 3 + Vite |\n| State | Pinia |\n| Offline storage | Dexie.js (IndexedDB) |\n| PWA | vite-plugin-pwa (Workbox) |\n| Styling | Tailwind CSS |\n\n---\n\n## Quick Start (Local Dev)\n\n### Prerequisites\n\n- PHP 8.4+ with extensions: `pdo_sqlite`, `pdo_mysql`\n- Composer 2\n- Node 20+\n\n### Setup\n\n```bash\ncp .env.example .env\ncomposer install\nphp artisan key:generate\ntouch database/database.sqlite\nphp artisan migrate --seed\nnpm install\n```\n\nCreate your first user account:\n\n```bash\nphp artisan user:create\n```\n\nThen start both dev servers:\n\n```bash\nphp artisan serve   # API → http://localhost:8000\nnpm run dev         # SPA → http://localhost:5173\n```\n\nVisit `http://localhost:5173` and log in with the credentials you just created.\n\n### User management\n\n```bash\nphp artisan user:create                      # create a new account\nphp artisan user:reset-password              # reset a password (prompts for email)\nphp artisan user:reset-password you@email    # reset a password (email as argument)\n```\n\n---\n\n## Google OAuth Setup\n\nUsers can sign in with their Google account. OAuth is intended for production use on a real domain — Google requires a publicly accessible HTTPS redirect URI.\n\n### 1. Create credentials\n\n1. Go to [Google Cloud Console](https://console.cloud.google.com/) → **APIs \u0026 Services** → **Credentials**\n2. Click **Create Credentials** → **OAuth 2.0 Client ID**\n3. Set application type to **Web application**\n4. Under **Authorized redirect URIs**, add your production callback URL:\n   ```\n   https://yourdomain.example.com/auth/google/callback\n   ```\n5. Copy the **Client ID** and **Client Secret**\n\n### 2. Add to `.env`\n\n```env\nGOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com\nGOOGLE_CLIENT_SECRET=your-client-secret\nGOOGLE_REDIRECT_URI=https://yourdomain.example.com/auth/google/callback\n```\n\nAlso make sure `APP_URL` and `FRONTEND_URL` are set to your domain:\n\n```env\nAPP_URL=https://yourdomain.example.com\nFRONTEND_URL=https://yourdomain.example.com\n```\n\nThen clear the config cache:\n\n```bash\nphp artisan config:cache\n```\n\n### Account collision policy\n\nIf someone attempts to sign in with Google using an email address that already has a password-based account, the login **hard fails** with an error message. Accounts are never auto-linked. The user must sign in with their password.\n\n---\n\n## Production Deployment\n\n### Prerequisites\n\n- PHP 8.4+ with extensions: `pdo_mysql`, `mbstring`, `xml`, `curl`\n- Composer 2\n- Node 20+ (only needed to build the frontend; not required on the server after that)\n- MySQL 8+\n- A web server (nginx or Apache) pointed at `public/`\n- HTTPS — required for PWA install and the Geolocation API\n\n### First deploy\n\n```bash\ngit clone \u003crepo\u003e /var/www/dronelogapp\ncd /var/www/dronelogapp\n\ncomposer install --no-dev --optimize-autoloader\nnpm ci \u0026\u0026 npm run build\n\ncp .env.example .env\nphp artisan key:generate\n```\n\nEdit `.env` and set at minimum:\n\n```env\nAPP_ENV=production\nAPP_DEBUG=false\nAPP_URL=https://yourdomain.example.com\nFRONTEND_URL=https://yourdomain.example.com\n\nDB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_DATABASE=dronelog\nDB_USERNAME=your_db_user\nDB_PASSWORD=your_db_password\n\nSANCTUM_STATEFUL_DOMAINS=yourdomain.example.com\nSESSION_DOMAIN=.yourdomain.example.com\n```\n\nThen run:\n\n```bash\nphp artisan migrate --force\n\n# Create the storage directory structure Laravel needs\nmkdir -p storage/framework/{cache,sessions,testing,views}\nchmod -R 775 storage bootstrap/cache\nchown -R www-data:www-data storage bootstrap/cache\n\nphp artisan storage:link\nphp artisan config:cache \u0026\u0026 php artisan route:cache \u0026\u0026 php artisan view:cache\n\nphp artisan user:create   # create your first account\n```\n\n### Subsequent deploys\n\n```bash\ngit pull\ncomposer install --no-dev --optimize-autoloader\nnpm ci \u0026\u0026 npm run build\n\nphp artisan migrate --force\nphp artisan config:cache \u0026\u0026 php artisan route:cache \u0026\u0026 php artisan view:cache\n```\n\n### Google OAuth (optional)\n\nSee the [Google OAuth Setup](#google-oauth-setup) section above. Set `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, and `GOOGLE_REDIRECT_URI` in `.env`, then run `php artisan config:cache`.\n\n**HTTPS is required** for PWA install and the Geolocation API.\n\n---\n\n## PWA Installation\n\n- **Android (Chrome):** Install prompt appears automatically. Or: menu → \"Add to Home Screen\".\n- **iOS (Safari):** Share → \"Add to Home Screen\".\n\nOnce installed the app runs standalone (no browser chrome) and works fully offline.\n\n---\n\n## Customizing the Pre-Flight Checklist\n\nThe default 4-item checklist is created automatically when a user registers. Edit it in the **Checklists** section of the app. You can add/remove items, create multiple templates, and enable optional comment boxes per item.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffiforms%2Fdronelogapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffiforms%2Fdronelogapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffiforms%2Fdronelogapp/lists"}