11 · Client Intake & Questionnaire
← Docs home · Task: get a prospective author to tell you what book they have, what they want done, and what gaps they want filled — by email or web form — before any work starts.
This is the front door of the service. The goal is one clear intake artifact that:
- captures the source + license (so you know it’s even runnable),
- lets them pick from the real enhancement menu (the things the pipeline actually produces — see 01 · What You Get), and
- has room for the gaps they specifically want filled.
There are two delivery paths; use whichever fits the lead:
- Email — copy the template below (or use the
mailto:link). Zero setup, good for a warm one-to-one conversation. - Web form — point them at the hosted intake form for a structured, trackable submission. See Web form below.
The questionnaire (canonical question set)
Both the email and the web form draw from this single list. Keep them in sync — edit here first, then mirror into the form.
A · About you and the book
- Your name, role, and institution/organization.
- Best email (and any other preferred contact).
- Book title, author(s), and edition.
- Source license — CC BY · CC BY-SA · CC BY-NC · CC BY-NC-SA · public domain · all-rights-reserved · not sure. (This is the gate — a non-commercial license limits paid distribution.)
- Where the source lives (URL, OpenStax/OpenIntro page) — or upload the PDF/DOCX directly on the form.
B · Scope
- What do you want enhanced — the whole book · specific chapters · specific sections? (List them.)
- Approximate size — number of chapters / sections / pages.
- Who’s the audience — high school · community college · university? Course name.
- Any deadline or term you’re targeting.
C · What you want done (the enhancement menu)
Check all that apply — these map 1:1 to what bookSHelf produces.
- [ ] Remaster — rewrite for clarity and textbook density
- [ ] Worked solutions — full step-by-step for problem sets
- [ ] Interactive practice — Try-It-Now / Guided Practice blocks
- [ ] Animated figures — silent looping animations where motion teaches
- [ ] Narrated videos — voice-narrated section-opener explainers
- [ ] Slide decks — per-section Slidev + PowerPoint (editable + delivery)
- [ ] Accessibility track — dyslexia fonts, font-resize, dark mode, read-aloud
- [ ] EPUB edition — validated, offline, math intact
- [ ] AI study tutor — in-page chat (bring-your-own model)
- [ ] Calculator-tool replacement — swap TI-calculator steps for free web tools
- [ ] Hosting — publish on the bookSHelf collection, or to your own domain
D · Gaps to fill (the important part)
- What’s missing or weak in the current book? (e.g. no solutions, dated examples, no visuals, not accessible, no real-world applications.)
- Where do your students get stuck most?
- Any topics, examples, or chapters you wish existed but aren’t in the source?
- Content to add, cut, or reorder?
E · Logistics
- Budget range (or “not sure yet”).
- Branding / look-and-feel preferences (or “use the bookSHelf house style”).
- How will the result be distributed — free/open, course-only, commercial? (Ties back to the license question.)
- Preferred update cadence and contact method.
- Anything else you want me to know?
Email template
Replace
INTAKE_EMAILwith your intake address (default:shuff57@gmail.com) and send. Themailto:link at the bottom opens a pre-filled draft.
Subject: bookSHelf — let's scope your book
Hi [name],
Thanks for your interest in bookSHelf. I turn open textbooks into polished,
interactive web editions — worked solutions, animated figures, narrated video,
slide decks, an accessible EPUB, and hosting. To scope your project, could you
answer a few questions? Short answers are fine.
ABOUT THE BOOK
1. Your name, role, and institution
2. Book title, author(s), edition
3. Source license (CC BY / BY-SA / BY-NC / BY-NC-SA / public domain / other / not sure)
4. Where the source lives (URL), or upload the PDF/DOCX on the form
SCOPE
5. Whole book, specific chapters, or specific sections? (list them)
6. Approx size (chapters / pages) and your audience (course + level)
7. Any deadline
WHAT YOU WANT (check any)
[ ] Remaster/rewrite [ ] Worked solutions [ ] Interactive practice
[ ] Animated figures [ ] Narrated videos [ ] Slide decks
[ ] Accessibility [ ] EPUB [ ] AI tutor
[ ] Calculator-tool replacement [ ] Hosting
GAPS TO FILL
8. What's missing or weak in the current book?
9. Where do students get stuck?
10. Topics/examples you wish existed?
LOGISTICS
11. Budget range, how you plan to distribute it, and best way to reach you
Reply whenever — I'll follow up with a scoped plan and a sample section.
Best,
[your name]
One-click mailto: (drop into a page or your email signature)
<a href="mailto:?subject=bookSHelf%20%E2%80%94%20let%27s%20scope%20your%20book&body=Hi%2C%0A%0AThanks%20for%20your%20interest%20in%20bookSHelf.%20A%20few%20questions%20to%20scope%20your%20project%3A%0A%0A1.%20Your%20name%2C%20role%2C%20institution%0A2.%20Book%20title%2C%20author%28s%29%2C%20edition%0A3.%20Source%20license%0A4.%20Where%20the%20source%20lives%20%2B%20format%0A5.%20Whole%20book%20or%20specific%20chapters%2Fsections%3F%0A6.%20Audience%20and%20deadline%0A7.%20What%20you%20want%20%28remaster%2C%20solutions%2C%20figures%2C%20video%2C%20slides%2C%20a11y%2C%20EPUB%2C%20tutor%2C%20hosting%29%0A8.%20What%27s%20missing%2Fweak%20in%20the%20current%20book%3F%0A9.%20Where%20do%20students%20get%20stuck%3F%0A10.%20Budget%20%2B%20how%20you%27ll%20distribute%20it%0A%0AThanks%21">
Email me about my book
</a>
Web form
Status: built — native, on-brand, owned. A house-styled form lives on the site and stores each submission to the D1 database you already run. No third party; the lead data never leaves your infrastructure.
| Piece | File | Role |
|---|---|---|
| Form page | docs/getstarted.html |
Public form (/getstarted, also getstarted.oerbookshelf.app), house theme, dark-mode aware. Posts multipart to /api/intake (so it can carry a file). |
| Handler | functions/api/intake.js |
POST /api/intake — accepts JSON or multipart; validates, stores to D1, streams any uploaded source doc to private R2, optional email alert. Honeypot + per-IP/day cap (default 20). |
| Schema | migrations/0005_intake_submissions.sql, migrations/0006_intake_source_file.sql |
The intake_submissions table + the source-file columns. |
| Admin viewer | functions/admin/intake.js |
GET /admin/intake — Cloudflare Access-gated. Cards newest-first, CSV export (?format=csv), and gated file download (?file=<id>). |
Source-document upload (PDF / DOCX)
The form has an optional file field: a prospect can upload the source book directly instead of (or alongside) a link. Mechanics:
- Accepts PDF / DOCX (also legacy DOC), up to 50 MB; validated by MIME and extension.
- The bytes go to a private R2 bucket
bookshelf-intake(bindingINTAKE_FILES) under an unguessableintake/<uuid>/<filename>key. Only the key + name/size/type are stored in D1. - There is no public read route. Unlike
bookshelf-decks(which serves files publicly at/decks/:id/file), the only way to fetch an intake upload is the Access-gatedGET /admin/intake?file=<id>streamer. This keeps submitters’ (often copyrighted) source docs out of public reach.
Make it live (one-time)
- Create the private upload bucket:
npx wrangler r2 bucket create bookshelf-intake - Apply the migrations to the live DB:
npx wrangler d1 execute bookshelf-ai --file=migrations/0005_intake_submissions.sql --remote npx wrangler d1 execute bookshelf-ai --file=migrations/0006_intake_source_file.sql --remote - Deploy to production (ships
getstarted.html+ the new Functions;wrangler.tomlalready bindsINTAKE_FILES). The production branch isdesktop—--branch previewonly updates the staging alias:
Also create the upload bucket once:wrangler pages deploy docs --project-name bookshelf --branch desktop --commit-dirty=truewrangler r2 bucket create bookshelf-intake. - Protect the admin route — add
/admin/intaketo the same Cloudflare Access application that already guards/admin/slides(seedocs/ops/admin-access.md). It reuses the sameCf-Access-Authenticated-User-Emailcheck. This also gates the file download.
That’s the whole thing — submissions (and any uploaded source doc) now land in
D1 + R2, and you read them at /admin/intake (or
wrangler d1 execute … "SELECT * FROM intake_submissions").
Optional: get emailed on each lead (dormant until you opt in)
The handler already contains the email-alert code; it’s a no-op until two secrets exist, so nothing breaks in the meantime. To turn it on, create a free Resend account, verify a sending domain, then:
npx wrangler pages secret put RESEND_API_KEY --project-name bookshelf
npx wrangler pages secret put INTAKE_NOTIFY_EMAIL --project-name bookshelf # where alerts go
# optional, must be a Resend-verified address:
npx wrangler pages secret put INTAKE_FROM_EMAIL --project-name bookshelf
No code change — the next submission emails you. Other tunables (plain vars, not
secrets): INTAKE_DAILY_LIMIT (per-IP/day cap).
Surfacing it
The landing page (docs/index.html) links to docs/getstarted.html from the nav
(“Add Book”), the hero CTA, and the footer. The form is also reachable at
getstarted.oerbookshelf.app. Optionally add a link from the
What You Get pitch. A separate lightweight contact form
(name / email / message) lives at /contact (docs/contact.html →
functions/api/contact.js → contact_messages), linked from the homepage nav
and footer.
Intake checklist (operator)
[ ] License confirmed compatible with intended distribution (question A4 + E17)
[ ] Source obtained in a usable format (A5 / A6)
[ ] Scope agreed: chapters/sections + deadline (B)
[ ] Enhancement menu selected (C)
[ ] Gaps captured as concrete, addressable items (D)
[ ] Sample section delivered before full commitment
[ ] Plan + price sent