For Developers
Start with the Getting Started instructions to install.
Database management
| Path | Used by | |
|---|---|---|
| Production | database/database.sqlite |
.env |
| Test | database/test-database.sqlite |
.env.testing |
Always specify the environment when running artisan commands against a specific database:
# Production
php artisan migrate:fresh --force
# Test database
php artisan migrate:fresh --force --env=testing
php artisan user:create test@example.com "Test" password123 --env=testingThe testing connection is defined in config/database.php and always points to the test database file regardless of .env.
Architecture notes
No deletion — Tasks and projects are never deleted, only archived. Use status = archived to hide things.
Status values — incomplete, done, archived. These are the only valid values; enforced at the migration level.
Authorization — Tasks and projects are private by default. Visibility is limited to the creator and explicitly assigned users. Look for the ->where('creator_id') / ->orWhereHas('assignments') pattern in TaskController and ProjectController.
Change logging — All creates and updates write a record to change_logs. The Activity view (/changelogs) surfaces this per-task, per-project, per-tag, or per-user.
File storage — Attachments use the private disk. Downloads are proxied through TaskAttachmentController::download() to enforce authorization.
Auth split — Session-based auth for web routes, hashed-token auth for API routes. The auth.api middleware (app/Http/Middleware/AuthenticateApiKey.php) validates bearer tokens against bcrypt hashes in api_keys and checks the user’s enabled status.
Adding pages to Other Links
I added the ability to add other links because I didn’t want to put words in your mouth with respect to a privacy policy or Terms of Service or such nonsense. Now it’s your problem to add.
Drop any Markdown file into storage/app/other-links/. It will:
- Appear as a link in the Other Links nav dropdown (desktop) and collapsible section (mobile)
- Be accessible at
/other-links/{filename}(filename including extension) - Use the filename (minus extension, with
-and_replaced by spaces) as the page title
The nav is populated by app/View/Composers/NavigationComposer.php, which shares $otherLinksFiles to all views using the navigation layout. Symlinks are supported.
Contributing to documentation
The docs live in docs/ and are built with Hugo.
If you don’t already have Hugo installed, you can do so on Ubuntu with:
apt-get install hugoTo preview changes locally:
cd docs
hugo serve -DThen open http://localhost:1313.
If you document something that others running Task Fiend would find useful, please consider contributing it back.