{"id":"doc_aXphZ1HMb1tXYp23OMWvrRMZNrkU","version":1,"filename":"spec.md","description":"TomlTech has been asked to build a \"simple client portal\" for a law firm. The law firm's definition of \"simple\" and our definition of \"simple\" have not ...","title":"Client Portal Specification","content":"# Client Portal Specification\n\n## Overview\n\nTomlTech has been asked to build a \"simple client portal\" for a law firm. The law firm's definition of \"simple\" and our definition of \"simple\" have not been reconciled.\n\n## Requirements (as stated by client)\n\n1. Clients log in and see their cases\n2. Lawyers upload documents to cases\n3. Clients download documents\n4. \"Make it look modern\"\n5. \"Like the Apple website but for law\"\n6. It should work on phones\n7. \"Can we add AI?\"\n\n## Requirements (as interpreted by engineering)\n\n1. Authentication system with role-based access (client, lawyer, admin, paralegal, \"of counsel\" which is apparently a thing)\n2. Document management with upload, download, versioning, and access control per case\n3. Case management with status tracking, assignment, and notes\n4. Responsive design\n5. Clean UI that does not resemble the Apple website because that is a product showcase and this is a document portal\n6. Mobile-responsive (already covered by #4 but the client listed it separately so we're listing it separately)\n7. No\n\n## Technical Stack\n\n- Rails 7.1 (we learn from our mistakes, see [Rails 3 upgrade](../rails-3-upgrade/plan.md))\n- PostgreSQL 16\n- Hotwire (Turbo + Stimulus)\n- Tailwind CSS\n- Active Storage for documents\n- Devise for authentication\n- No AI\n\n## System Architecture\n\n```mermaid\nflowchart TD\n    subgraph Roles\n        A[Admin]\n        L[Lawyer]\n        P[Paralegal]\n        OC[Of Counsel]\n        C[Client]\n    end\n\n    subgraph Actions\n        Upload[Upload Document]\n        View[View Case]\n        Download[Download Document]\n        Fax[Send via eFax]\n        Manage[Manage Users & Cases]\n    end\n\n    A --> Manage\n    A --> Upload\n    L --> Upload\n    L --> View\n    P --> Upload\n    P --> View\n    OC --> View\n    C --> View\n    C --> Download\n    Upload --> Fax\n```\n\n## Open Questions\n\n- The client has asked for \"track changes like Word.\" We have explained that this is a web application, not Microsoft Word. The client has asked again. We have explained again. This cycle has repeated 4 times.\n- The client wants to send documents via the portal AND email AND fax. We have confirmed that they said fax. They confirmed. It is 2026 and they want fax.\n- One of the partners has asked if the portal can \"integrate with our existing system.\" Their existing system is a shared folder on a Windows XP machine in the basement. The Windows XP machine is named YOURPC.\n\n## Timeline\n\n| Phase | Duration | Notes |\n|-------|----------|-------|\n| Design | 2 weeks | Client has requested 3 rounds of revisions. We have budgeted for 7. |\n| Core build | 4 weeks | Authentication, case management, document upload |\n| Client feedback | 2 weeks | This is where the fax discussion will resurface |\n| Revisions | 2 weeks | Based on historical data, this will actually be 4 weeks |\n| Launch | 1 week | Plus 1 week of \"just one more thing\" |\n\n## Budget\n\nClient has asked for a fixed price quote. We have provided a range. Client has asked for the low end of the range as a fixed price. We have said no. Client has asked for a discount. We have said no. Client has asked if Gary is available. Gary is not available. Gary is never available.\n","url":"/tomltech/client-portal/spec.md.json","account":{"id":"acct_Xt3PcFnov6BzMDisOIF8U7jQL7ue","name":"TomlTech Consulting Group","url":"/tomltech.json","slug":"tomltech"},"tags":[],"project":{"id":"proj_GSxBuYiBBEyBqQ3xSkv72v2q8boc","name":"Client Portal","url":"/tomltech/client-portal.json","slug":"client-portal"},"locked_at":null,"locked_by":null,"uploaded_by":{"id":"user_LcwII51B5RTE3CqBgc6L9Sns0iv9","username":"deepak_tomltech","display_name":"Deepak Iyer"},"uploaded_at":"2026-03-09T00:00:00Z"}