Turns a scattered email and chat back-and-forth into one structured sheet that becomes the actual scope of the quotation.
Collecting project requirements from a freelance or contract client over email or chat is unstructured. Details get missed, and without a written scope, “what was actually agreed” becomes a dispute later instead of a shared reference.
Freelance and contract clients bringing a new website, online store or custom software project, before any code is written, and me, on the receiving end.
It had to work for a client who has never seen the tool: open a link, no account, no install. One form had to flex across very different projects, from a brochure site to an internal SaaS tool, without becoming a maze. And an 18-section form risks losing twenty minutes of typing to a closed tab.
The first answer, “what are you building?”, decides which later sections appear: custom-software projects get user roles, modules, data sensitivity and hosting questions; a brochure site does not. The form ends in a declaration step where the client types their name to confirm written engagement terms covering scope, quotation, payment, revisions and ownership. The submission goes to the API, and if that fails the form falls back to opening the client’s own email app with the summary ready to send.
A single-file client. The form itself is one dependency-free HTML file on purpose. A client should be able to open a link and start typing with nothing to install or sign up for.
A database-free backend. Each submission is one JSON file written through the GitHub Contents API, so there is no database to run or pay for, and every change is a commit that doubles as an audit trail. Which repository holds the files is a deployment setting.
Simple, checked admin auth. The admin password is verified against a PBKDF2 hash (SHA-256) and a successful login returns an HMAC-signed token that expires after 12 hours. The list, item and status endpoints all reject requests without a valid token.
A lead pipeline. Every submission moves through New, Contacted, Quoted, Negotiating, Won or Lost, so the dashboard shows where each conversation stands.
Graceful degradation. Draft autosave uses local storage, debounced and flushed when the tab is hidden or closed, so no server or account is needed to keep progress. If the API is unreachable, the email fallback still delivers the brief.
There is no automated test suite yet, and the optional WhatsApp alert on a new submission is a configuration setting rather than something built in by default.
It is now the intake step before quoting new freelance and contract work, and the “how do you handle this today” and “why now” questions it asks are the ones that used to get lost in a chat thread. Exact usage is not logged.
Putting the engagement terms directly into the form’s declaration step, instead of a separate contract sent later, means client and freelancer agree on the boundary of the work before it starts, not after a disagreement about it.