Skip to content
This repository was archived by the owner on Jun 9, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions app/features/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import Link from "next/link";

const features = [
{
name: "Voice Match",
tag: "Unique to InkWeave",
why: "Stops your book sounding like every other AI book.",
how: "Upload three samples of your real writing — old blog posts, emails, journal entries. We train a private voice profile only on YOUR text. Output reads like you wrote it on a good day.",
note: "Voice profile is private. Never shared. Never used to train models. Deletable anytime.",
},
{
name: "Memory Vault",
tag: "Persistent across books",
why: "Build a universe. Reuse characters, worlds, lore across multiple books without re-explaining.",
how: "Save characters, locations, style decisions, and rules. The Vault travels with you between books. Book three can reference book one without you copy-pasting context.",
note: "Ideal for series writers, fantasy/SF world-builders, and non-fiction authors with recurring frameworks.",
},
{
name: "Author Mode",
tag: "For writers who write",
why: "You write the paragraphs. AI helps the next sentence. Reverses the AI dynamic.",
how: "Type your prose. Press the assist key. Get suggestions in your voice. Accept, edit, or ignore. Use AI as a typist, not an author. Skip it entirely for chapters you want to write yourself.",
note: "Built for the writer who doesn't want AI doing the work — just removing friction.",
},
{
name: "Receipts Trail",
tag: "Provenance, sentence by sentence",
why: "Proves your story is yours. Useful for copyright, publishers, and your own peace of mind.",
how: "Every paragraph in your manuscript links back to the snippet that seeded it. Hover any sentence. See exactly which of your notes it came from. Export the receipts log with the book.",
note: "Defends against plagiarism accusations. Documents AI assistance clearly for publishers.",
},
{
name: "Pre-commit Sanity Check",
tag: "Last-mile safety",
why: "Catches drift, hallucinations, and tone breaks before you ship.",
how: "Before final export, the system flags chapters where the AI generated content without grounding in your snippets, broke character voice, or introduced unverified facts. You review only what's flagged.",
note: "Saves hours of re-reading. Most books need 3–5 fixes before export.",
},
{
name: "Editor-in-the-Loop",
tag: "Real UK humans, on demand",
why: "Some chapters need a human editor. We have one.",
how: "Add £49 per book and a UK-based human editor reviews your manuscript for pacing, voice, and clarity. Returned within 7 days. Not AI. Real person.",
note: "Optional. Most authors use it on book one only.",
},
{
name: "Genre Style Guides",
tag: "UK-specific publishing conventions",
why: "Generic AI writes American thrillers. UK genres have different conventions.",
how: "Internal style packs for UK Crime, UK Romance, UK Literary, UK Historical, UK Memoir. Vocabulary, structure, pacing, dialogue conventions adjusted per genre.",
note: "Built from analysis of bestselling UK indie publishers and Amazon UK genre charts.",
},
{
name: "KDP Disclosure Generator",
tag: "Stay inside Amazon's rules",
why: "Most authors get AI disclosure wrong on KDP. We do it for you.",
how: "Auto-fills KDP's 'AI-generated content' form using the exact language Amazon accepts. Tracks edits and human-review percentage. Hands you the disclosure ready to paste.",
note: "Works for IngramSpark too. Updated whenever Amazon's policy changes.",
},
{
name: "Full Export ZIP",
tag: "No lock-in",
why: "Your data is yours. Always.",
how: "One click. ZIP of every snippet, manuscript, voice profile, vault entry, receipt log, and export. Cancel and walk away with everything.",
note: "Standard open formats. Readable without InkWeave.",
},
];

export default function FeaturesPage() {
return (
<main className="min-h-screen" style={{ background: "var(--ink)", color: "var(--text-primary)" }}>
<nav className="flex items-center justify-between px-6 py-5 max-w-6xl mx-auto">
<Link href="/" className="text-xl tracking-widest uppercase font-sans" style={{ color: "var(--amber)", letterSpacing: "0.2em" }}>InkWeave</Link>
<Link href="/start" className="px-4 py-2 font-sans text-sm font-medium" style={{ background: "var(--amber)", color: "var(--ink)", borderRadius: "2px" }}>Try one chapter free</Link>
</nav>

<section className="px-6 py-16 max-w-3xl mx-auto text-center">
<p className="font-sans text-xs tracking-widest uppercase mb-3" style={{ color: "var(--amber)", letterSpacing: "0.3em" }}>What InkWeave actually does</p>
<h1 className="text-4xl md:text-5xl font-bold mb-4">Nine features no other tool combines.</h1>
<p className="font-sans" style={{ color: "var(--text-secondary)" }}>
Every feature exists because we&apos;ve watched authors hit a real wall. Not bullet points to fill a page.
</p>
</section>

<section className="px-6 pb-20 max-w-4xl mx-auto space-y-5">
{features.map(({ name, tag, why, how, note }, i) => (
<div key={name} className="p-8" style={{ background: "var(--ink-soft)", borderRadius: "2px" }}>
<div className="flex flex-wrap items-baseline gap-3 mb-4">
<p className="font-sans text-xs uppercase tracking-widest" style={{ color: "var(--text-dim)" }}>{String(i + 1).padStart(2, "0")}</p>
<h2 className="text-2xl font-bold">{name}</h2>
<span className="font-sans text-xs px-2 py-1" style={{ background: "var(--amber)", color: "var(--ink)", borderRadius: "2px" }}>{tag}</span>
</div>
<p className="font-sans font-semibold mb-3" style={{ color: "var(--text-primary)" }}>{why}</p>
<p className="font-sans leading-relaxed mb-4" style={{ color: "var(--text-secondary)" }}>{how}</p>
<p className="font-sans text-xs italic" style={{ color: "var(--text-dim)" }}>{note}</p>
</div>
))}
</section>

<section className="px-6 py-16 max-w-2xl mx-auto text-center">
<h2 className="text-3xl font-bold mb-4">Still skeptical?</h2>
<p className="font-sans mb-3" style={{ color: "var(--text-secondary)" }}>
Read every objection on the honest page. We answer all of them.
</p>
<Link href="/honest" className="inline-block font-sans text-sm underline mb-10" style={{ color: "var(--amber)" }}>
The honest page &rarr;
</Link>
<div>
<Link
href="/start"
className="inline-block px-10 py-5 text-base font-sans font-semibold transition-all hover:opacity-90"
style={{ background: "var(--amber)", color: "var(--ink)", borderRadius: "2px" }}
>
Try one chapter free
</Link>
</div>
</section>
</main>
);
}
102 changes: 102 additions & 0 deletions app/honest/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import Link from "next/link";

const objections = [
{
objection: "I want to write a real book. I don't want AI to write it for me.",
answer: "Then use Author Mode. You write the paragraphs. InkWeave helps with the next sentence, suggests transitions, and keeps your voice consistent. The book is yours, line by line. The AI is optional at every step.",
test: "Try Author Mode in the free chapter. Write one paragraph yourself. Hit 'continue in my voice'. Decide if it sounds like you.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don’t send readers to a missing Author Mode

This test sends skeptical users to try Author Mode in the free chapter, but /start only renders title, genre, snippets, and a submit button; repo-wide search only finds "Author Mode" in this new marketing copy. Anyone following this CTA cannot find the promised mode or the continue in my voice action, which makes the objection page feel broken right at the trust-building step.

Useful? React with 👍 / 👎.

},
{
objection: "If it's AI, it's not really my book.",
answer: "Every sentence in your manuscript shows the source snippet it came from — your characters, your scenes, your ideas. The Receipts Trail proves your story is yours. AI assembles what you already had. Like a typist who never argues.",
test: "Open the Receipts panel after generation. Click any paragraph. See exactly which of your notes it expanded.",
},
{
objection: "Publishers will reject it. KDP bans AI books.",
answer: "KDP doesn't ban AI-assisted books. It requires disclosure. There's a difference. InkWeave generates the correct KDP disclosure language and certifies your manuscript as 'AI-assisted, author-reviewed' — the exact phrase Amazon accepts. IngramSpark is similar. You stay inside platform rules, automatically.",
test: "Go to /publish. Read the actual KDP policy. We link to the official Amazon page.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Add the promised KDP policy link

This test says /publish links to the official Amazon KDP policy, but app/publish/page.tsx has no external Amazon policy link at all, only internal navigation. Users trying to verify the disclosure claim land on a page that does not provide the promised source, so either add the official link there or change this test copy.

Useful? React with 👍 / 👎.

},
{
objection: "It'll sound generic. Like every other AI book.",
answer: "Voice Match: upload three samples of your existing writing (emails, blog posts, journal). InkWeave trains a private voice profile only on your samples. Output sounds like you wrote it on a good day.",
test: "Upload an old blog post. Generate one paragraph with Voice Match on, one with it off. The difference is obvious.",
},
{
objection: "Why not just use ChatGPT for £20/mo?",
answer: "ChatGPT can write a paragraph. It can't structure a 70,000-word book, hold a 12-chapter outline in working memory, format for KDP paperback, register an ISBN, or generate AI disclosure. InkWeave is the pipeline from idea to bookshelf. ChatGPT is one tool inside that pipeline.",
test: "Try writing chapter 7 of a book in ChatGPT. Now try chapter 8. See if it remembers who the characters are.",
},
{
objection: "My friends/colleagues will think I cheated.",
answer: "Most authors today use AI somewhere — research, editing, brainstorming. Many won't tell you. InkWeave is honest about it: AI-assisted, author-led. You wrote the brief. You approved every chapter. You own the copyright. That's authorship, not cheating.",
test: "Open any modern non-fiction acknowledgements section. Count the tools, editors, and assistants thanked. You're already part of a team.",
},
{
objection: "What if it gets facts wrong?",
answer: "InkWeave is built for fiction-first, non-fiction-careful. For non-fiction, every claim is flagged. You provide source links. The Pre-commit Sanity Check highlights any chapter where AI generated content without grounding in your snippets. You catch issues before export.",
test: "Submit a non-fiction snippet. Watch the sanity check flag any unsourced claim before final export.",
},
{
objection: "I'll lose my creative voice / become dependent.",
answer: "Cancel anytime. Export your snippets, manuscripts, voice profile, and Memory Vault as a ZIP. No lock-in. Your data is yours.",
test: "Go to settings. Click 'Export everything'. You get a real ZIP. No account needed to read it.",
},
{
objection: "I write better than AI. I just need a structure tool.",
answer: "Use InkWeave as a structure tool only. Outline mode generates chapter-by-chapter scaffolding from your snippets. You write the prose. Skip the AI generation entirely. £9/mo Reader plan.",
test: "Pick Outline-only mode in /start. Get a 12-chapter structure. Write it yourself.",
},
{
objection: "What if the quality is bad?",
answer: "Free chapter, no card. If it's bad, walk away. No refund process needed. We're confident enough to give it away first.",
test: "Try one chapter. Free. No card. That's the test.",
},
];

export default function HonestPage() {
return (
<main className="min-h-screen" style={{ background: "var(--ink)", color: "var(--text-primary)" }}>
<nav className="flex items-center justify-between px-6 py-5 max-w-6xl mx-auto">
<Link href="/" className="text-xl tracking-widest uppercase font-sans" style={{ color: "var(--amber)", letterSpacing: "0.2em" }}>InkWeave</Link>
<Link href="/start" className="px-4 py-2 font-sans text-sm font-medium" style={{ background: "var(--amber)", color: "var(--ink)", borderRadius: "2px" }}>Try one chapter free</Link>
</nav>

<section className="px-6 py-16 max-w-3xl mx-auto text-center">
<p className="font-sans text-xs tracking-widest uppercase mb-3" style={{ color: "var(--amber)", letterSpacing: "0.3em" }}>The honest page</p>
<h1 className="text-4xl md:text-5xl font-bold mb-4">Reasons you might not want this.</h1>
<p className="font-sans" style={{ color: "var(--text-secondary)" }}>
We&apos;d rather you read this before paying than after. Every real objection, our actual answer, and a way to test if we&apos;re right.
</p>
</section>

<section className="px-6 pb-16 max-w-4xl mx-auto space-y-6">
{objections.map(({ objection, answer, test }, i) => (
<div key={i} className="p-8" style={{ background: "var(--ink-soft)", borderLeft: "3px solid var(--amber)" }}>
<p className="font-sans text-xs uppercase tracking-widest mb-2" style={{ color: "var(--text-dim)" }}>Objection {String(i + 1).padStart(2, "0")}</p>
<h2 className="text-xl font-bold mb-4" style={{ color: "var(--text-primary)" }}>
&quot;{objection}&quot;
</h2>
<p className="font-sans leading-relaxed mb-4" style={{ color: "var(--text-secondary)" }}>{answer}</p>
<div className="pt-4 mt-4 border-t font-sans text-sm" style={{ borderColor: "var(--ink-muted)", color: "var(--amber)" }}>
<span className="font-bold">Test it:</span> <span style={{ color: "var(--text-secondary)" }}>{test}</span>
</div>
</div>
))}
</section>

<section className="px-6 py-16 max-w-2xl mx-auto text-center">
<h2 className="text-3xl font-bold mb-6">Still not sure?</h2>
<p className="font-sans mb-8" style={{ color: "var(--text-secondary)" }}>
One chapter. Free. No card. If it&apos;s not your book, walk away.
</p>
<Link
href="/start"
className="inline-block px-10 py-5 text-base font-sans font-semibold transition-all hover:opacity-90"
style={{ background: "var(--amber)", color: "var(--ink)", borderRadius: "2px" }}
>
Try one chapter free
</Link>
</section>
</main>
);
}
15 changes: 13 additions & 2 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ export default function Home() {
<span className="text-xl tracking-widest uppercase font-sans" style={{ color: "var(--amber)", letterSpacing: "0.2em" }}>
InkWeave
</span>
<div className="flex items-center gap-6 font-sans text-sm" style={{ color: "var(--text-secondary)" }}>
<div className="flex items-center gap-5 font-sans text-sm" style={{ color: "var(--text-secondary)" }}>
<Link href="/features" className="hover:text-amber-400 transition-colors hidden md:inline">Features</Link>
<Link href="/publish" className="hover:text-amber-400 transition-colors hidden md:inline">Publish</Link>
<Link href="/showcase" className="hover:text-amber-400 transition-colors hidden md:inline">Showcase</Link>
<Link href="/honest" className="hover:text-amber-400 transition-colors hidden md:inline">Honest</Link>
<Link href="/pricing" className="hover:text-amber-400 transition-colors">Pricing</Link>
<Link
href="/start"
Expand Down Expand Up @@ -55,6 +57,9 @@ export default function Home() {
<p className="mt-4 text-xs font-sans" style={{ color: "var(--text-dim)" }}>
No card required. Your manuscript. Your rights. Never used for training.
</p>
<p className="mt-6 text-xs font-sans" style={{ color: "var(--text-dim)" }}>
Not sure about AI? <Link href="/honest" className="underline" style={{ color: "var(--amber)" }}>Read every objection</Link> · See <Link href="/features" className="underline" style={{ color: "var(--amber)" }}>Author Mode</Link> (you write, AI assists)
</p>
</section>

{/* BEFORE / AFTER */}
Expand Down Expand Up @@ -347,7 +352,13 @@ export default function Home() {
<footer className="px-6 py-10 border-t font-sans" style={{ borderColor: "var(--ink-muted)" }}>
<div className="max-w-6xl mx-auto flex flex-col md:flex-row justify-between gap-4 text-sm" style={{ color: "var(--text-dim)" }}>
<span>InkWeave — Built in the UK</span>
<div className="flex gap-6">
<div className="flex flex-wrap gap-4 md:gap-6">
<Link href="/features" className="hover:text-amber-400">Features</Link>
<Link href="/publish" className="hover:text-amber-400">Publish</Link>
<Link href="/showcase" className="hover:text-amber-400">Showcase</Link>
<Link href="/honest" className="hover:text-amber-400">Honest</Link>
<Link href="/pricing" className="hover:text-amber-400">Pricing</Link>
<Link href="/about" className="hover:text-amber-400">About</Link>
<Link href="/privacy" className="hover:text-amber-400">Privacy</Link>
<Link href="/terms" className="hover:text-amber-400">Terms</Link>
<Link href="/contact" className="hover:text-amber-400">Contact</Link>
Expand Down
Loading