| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/inkwell-web/.next/server/app/ |
Upload File : |
1:"$Sreact.fragment"
2:I[79404,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"default"]
3:I[88287,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"default"]
4:I[74895,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"default"]
5:I[4561,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],""]
6:I[70805,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"default"]
e:I[52576,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"default",1]
:HL["/_next/static/chunks/0kg0y69b10g_a.css","style"]
0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0kg0y69b10g_a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0e6vws3w6afjs.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/31jk64s9j6agx.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":[["$","$L2",null,{}],["$","main",null,{"className":"mx-auto max-w-6xl px-6 py-10","children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","footer",null,{"className":"border-t border-(--color-paper-dim) mt-20","children":["$","div",null,{"className":"mx-auto flex max-w-6xl items-center justify-between px-6 py-8 text-sm text-(--color-ink-dim)","children":[["$","div",null,{"children":["Inkwell is a portfolio demonstration by"," ",["$","a",null,{"href":"https://philiprehberger.com","children":"Philip Rehberger"}],"."]}],["$","div",null,{"className":"flex gap-4","children":[["$","a",null,{"href":"https://github.com/philiprehberger/inkwell","children":"GitHub"}],["$","$L5",null,{"href":"/legal/dpa","children":"DPA"}],["$","$L5",null,{"href":"/about","children":"About"}]]}]]}]}],["$","$L6",null,{}]]}]}]]}],{"children":[["$","$1","c",{"children":[[["$","section",null,{"className":"pt-10 pb-16","children":[["$","p",null,{"className":"text-sm font-semibold uppercase tracking-widest text-(--color-accent)","children":"Form submission · explainable spam scoring · multi-destination fan-out"}],["$","h1",null,{"className":"mt-3 text-5xl font-bold tracking-tight","children":"Drop one HTML form tag. Inkwell handles the rest — spam, fan-out, replay, retention."}],["$","p",null,{"className":"mt-6 max-w-3xl text-lg text-(--color-ink-dim)","children":["The integration is a plain ",["$","code",null,{"children":"<form action=\"…\">"}],". No JavaScript required. The backend scores submissions with a transparent signal breakdown, validates against a JSON Schema you control, and fans out to email + webhook + Slack + Discord + Google Sheets + HubSpot + Mailchimp — configured per form, dispatched in parallel, retried on failure."]}],["$","div",null,{"className":"mt-8 flex flex-wrap items-center gap-4","children":[["$","$L5",null,{"href":"/live-demo","className":"rounded-md bg-(--color-ink) px-5 py-3 text-sm font-semibold text-white no-underline hover:bg-(--color-accent)","children":"Open the live demo"}],["$","$L5",null,{"href":"/reference","className":"rounded-md border border-(--color-ink) px-5 py-3 text-sm font-semibold text-(--color-ink) no-underline hover:bg-(--color-paper-dim)","children":"API reference"}],["$","a",null,{"href":"https://github.com/philiprehberger/inkwell","className":"rounded-md px-5 py-3 text-sm font-semibold text-(--color-ink-dim) no-underline hover:bg-(--color-paper-dim)","children":"Source on GitHub"}]]}]]}],["$","section",null,{"className":"border-y border-(--color-paper-dim) py-12","children":["$L7","$L8","$L9"]}],"$La","$Lb"],null,"$Lc"]}],{},null,false,null]},null,false,null],"$Ld",false]],"m":"$undefined","G":["$e",["$Lf"]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"BHZvYV9xiqkZOI0mrHgXj"}
10:I[51858,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"OutletBoundary"]
11:"$Sreact.suspense"
13:I[51858,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"ViewportBoundary"]
15:I[51858,["/_next/static/chunks/0e6vws3w6afjs.js","/_next/static/chunks/31jk64s9j6agx.js"],"MetadataBoundary"]
7:["$","h2",null,{"className":"text-2xl font-bold tracking-tight","children":"The canonical integration"}]
8:["$","p",null,{"className":"mt-2 max-w-3xl text-(--color-ink-dim)","children":"Paste this into your HTML. That's the integration. Works on static sites, in HTML emails, inside iframes, with JavaScript off, with screen readers. The 3 KB optional widget adds inline error rendering and honeypot timing without changing the canonical path."}]
9:["$","div",null,{"className":"mt-6 grid gap-6 lg:grid-cols-2","children":[["$","div",null,{"className":"overflow-hidden rounded-lg border border-(--color-paper-dim)","children":[["$","div",null,{"className":"border-b border-(--color-paper-dim) bg-(--color-paper-dim) px-4 py-2 text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)","children":"HTML — no JS required"}],["$","pre",null,{"className":"m-0 rounded-none bg-(--color-ink) p-5 text-[12.5px] leading-relaxed text-white","children":["$","code",null,{"children":"<form action=\"https://api.inkwell.philiprehberger.com/v1/forms/<form-id>/submit\"\n method=\"post\">\n <input name=\"name\" required>\n <input name=\"email\" type=\"email\" required>\n <textarea name=\"message\" required></textarea>\n\n <input type=\"hidden\" name=\"_redirect\" value=\"https://example.com/thanks\">\n <input type=\"text\" name=\"_subject_honeypot\" style=\"display:none\">\n\n <button type=\"submit\">Send</button>\n</form>"}]}]]}],["$","div",null,{"className":"overflow-hidden rounded-lg border border-(--color-paper-dim)","children":[["$","div",null,{"className":"border-b border-(--color-paper-dim) bg-(--color-paper-dim) px-4 py-2 text-xs font-semibold uppercase tracking-wider text-(--color-ink-dim)","children":"curl — for server-side senders"}],["$","pre",null,{"className":"m-0 rounded-none bg-(--color-ink) p-5 text-[12.5px] leading-relaxed text-white","children":["$","code",null,{"children":"curl -X POST https://api.inkwell.philiprehberger.com/v1/forms/<id>/submit \\\n -H \"Accept: application/json\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"name\":\"Alice\",\"email\":\"a@example.com\",\"message\":\"hi\"}'"}]}]]}]]}]
a:["$","section",null,{"className":"py-16","children":[["$","h2",null,{"className":"text-2xl font-bold tracking-tight","children":"What's in the box"}],["$","div",null,{"className":"mt-8 grid gap-8 md:grid-cols-2","children":[["$","div",null,{"children":[["$","h3",null,{"className":"text-lg font-semibold","children":"Explainable spam scoring"}],["$","div",null,{"className":"mt-2 leading-relaxed text-(--color-ink-dim)","children":["$","p",null,{"children":["Every submission shows the per-signal breakdown in the admin — honeypot, IP reputation, timing, content density, email validity, captcha. Buyers see ",["$","em",null,{"children":"why"}]," something scored what it scored, and adjust thresholds with that signal in view. No black box."]}]}]]}],["$","div",null,{"children":[["$","h3",null,{"className":"text-lg font-semibold","children":"Graduated friction, not binary block"}],["$","div",null,{"className":"mt-2 leading-relaxed text-(--color-ink-dim)","children":["$","p",null,{"children":["Submissions in the 30–49 score band don't get rejected outright — they're",["$","em",null,{"children":" quarantined"}]," and a captcha challenge releases them. 50+ becomes spam (no destinations dispatched). Honeypot or known-bad IP hard-blocks immediately."]}]}]]}],["$","div",null,{"children":[["$","h3",null,{"className":"text-lg font-semibold","children":"Per-destination fan-out you can trust"}],["$","div",null,{"className":"mt-2 leading-relaxed text-(--color-ink-dim)","children":["$","p",null,{"children":"Each destination is its own Horizon job with a (submission, destination, replay_seq) idempotency key — worker crashes never double-send. Slow OAuth connectors run on a separate queue from webhook/email/Slack so backpressure doesn't compound."}]}]]}],["$","div",null,{"children":[["$","h3",null,{"className":"text-lg font-semibold","children":"Compliance hooks ready"}],["$","div",null,{"className":"mt-2 leading-relaxed text-(--color-ink-dim)","children":["$","p",null,{"children":[["$","code",null,{"children":"POST /v1/data-subjects/lookup"}]," finds every submission containing an email.",["$","code",null,{"children":" DELETE /v1/data-subjects/by-email"}]," queues an async erasure that cascades through submissions, files, delivery attempts, and audit-row redaction. PII-purge cron runs at the 90-day mark. ",["$","em",null,{"children":"Production-shaped, not production-grade."}]]}]}]]}],["$","div",null,{"children":[["$","h3",null,{"className":"text-lg font-semibold","children":"Webhook signing, secret rotation with grace"}],["$","div",null,{"className":"mt-2 leading-relaxed text-(--color-ink-dim)","children":["$","p",null,{"children":["Webhook destinations sign payloads with HMAC-SHA256 in Stripe's ",["$","code",null,{"children":"t=…,v1=…"}],"format. Rotating a destination's secret keeps the old signature valid for 48 hours alongside the new one — your receivers update without dropping anything in flight."]}]}]]}],["$","div",null,{"children":[["$","h3",null,{"className":"text-lg font-semibold","children":"File uploads, scanned + EXIF-stripped"}],["$","div",null,{"className":"mt-2 leading-relaxed text-(--color-ink-dim)","children":["$","p",null,{"children":["Magic-byte verification against your form's MIME allowlist. Images pass through EXIF strip (GPS coordinates removed). ClamAV scan runs out-of-band — submissions acknowledge fast, infected files quarantine + flip the submission to"," ",["$","em",null,{"children":"quarantined"}],", buyer reviews from the admin."]}]}]]}]]}]]}]
b:["$","section",null,{"className":"border-t border-(--color-paper-dim) py-16","children":[["$","h2",null,{"className":"text-2xl font-bold tracking-tight","children":"Destinations"}],["$","p",null,{"className":"mt-3 max-w-3xl text-(--color-ink-dim)","children":"Configure any combination per form. Each delivery is independent — a failed Slack notification doesn't block the webhook fan-out."}],["$","ul",null,{"className":"mt-8 grid gap-3 md:grid-cols-2 lg:grid-cols-3","children":[["$","li","Email",{"className":"rounded-lg border border-(--color-paper-dim) bg-white p-4","children":[["$","div",null,{"className":"font-semibold","children":"Email"}],["$","div",null,{"className":"mt-1 text-sm text-(--color-ink-dim)","children":"noreply sender + Reply-To; CRLF strip on every header value"}]]}],["$","li","Webhook",{"className":"rounded-lg border border-(--color-paper-dim) bg-white p-4","children":[["$","div",null,{"className":"font-semibold","children":"Webhook"}],["$","div",null,{"className":"mt-1 text-sm text-(--color-ink-dim)","children":"HMAC-SHA256 t=…,v1=… + 48-hour secret rotation grace"}]]}],["$","li","Slack",{"className":"rounded-lg border border-(--color-paper-dim) bg-white p-4","children":[["$","div",null,{"className":"font-semibold","children":"Slack"}],["$","div",null,{"className":"mt-1 text-sm text-(--color-ink-dim)","children":"Block Kit, length-limit-aware"}]]}],["$","li","Discord",{"className":"rounded-lg border border-(--color-paper-dim) bg-white p-4","children":[["$","div",null,{"className":"font-semibold","children":"Discord"}],["$","div",null,{"className":"mt-1 text-sm text-(--color-ink-dim)","children":"Embed with field mapping"}]]}],["$","li","Google Sheets",{"className":"rounded-lg border border-(--color-paper-dim) bg-white p-4","children":[["$","div",null,{"className":"font-semibold","children":"Google Sheets"}],["$","div",null,{"className":"mt-1 text-sm text-(--color-ink-dim)","children":"Append-row by OAuth token"}]]}],["$","li","HubSpot",{"className":"rounded-lg border border-(--color-paper-dim) bg-white p-4","children":[["$","div",null,{"className":"font-semibold","children":"HubSpot"}],["$","div",null,{"className":"mt-1 text-sm text-(--color-ink-dim)","children":"Upsert contact by email"}]]}],["$","li","Mailchimp",{"className":"rounded-lg border border-(--color-paper-dim) bg-white p-4","children":[["$","div",null,{"className":"font-semibold","children":"Mailchimp"}],["$","div",null,{"className":"mt-1 text-sm text-(--color-ink-dim)","children":"Audience members, datacenter-aware"}]]}]]}]]}]
c:["$","$L10",null,{"children":["$","$11",null,{"name":"Next.MetadataOutlet","children":"$@12"}]}]
d:["$","$1","h",{"children":[null,["$","$L13",null,{"children":"$L14"}],["$","div",null,{"hidden":true,"children":["$","$L15",null,{"children":["$","$11",null,{"name":"Next.Metadata","children":"$L16"}]}]}],null]}]
f:["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0kg0y69b10g_a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]
14:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
12:null
16:[["$","title","0",{"children":"Inkwell — form submission API with explainable spam scoring"}],["$","meta","1",{"name":"description","content":"Drop one HTML form tag onto your site. Inkwell catches submissions, scores them with a visible signal breakdown, and forwards to email + webhook + Slack + Discord + Google Sheets + HubSpot + Mailchimp."}]]