A collaborative time and quote estimation prototype for teams. Create estimates, assign team members, collect private or open inputs, review team calculations, and finalise quotes.
This is an experimentation project. It is built to validate look, feel, and needed features. Code is not production-ready or polished. Do not use in a live environment.
Dashboard & Activity
- Assigned drafts and recently edited estimates
- Team activity feed for estimate, task, assignment, import, deletion, and status changes
Estimate Catalogue & Lifecycle
- List all estimates with filtering by tag, project type, and assignment
- Rough and detailed estimate types with optional client and project classification
- Estimate statuses: draft (editable) and finalized (locked)
- Create and update estimates, with client-name autocomplete
- Archive (soft-delete) and restore estimates
Task Entry, Reordering & Bulk Markdown
- Add, edit, reorder, and delete task rows within an estimate
- Bulk create titled tasks and descriptions from pasted markdown
Estimation Values & Team Calculations
- Autosave one single-value or min/max-range estimate per user and task
- Estimate in hours or days, with days normalized to eight hours
- Confidence rating, response count, team mean, and low-confidence risk indicator per task
- Auto-calculated totals with configurable risk buffer factor
- Hourly rate and quote display
- Hideable summary and personal/team calculation views
- Blind estimation mode masks other members' values while an estimate is a draft
Team Assignments & Notifications
- Assign and unassign users; unassignment removes that user's estimate inputs
- Database assignment notification, plus email when enabled in the recipient's profile
- Idle-aware polling refreshes collaborative estimate data
Similar-Project Search & Row Import
- Search existing estimates by title, client name, project type, and tags
- Import task rows from a matched estimate into the current estimate
Rough-to-Detailed Conversion & Version History
- Convert a rough estimate into a linked detailed estimate
- Copy tasks, inputs, tags, project type, pricing settings, and blind-estimation setting
- Navigate parent and child estimates through version history
Tags & Project Types
- Tag estimates with reusable tags (tags auto-clean when unused)
- Categorise estimates by project type
- Filter the catalogue and similar-project search by both
- Create, rename, and delete project types from the administration area
Roles & Permissions
- Granular per-user capability flags (
can_manage_users,can_finalize,can_assign,can_change_tags,can_enforce_blind_estimation,can_update_project_details, etc.) - Policy-based authorisation for estimates, rows, tags, project types, and users
Admin: User Management, Impersonation & Mail Test
- List, create, edit, activate, deactivate, and delete users
- Change roles and granular permissions, and send password reset links
- Impersonate eligible active users and return to the administrator session
- Send a test mail from the admin panel
Profile, Auth & Theme
- Login, logout, password confirmation, and password reset
- Profile, password, and email-notification preference editing
- Account deletion and automatic logout for deactivated users
- Light, dark, and system appearance modes
Create Estimate (draft, rough or detailed)
-> Add Task Rows (manual or bulk markdown)
-> Assign Team Members
-> Members Enter Inputs (hours/days, range or single, confidence)
-> Review Calculations (team mean, totals, risk buffer, quote)
-> Finalize (locks estimate)
-> Unlock if changes needed
-> Archive when done
| Role | Capabilities |
|---|---|
| Admin | Full estimate and administration access, including users, project types, archive, impersonation, and mail testing |
| Manager | Manage estimates, assignments, finalization, and archive; user and project-type administration can be delegated with permission flags |
| Member | View and create estimates, manage owned drafts where permitted, and submit input to assigned drafts |
All authenticated users can view the estimate catalogue and estimate details. Permission flags provide finer control over user management, project types, assignment, finalization, tags, blind estimation, and project details.
The following are not yet implemented in this prototype:
- Production hardening, security review, operational safeguards, and complete audit coverage
- Public registration (only seeded/admin-created accounts)
- Public links or client portal
- Comments or approval workflow
- Notification inbox or read/unread workflow
- Real-time WebSockets (estimate collaboration uses polling)
- PDF or CSV export
- Permanent archive deletion (soft-delete only)
- PHP 8.4+
- Laravel 12
- Inertia 2
- React 19
- Tailwind CSS 3 (dark-mode class strategy)
- Vite 7 (build only; dev mode uses
build --watch) - SQLite (default; configurable via
.env) - DDEV local development environment
ddev start
# Copy .env if absent (DDEV may do this automatically):
ddev exec bash -c 'test -f .env || cp .env.example .env'
ddev composer install
ddev artisan key:generate
ddev artisan migrate --seed
ddev npm install
ddev npm run buildDDEV serves the Laravel site at the URL reported by ddev describe. Use ddev npm run dev to rebuild frontend assets while editing. The optional ddev composer run dev command also starts an application server, queue listener, and Pail logs, but its application server is redundant when DDEV is already serving the site.
The checked-in DDEV configuration binds its published development ports to
0.0.0.0for access from outside a VM. Use it only on a trusted network and restrict exposed ports with the VM or host firewall. Vite'sserver.hostsetting applies only when the Vite development server is invoked directly; the standardbuild --watchworkflow does not open a Vite port.
| Password | Role | |
|---|---|---|
| admin@company.com | password | Admin |
| manager@company.com | password | Manager |
| member@company.com | password | Member (default role) |
# Run tests
ddev artisan test --compact
# TypeScript type checking
ddev npm run typecheck
# Format PHP code (Laravel Pint)
ddev exec vendor/bin/pint --dirty
# Format frontend code (Prettier)
ddev npm run format




