One command generates five document types from YAML: service agreement, NDA, scoping questionnaire, kickoff document and welcome email
client-onboard-kit — HTML Business Template
By waseemnasir2k26
A Python-based command-line tool that reads a client information YAML and generates a service agreement, NDA, scoping questionnaire, kickoff document and welcome email, outputting Markdown and print-ready HTML.
Explore the design
Compare the page layouts and mobile experience. Open any screenshot for a closer look.
Actual screenshot captured by the server browser.
All pages & views 3
Screenshots show visual appearance; interactive behavior may differ.
What stands out
A quick read of the recorded project description.
Each document is output both as Markdown and as a standalone HTML page with built-in print styles and a Save as PDF button
Templates are ordinary Markdown with Jinja2 placeholders, can be copied and customized via --templates
When required fields are missing, the build aborts and indicates the field name and template name, avoiding documents with gaps
Supports both mutual and one_way NDA modes, with dates, currency and jurisdiction switched via configuration
The project explicitly states that the output is templates rather than legal advice and does not constitute compliance certification for any jurisdiction
Template Details
client-onboard-kit converts a YAML brief about a new client into a complete client onboarding document pack, containing five document types: service agreement, NDA, scoping questionnaire, kickoff document and welcome email. Each document is output both as Markdown and as a standalone HTML page with built-in print styles and a "Save as PDF" button, and an index.html is generated as an entry point. The project deliberately avoids introducing a PDF library and relies on the browser's own print functionality to export PDFs.
Configuration is generated via client-onboard-kit init as a commented example YAML, covering sections such as format, provider, client, engagement, commercial, legal, comms, onboarding and welcome. If a template references a field missing from the YAML, the build aborts and points out the missing field and the corresponding template, rather than outputting documents with gaps. Date fields support YAML dates being reformatted according to date_format, and also allow free text to pass through as-is.
Templates are stored in the templates/ directory as ordinary Markdown with Jinja2 placeholders, and a custom directory can be pointed to via --templates; filters such as money, date, pct, block and sentence are also provided, along with helper functions has() and opt(). Markdown-to-HTML conversion only supports the subset used by the built-in templates; extending the syntax requires modifying markdown.py accordingly and adding tests.
The project explicitly states that these are templates rather than legal advice, not drafted by a lawyer, and not certified for any jurisdiction; clauses such as liability caps, IP assignment and late interest may be invalid in some jurisdictions. The documents are in English, oriented toward common law systems and aimed at B2B scenarios, and do not include e-signature, invoicing, CRM or reminder features, nor do they output Word or Google Docs formats.
Is it right for your project?
Use Cases
- Freelancers or small studios preparing client onboarding documents in bulk before signing
- Consulting businesses that need to quickly adjust scope, fees and payment terms for different clients
- Teams that want to draft with templates first and then have a lawyer review to reduce drafting costs
- Document workflows that need to retain both editable Markdown and printable HTML formats
Suitable For
- Freelancers and small service teams signing B2B service agreements with clients
- People who want to centrally manage client and contract fields in YAML and avoid manual copy-paste
- Users who accept English common law style templates and plan to have them reviewed by a lawyer
Getting started & customization
Use these recorded setup notes alongside the repository instructions for your chosen version.
- 1
Requires Python 3.11 or higher, depends on Jinja2 and PyYAML
- 2
Can be installed via pip install client-onboard-kit, or after cloning the repository run pip install -e .
- 3
First run client-onboard-kit init to generate an example YAML, fill it in, then run build to output to the specified directory
- 4
To export PDF, open the generated HTML in a browser and use the Save as PDF button on the page
- 5
When customizing templates, copy the templates/ directory and edit it, then point to the new directory with --templates during build
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis entry covers the free version under the MIT license in the public repository; the free scope is the code of that version and does not mean external services or third-party materials are free.
Must comply with when using
- Free use, modification, commercial use and distribution of that version's code are permitted.
- When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
- The code is provided as-is; warranties and limitations of liability are governed by the original license and applicable law.
Additional costs & items to verify
- The generated documents are templates only, do not constitute legal advice, and are not drafted by a lawyer; they should be reviewed by a qualified lawyer in the relevant jurisdiction before use.
- The documents are not certified for any jurisdiction; setting legal.jurisdiction only changes the page text and does not mean compliance in that location.
- English only; no translation or localization of legal terminology is provided.
- The drafting style and clause structure follow Anglo-American common law commercial practice; civil law jurisdictions have different document structures.
- Assumes B2B scenarios throughout; consumer-facing businesses involve statutory protections that this tool does not consider.
- No e-signature integration; you need to take the PDF to an existing signature service yourself.
- No invoicing, CRM or reminder features; it only generates documents.
- Outputs only Markdown and printable HTML, not Word or Google Docs formats.
- Markdown-to-HTML conversion only supports the subset used by the built-in templates and is not a full CommonMark implementation.
- Some clauses may be invalid or unenforceable in certain jurisdictions, especially liability caps, IP assignment and late interest clauses.
- Demo images, fonts, icons and other third-party materials must be checked against their respective licenses; the code's MIT license alone cannot be used to judge them.
- External services such as domains, hosting, databases, payments or AI may incur separate charges.
View Original Text Basis
Permission is hereby granted, free of charge
Original License Text
**These are templates. They are not legal advice, and they were not drafted by a lawyer.**
Original README
The documents are not certified for any jurisdiction.
Original README
**English-language only.** No translations, no localisation of legal terminology.
Original README
**Common-law flavoured.** The drafting style and clause structure follow English and US commercial practice.
Original README
**Business-to-business assumptions throughout.** Consumer-facing engagements carry statutory protections that none of these documents account for.
Original README
**No e-signature integration.**
Original README
**No invoicing, no CRM, no reminders.** This produces documents. That is all it does.
Original README
**No Word or Google Docs output.** Markdown and printable HTML only.
Original README
**The Markdown-to-HTML converter is a subset**, not a full CommonMark implementation.
Original README
https://github.com/waseemnasir2k26/client-onboard-kit/blob/main/LICENSEhttps://github.com/waseemnasir2k26/client-onboard-kit/blob/main/README.mdSome of these clauses will be void, unenforceable, or simply wrong in your jurisdiction, particularly the liability cap, the IP assignment and the late-payment interest rate
Original README
Compiled by DeepSeek based on repository license and README ·2026-10-01. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.
Project checks & description sources
Template Information
- Source platforms
- GitHub
- Documentation and maintenance reference score
- More documented · 83 / 100
- Technologies
- HTML
- Website type
- Corporate Website
How this score is calculated
Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.
What to verify for this project
- Repository update recorded
- 2026-09-16
- Screenshot last checked
- 2026-10-01
A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.
The catalog identifies HTML as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.
Use a selection guide →How this description was prepared
AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.
Automatically checked against source and license rules; no manual editorial review.
Inspect the recorded source material
SHA-256: 9183a1e6e90809683d7f985c9a45aae61816de76d2f002a80a248f8428c44bf0
2026-10-01T04:27:25.111Z
Source file / repository# client-onboard-kit
One YAML brief about a new client turns into the whole first-week paperwork pack: service agreement, NDA, scoping questionnaire, kickoff doc and welcome email.
## Status
Last reviewed: September 2026 · release v2026.09
```console
$ client-onboard-kit init
Wrote client.example.yaml
Edit it, then run: client-onboard-kit build client.example.yaml --out ./pack
$ client-onboard-kit build client.yaml --out ./pack
Built 11 file(s) in pack
pack\service-agreement.md
pack\service-agreement.html
pack\nda.md
pack\nda.html
pack\intake-questionnaire.md
pack\intake-questionnaire.html
pack\kickoff.md
pack\kickoff.html
pack\welcome-email.md
pack\welcome-email.html
pack\index.html
Open pack\index.html and use the Save as PDF button in each document.
```




A real example pack, rendered for a completely fictional client, is committed at
[`examples/marlowe-and-finch/`](examples/marlowe-and-finch/).
## Quick start
```bash
pip install client-onboard-kit # or: pip install -e . from a clone
client-onboard-kit init # writes a commented client.example.yaml
cp client.example.yaml client.yaml # fill in your details and theirs
client-onboard-kit build client.yaml --out ./pack
open ./pack/index.html # then use the Save as PDF button
```
If a template needs a field your YAML does not have, the build stops and tells you
which field and which template, rather than shipping a document with a hole in it:
```console
$ client-onboard-kit build client.yaml --out ./pack
error: Missing required field 'legal.jurisdiction' in your config (needed by template
'service-agreement.md'). Run `client-onboard-kit init` to see a fully-populated example.
```
## What you get
| Document | What it is | What it prevents |
| --- | --- | --- |
| `service-agreement.md` | Scope, deliverables, timeline, fees, payment terms, late fees, revisions, change requests, IP assignment on final payment, confidentiality, termination, liability cap, governing law. | Scope creep with no price attached, and the argument about who owns the work. |
| `nda.md` | Mutual by default, one-way with a toggle. Purpose-limited, with carve-outs and a term. | Awkwardness about sharing real numbers and credentials before anything is signed. |
| `intake-questionnaire.md` | The scoping questions: decision-maker, success criteria, hard deadlines, out-of-scope confirmation, brand assets, access and credentials checklist, data handling. | Week-three change requests caused by a question nobody asked in week one. |
| `kickoff.md` | Agreed scope, milestone schedule, who approves what, channels and response times, and everything the client owes you with a date on it. | Unclear approvals, feedback arriving from four people at once, and credential chaos. |
| `welcome-email.md` | Short, warm, sets expectations, lists the next three actions. | The enthusiastic silence after signature where nothing actually happens. |
Every document is written to `./pack` twice: as Markdown, and as a self-contained HTML
page with a print stylesheet and a "Save as PDF" button. `index.html` links them all.
**There is no PDF library in this project, on purpose.** Every machine already has a
browser that prints to PDF correctly. Adding WeasyPrint or wkhtmltopdf would trade one
command for a system-library install that breaks differently on every OS, and would
render worse. Open the HTML, press the button, choose "Save as PDF".
## Configuration
`client-onboard-kit init` writes a fully-commented, fully-populated example. The blocks:
| Block | Holds |
| --- | --- |
| `format` | `date_format` (Python strftime), `currency_code`, `currency_symbol`, `currency_position` (`prefix` or `suffix`), `decimals`, `thousands_separator`. |
| `provider` | You: `legal_name`, `trading_name`, `company_number`, `contact_name`, `contact_title`, `email`, `phone`, `address`, `website`. |
| `client` | Them: `legal_name`, `short_name`, `contact_name`, `contact_title`, `email`, `address`, `website`. |
| `engagement` | `title`, `summary`, `start_date`, `end_date`, `revision_rounds`, and the lists `deliverables`, `milestones`, `out_of_scope`, `assumptions`. |
| `commercial` | `total_fee`, `deposit_percent`, `payment_terms_days`, `late_fee_percent_per_month`, `change_request_rate`, `change_request_unit`, `change_request_minimum_hours`, `expenses_policy`, `kill_fee_percent`. |
| `legal` | `jurisdiction`, `courts`, `termination_notice_days`, `confidentiality_term_years`, `ip_assignment_on_final_payment`, `liability_cap`, `portfolio_rights`, and the `nda` sub-block. |
| `legal.nda` | `include_in_pack`, `type` (`mutual` or `one_way`), `disclosing_party` (required only when `one_way`), `term_years`, `purpose`. |
| `comms` | `primary_channel`, `secondary_channel`, `response_time_hours`, `working_hours`, `timezone`, `weekly_checkin`, `approver_name`, `approver_title`, `approval_window_days`, `escalation_contact`. |
| `onboarding` | `questionnaire_due`, `client_owes`, `access_checklist`, `brand_assets`, `success_criteria`, `hard_deadlines`. |
| `welcome` | `signature_tool`, `next_actions`, `kickoff_call`. |
Three rules govern the file:
1. **Nothing is silently blanked.** If a template reaches for a field that is not there,
the build fails and names the field and the template.
2. **A branch you did not take costs you nothing.** `legal.nda.disclosing_party` is only
required when `legal.nda.type` is `one_way`, because validation happens as the
document renders, not by scanning the template for every name it mentions.
3. **Dates are flexible.** A YAML date (`2026-09-14`) is reformatted with your
`date_format`; free text (`on signature`) passes through untouched.
Switching jurisdiction, currency and date convention is a four-line edit:
```yaml
format:
date_format: "%B %d, %Y"
currency_code: USD
currency_symbol: "$"
legal:
jurisdiction: the State of Delaware, USA
courts: the state and federal courts located in Delaware
```
Useful flags:
```bash
client-onboard-kit build client.yaml --out ./pack --only welcome-email,kickoff
client-onboard-kit build client.yaml --out ./pack --format md
client-onboard-kit build client.yaml --out ./pack --templates ./my-templates
client-onboard-kit templates # what exists, and where it lives
```
## Customising the templates
The templates are data, not code. They live in [`templates/`](templates/) as plain
Markdown with Jinja2 placeholders:
```markdown
Invoices are payable within **{{ commercial.payment_terms_days }} days**.
{% if legal.portfolio_rights %}
The Provider may show the delivered work in its portfolio.
{% endif %}
{% for item in engagement.out_of_scope %}
- {{ item }}
{% endfor %}
```
Alongside the standard Jinja2 syntax there are these helpers:
| Helper | Does |
| --- | --- |
| `{{ amount \| money }}` | Formats using your `format` block: `£18,000.00`. |
| `{{ value \| date }}` | Formats a date, or passes free text through. |
| `{{ number \| pct }}` | `2` becomes `2%`. |
| `{{ text \| block }}` | Turns a multi-line YAML block (an address) into Markdown line breaks. |
| `{{ text \| sentence }}` | Upper-cases the first character only. |
| `{% if has('provider.phone') %}` | True when that dotted path exists and is not empty. |
| `{{ opt('client.website', 'n/a') }}` | Reads a dotted path with a fallback, for genuinely optional fields. |
To customise: copy `templates/` somewhere, edit, and pass `--templates ./my-templates`.
Adding a new document to the pack means adding a `Document(...)` entry in
`client_onboard_kit/render.py` next to the five that are already there.
The HTML converter supports the Markdown subset the shipped templates use: headings,
paragraphs, bold, italic, inline code, links, ordered and unordered lists, `- [ ]`
checkboxes, pipe tables, blockquotes, horizontal rules and HTML comments. If you extend
the templates past that, extend `client_onboard_kit/markdown.py` and add a test.
## Not legal advice
**These are templates. They are not legal advice, and they were not drafted by a lawyer.**
- Nobody here is your solicitor, attorney, or counsel, and using this tool does not
create any professional relationship.
- The documents are not certified for any jurisdiction. Setting `legal.jurisdiction` to
a place changes the words on the page; it does not make the document compliant there.
- No claim is made about enforceability, and no claim is made about compliance with any
statute, regulation or professional code, anywhere.
- Some of these clauses will be void, unenforceable, or simply wrong in your
jurisdiction, particularly the liability cap, the IP assignment and the late-payment
interest rate, which are the three most commonly regulated terms.
- Consumer contracts, employment-adjacent arrangements, regulated industries and
cross-border work all carry rules this tool knows nothing about.
**Have a qualified lawyer in the relevant jurisdiction review anything you intend to
sign or send.** A one-hour review of a document that is already 90% written is a great
deal cheaper than the same lawyer drafting from nothing, and that is the whole point of
this tool: it gets you to the review, not past it.
Every rendered document carries an HTML comment at the top saying the same thing. The
comment does not appear in the printed or PDF output, and the legal documents also show
a screen-only review banner in the HTML that is hidden when printed.
## Limitations
Being blunt about what this is not:
- **English-language only.** No translations, no localisation of legal terminology.
- **Common-law flavoured.** The drafting style and clause structure follow English and
US commercial practice. Civil-law jurisdictions structure these documents differently.
- **No jurisdiction certification.** `legal.jurisdiction` is a string that gets printed.
There is no rules engine behind it, and no per-country clause library.
- **Business-to-business assumptions throughout.** Consumer-facing engagements carry
statutory protections that none of these documents account for.
- **No e-signature integration.** The pack names your signing tool in the welcome email
and stops there. Take the PDF to whichever service you already use.
- **No invoicing, no CRM, no reminders.** This produces documents. That is all it does.
- **No Word or Google Docs output.** Markdown and printable HTML only. If a client
insists on `.docx`, paste the Markdown into their editor of choice.
- **The Markdown-to-HTML converter is a subset**, not a full CommonMark implementation.
It handles what the shipped templates use and nothing more, by design.
## Contributing
Issues and pull requests are welcome, especially:
- Clause improvements from people who have actually had these documents tested.
- Additional template packs (retainer agreement, statement of work, offboarding).
- Jurisdiction notes, clearly marked as notes rather than as certification.
Please do not send pull requests that claim a document is enforceable, compliant, or
lawyer-approved. That claim will not be merged.
Development:
```bash
python -m venv .venv && source .venv/bin/activate # on Windows: .venv\Scripts\activate
pip install -e ".[dev]"
pytest
```
The test suite covers rendering of every template, the missing-variable failure, the
guarantee that an unrendered placeholder can never reach the output, the mutual and
one-way NDA toggle, currency, date and jurisdiction switching, the output file layout,
and a repository hygiene check that no real person or domain leaks into the examples.
---
Built by SkynetLabs (Waseem Nasir) - we onboard and automate client delivery for
agencies. https://skynetjoe.com - hire on Fiverr https://fiverr.com/agencies/skynetjoellc
## License
MIT. See [LICENSE](LICENSE). Copyright (c) 2026 Waseem Nasir / SkynetLabs.
Explore similar templates
Compare previews and descriptions within the same stack and category.

mazer
Mazer is a free and open-source Bootstrap 5 admin dashboard and landing page template that does not depend on jQuery. It provides prebuilt releases, source builds, and CDN inclusion, and includes dark mode, perfect-scrollbar, and ApexCharts examples.
HTML · Admin dashboard

Freelancer
A bright, single-page Bootstrap portfolio template for freelancers, designers, and small studios. It includes a responsive portfolio grid with modal detail windows and an SB Forms contact form that requires an API token.
HTML · Portfolio

Creative
A single-page marketing template by Start Bootstrap for creative agencies and product services, built on Bootstrap with SCSS, featuring a portfolio grid and call-to-action sections. It includes pre-set SB Forms markers for form integration and npm build scripts for source customization.
HTML · Corporate Website

startbootstrap-agency
Agency is a one-page Bootstrap portfolio theme from Start Bootstrap, MIT licensed. It includes a responsive portfolio grid with modal details and a preconfigured SB Forms contact form that requires an API token.
HTML · Corporate Website

startbootstrap-landing-page
A general-purpose Bootstrap landing page template from Start Bootstrap, MIT licensed, with a Pug/SCSS/npm build pipeline.
HTML · Corporate Website

Landing-Page
A general-purpose landing page HTML template maintained by Tailwind Toolbox, written in pure HTML and loading the complete Tailwind CSS via CDN.
HTML · Corporate Website
