Add Fortify auth, Flux dark mode, demo seed, and Docker hot reload.
Protect recordings per user, seed a demo login on container start, and bind-mount the app with Vite HMR for local Compose development.
This commit is contained in:
@@ -2,10 +2,11 @@
|
||||
|
||||
Upload pocket-recorder audio (MP3, WAV, OGG, and more), extract embedded metadata, and transcribe locally with [faster-whisper-server](https://github.com/fedirz/faster-whisper-server). Audio never leaves your machine.
|
||||
|
||||
Built with Laravel 13, Blade, Alpine.js, Tailwind CSS 4, [Laravel Reverb](https://laravel.com/docs/reverb), FrankenPHP, and [Laravel AI](https://github.com/laravel/ai).
|
||||
Built with Laravel 13, Blade, Livewire, Flux UI, Alpine.js, Tailwind CSS 4, [Laravel Reverb](https://laravel.com/docs/reverb), FrankenPHP, and [Laravel AI](https://github.com/laravel/ai).
|
||||
|
||||
## Features
|
||||
|
||||
- User accounts with login and open registration (each user only sees their own recordings)
|
||||
- Upload common audio formats (MP3, WAV, OGG, FLAC, M4A, AAC, WebM, WMA, AIFF — up to 2 GB)
|
||||
- Automatic metadata extraction when tags are present (title, artist, album, duration, recorded date)
|
||||
- Search recordings by title, artist, or transcript
|
||||
@@ -79,10 +80,22 @@ On first start the app container will:
|
||||
|
||||
- create `database/database.sqlite` if needed
|
||||
- run migrations
|
||||
- seed a demo user (see below)
|
||||
- start FrankenPHP on port **8080**
|
||||
|
||||
Whisper may take a minute or two while the model downloads.
|
||||
|
||||
### Demo login
|
||||
|
||||
Every container start runs `db:seed`, which ensures this user exists:
|
||||
|
||||
| Field | Default |
|
||||
| --- | --- |
|
||||
| Email | `demo@example.com` |
|
||||
| Password | `password` |
|
||||
|
||||
Override with `SEED_USER_NAME`, `SEED_USER_EMAIL`, and `SEED_USER_PASSWORD` in `.env`.
|
||||
|
||||
### 5. Open the app
|
||||
|
||||
| URL | Purpose |
|
||||
@@ -110,6 +123,27 @@ docker compose up -d
|
||||
|
||||
Data under `./database`, `./storage/app`, and `./storage/logs` is kept on the host.
|
||||
|
||||
### Live reload while developing
|
||||
|
||||
Default Compose uses the built image, so PHP/Blade/CSS/JS changes need a rebuild. For day-to-day work, use the dev overlay (bind-mounts the repo and runs Vite HMR):
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.yml -f docker-compose.dev.yml up --build -d
|
||||
```
|
||||
|
||||
Or set once in `.env`:
|
||||
|
||||
```env
|
||||
COMPOSE_FILE=docker-compose.yml:docker-compose.dev.yml
|
||||
```
|
||||
|
||||
Then a normal `docker compose up -d` enables:
|
||||
|
||||
- host source mounted at `/app` (PHP, Blade, routes, etc. without rebuild)
|
||||
- `vite` on port **5173** for CSS/JS hot reload and Blade refresh
|
||||
- `queue:listen` so worker code picks up changes between jobs
|
||||
|
||||
Open [http://localhost:8080](http://localhost:8080) as usual. After changing Composer packages, run `docker compose exec app composer install`.
|
||||
## Services and ports
|
||||
|
||||
| Service | Host port | Role |
|
||||
@@ -118,6 +152,7 @@ Data under `./database`, `./storage/app`, and `./storage/logs` is kept on the ho
|
||||
| `reverb` | `8081` | WebSockets for live transcription status |
|
||||
| `whisper` | `8090` | faster-whisper HTTP API |
|
||||
| `queue` | — | `php artisan queue:work` for transcription jobs |
|
||||
| `vite` | `5173` | Vite HMR (dev overlay only) |
|
||||
|
||||
### Persistent data
|
||||
|
||||
@@ -162,11 +197,14 @@ Use the GPU Whisper service instead of the CPU `whisper` service when you have a
|
||||
|
||||
## Usage
|
||||
|
||||
1. Open **Recordings → Upload** and drop one or many audio files.
|
||||
2. Transcription starts automatically (the `queue` service must be running).
|
||||
3. Watch live progress on the list or detail page; stop or restart anytime.
|
||||
4. Search by title, artist, or transcript text.
|
||||
5. For older uploads still **Queued** with no progress, use **Queue pending transcriptions** on the recordings list.
|
||||
1. Open the app and **Log in** with the demo user (`demo@example.com` / `password`), or **Register** a new account.
|
||||
2. Open **Recordings → Upload** and drop one or many audio files.
|
||||
3. Transcription starts automatically (the `queue` service must be running).
|
||||
4. Watch live progress on the list or detail page; stop or restart anytime.
|
||||
5. Search by title, artist, or transcript text.
|
||||
6. For older uploads still **Queued** with no progress, use **Queue pending transcriptions** on the recordings list.
|
||||
|
||||
The demo user is re-seeded on every container start. Any recordings with no owner are assigned to that demo user. Later registered users only see their own uploads.
|
||||
|
||||
Finished transcripts are stored on each recording and are included in search.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user