{
  "schema": "drazil.tools.v1",
  "site": "https://drazil.app",
  "name": "Drazil",
  "summary": "Drazil is 44+ free, local-first tools in one tab: LaTeX/PDF typesetting, a study workspace (reader, notes, flashcards, quizzes, exam mode), and a media toolkit (PDF/image/audio/video). Everything runs in the browser. No account, no upload, no credits.",
  "updated": "2026-11-13",
  "companions": {
    "llms_txt": "https://drazil.app/llms.txt",
    "llms_full_txt": "https://drazil.app/llms-full.txt",
    "browse_page": "https://drazil.app/browse/",
    "sitemap": "https://drazil.app/sitemap.xml"
  },
  "agent_guide": {
    "overview": "Drive Drazil the same way a human would: open the tool URL, fill the editor/upload a file, press the main action button, wait for the result card or toast, then download. No login, no API key required for non-AI tools.",
    "workflow": [
      "1. Pick the matching tool from tools[] below (slug, or open /browse/ for the human list).",
      "2. Navigate directly to its app path (/tool/<slug>/). These URLs are deep-linkable; no clicking through menus needed.",
      "3. Drop or select the input file where the drop zone says 'Drop ... or click', or paste/write into the editor textbox.",
      "4. Press the tool's main action button (listed in each entry's action field; mostly labelled 'Build', 'Convert', 'Compress', 'Merge', etc.).",
      "5. Wait for the result: a result card with a 'Download' button, a toast in #toast, or a status region announcing tone (idle/busy/built/error).",
      "6. Capture the download with the browser's own download mechanism (in Playwright: page.waitForEvent('download')).",
      "7. For anything persistent, use the built-in backup: Settings -> Storage -> Export backup (JSON). Import restores it. Do not clear site data first."
    ],
    "rules": [
      "Everything is local. Files are read into the tab, processed there, and handed back as downloads. Do not try to upload files to Drazil; there is nowhere to upload them.",
      "No account is needed. Never create one, never look for a login.",
      "AI features (chat, quiz/exam generation, image/diagram generation, watermark suggestions, OCR errors, error assist) need the user's own provider in Settings -> AI, or a local Ollama at port 11434 (auto-detected). Non-AI tools work with no provider configured. If a provider call fails, the tool says so; do not retry blindly in a loop.",
      "Element ids recorded here are stable but always fall back to matching by accessible name (role + name), which is the primary contract.",
      "Canvases (whiteboard, diagrams, PDF pages) are not exposed as text. PDF pages carry an invisible text layer that IS readable; use it. The whiteboard and diagram scenes are visual; operate them through the labelled toolbar buttons, not by editing the canvas.",
      "First use of the heavy engines downloads them once: LaTeX engine ~30 MB, FFmpeg ~25 MB, Whisper ~75 or 500 MB, OCR language data on demand. Subsequent visits work offline (the service worker precaches the shell).",
      "State lives in the browser origin (IndexedDB 'lumen-*' and localStorage 'lumen.*'). Each origin has its own data: drazil.app and drasill.pages.dev do NOT share it. When drasill.pages.dev or another mirror forwards to drazil.app, previously saved work stays behind on the old origin; the site shows an export-backup prompt there for that reason.",
      "API keys the user enters are stored in localStorage on THIS origin in plain text ('lumen.ai'). An agent must never read them out, print them, or send them anywhere. Nothing sends them anywhere either.",
      "Do not clear storage, unregister the service worker, or toggle 'Reduce motion' settings unless the user asked.",
      "The app self-forwards known mirror hostnames (drasill.pages.dev and others) to drazil.app on load. Work with the redirect, not around it."
    ],
    "verification": [
      "Success of a build/convert/compress action appears as a result card (.cres-style) with a named 'Download' button, or a toast with role=status (#toast).",
      "LaTeX builds: the LaTeX views announce state on a status region (#ltLive, role=status) and fill an issues panel (#ltIssues) on failure with named failure blocks.",
      "Exam/quiz completion shows in-view results; use the visible buttons and the reader text layer rather than screenshots where possible.",
      "If a button is disabled, the action is unavailable right now (e.g. no input file yet); fill the input first."
    ],
    "state": {
      "origin_storage": [
        "IndexedDB: lumen-kv, lumen-library, lumen-study, lumen-latex-projects, lumen-latex-editor, lumen-reader-notebooks, lumen-snapshots, lumen-capture-queue, lumen-fonts-db, praxis-assets, lumen-share, lumen",
        "localStorage: lumen.* (including lumen.ai with provider config, lumen.prefs-style UI prefs, lumen.latex.autocompile)"
      ],
      "backup": "Settings -> Storage -> Export backup (JSON download); Import backup restores. The Library tool also has an export.",
      "tips": [
        "Panel state and tab focus persist per origin; reloading /home restores the last session.",
        "Share links for LaTeX projects embed the document gzip+base64url in the URL fragment (#latex?share=...); the payload stays client-side.",
        "PDF reader pages render on canvas; selectable text is in the DOM text layer."
      ]
    },
    "webmcp": "When the browser supports navigator.modelContext (WebMCP), Drazil registers list_tools, tool_info and open_tool so the agent can discover and navigate tools without parsing the DOM. A plain-JS fallback window.DrazilAgent with the same functions is always present."
  },
  "tools": [
    { "slug": "study", "name": "Study Workspace", "app": "https://drazil.app/tool/study/", "landing": "https://drazil.app/study/", "group": "Study & AI",
      "summary": "PDF/Word/Markdown reader with page-attached notes, highlights, flashcards, spaced repetition, an AI study companion and a workspace of panels.",
      "accepts": "PDF, Word, Markdown and plain-text files; notes are typed into the Notes tab",
      "action": "Open file (button 'Open file' in the toolbar), then read in the Reader tab; panels: Reader, Board, Highlights, Review, Insights, Notes",
      "output": "Notes/highlights saved locally; Library backup for archiving",
      "agent_notes": "Deep links: /tool/study/ opens the Study view; tabs are data-nav rail buttons (role=tab) e.g. 'Quiz', 'Exam', 'Calendar'. 'Open file' is the top-toolbar button. PDF text is readable via the invisible text layer. Chat/AI features need a provider (see agent_guide.rules)." },

    { "slug": "quiz", "name": "Quiz", "app": "https://drazil.app/tool/quiz/", "landing": "https://drazil.app/quiz/", "group": "Study & AI",
      "summary": "Generate a quiz from the open document or pasted text; auto-graded MCQ, short and long answers.",
      "accepts": "the open Reader document, or pasted text",
      "action": "Pick style and count, then press 'Generate quiz' (button id #qzGenGo)",
      "output": "Interactive quiz in the view; saved quizzes in the Library",
      "agent_notes": "Lives under the Study workspace as a tab (route /tool/quiz/ folds to it). Long answers are graded by your configured AI provider; without one, generation itself will not produce questions." },

    { "slug": "exam", "name": "Exam Mode", "app": "https://drazil.app/tool/exam/", "landing": "https://drazil.app/exam/", "group": "Study & AI",
      "summary": "Timed practice exams from your own material: question palette, clock, per-question review.",
      "accepts": "the open document or imported material",
      "action": "Start the paper; submit with the button labelled like 'Submit' (id #exSubmitBtn)",
      "output": "Scored result with per-question review",
      "agent_notes": "Route /tool/exam/ folds to the study workspace Exam tab. Recorded sessions are stored locally; review via the result screen." },

    { "slug": "library", "name": "Local Library", "app": "https://drazil.app/tool/library/", "landing": "https://drazil.app/library/", "group": "Study & AI",
      "summary": "On-device shelf for everything Drazil makes: files, notebooks, flashcards, quizzes, decks. Export/import as JSON.",
      "accepts": "anything Drazil produces, plus imported files",
      "action": "Open the tool, choose an item, press its named button (e.g. 'Add' #libAdd); 'Open' reads PDFs in the built-in reader (#rOpen)",
      "output": "Library items, or a JSON backup via 'Export backup'",
      "agent_notes": "The reading text layer is the reliable way to read PDF contents. Reader toolbar: narrate (#rNarrate), OCR the pages (#rOcr). Backup JSON is the only cross-machine migration path." },

    { "slug": "clock", "name": "Clock", "app": "https://drazil.app/tool/clock/", "landing": null, "group": "Study & AI",
      "summary": "Zen clock, countdown timer and stopwatch with fullscreen and pop-out.",
      "accepts": "nothing (pure app)",
      "action": "Pick a mode (Clock / Timer / Stopwatch); use the named controls; 'Pop out' (#ckPopOut) keeps it in a small window",
      "output": "Timer state is shown live (aria-live regions announce changes)",
      "agent_notes": "No files, nothing uploaded. Timer completion announces visually and (optionally) haptically." },

    { "slug": "whiteboard", "name": "Whiteboard", "app": "https://drazil.app/tool/whiteboard/", "landing": "https://drazil.app/whiteboard/", "group": "Study & AI",
      "summary": "Infinite canvas: pen, marker, shapes, sticky notes, direct typing, image paste, templates, multi-page boards.",
      "accepts": "drawn strokes, typed text, pasted images, PDFs (each page becomes a board page)",
      "action": "Use the toolbar (e.g. 'Pen' #wbtPen, 'Text' #wbtText, 'Sticky note' #wbtSticky); pages bar (#wbPagePrev/#wbPageNext/#wbPageAddBtn); 'Open PDF' (#wbOpenPdf)",
      "output": "Board saved locally ('Save current board'), exported as PNG or PDF, or to the Library",
      "agent_notes": "Canvas pixels are visual-only; drive via toolbar buttons. Colour swatches in #wbColors carry accessible names ('Ink','Accent','Amber','Green','Blue','Red'). Double-click empty canvas to type text. Ctrl+Z undoes." },

    { "slug": "diagrams", "name": "Interactive Diagrams", "app": "https://drazil.app/tool/diagrams/", "landing": "https://drazil.app/diagrams/", "group": "Study & AI",
      "summary": "AI draws a labelled study diagram of any topic; parts move, relabel, and quiz you.",
      "accepts": "a topic (text), optionally through your configured AI provider",
      "action": "Type the topic and press 'Generate' (button id #dgmGenerate); then manipulate parts with the named controls; 'Save' (#dgSave)",
      "output": "Saved diagram (local), SVG/PNG export (#dgSaveImg)",
      "agent_notes": "Requires an AI provider for generation. Scene parts are visual groups, not text; use the parts list and label buttons around the canvas." },

    { "slug": "simulate", "name": "Simulations", "app": "https://drazil.app/tool/simulate/", "landing": "https://drazil.app/simulate/", "group": "Study & AI",
      "summary": "Interactive simulations: Game of Life, Mandelbrot, predator/prey, solar system, chaos; describe a new one to build it.",
      "accepts": "choice of built-in simulation, or a description for a new one (AI)",
      "action": "Open from the home grid card 'Simulations'; pick a simulation; Run/Pause the named controls",
      "output": "Live simulation in-view",
      "agent_notes": "View is injected at runtime; buttons are named. Custom builds need the AI provider." },

    { "slug": "praxis", "name": "Praxis (Video Generator)", "app": "https://drazil.app/tool/praxis/", "landing": "https://drazil.app/praxis/", "group": "Study & AI",
      "summary": "Notes or a topic in; a narrated, captioned 1080p60 video out. Local neural voices (Kokoro, Piper, Chatterbox); no cloud, no credits.",
      "accepts": "a topic, a PDF, or notes",
      "action": "Configure the lesson, approve the plan; press the named Generate/Export controls; voices run on-device",
      "output": "Rendered WebM video (download) or preview in-view",
      "agent_notes": "First run downloads the voice/engine models; generation can take minutes. AI planning needs a provider, but a deterministic offline planner works without one and is labelled as offline." },

    { "slug": "narrator", "name": "File Narrator (TTS)", "app": "https://drazil.app/tool/narrator/", "landing": "https://drazil.app/narrator/", "group": "Study & AI",
      "summary": "Reads documents, notes and pasted text aloud with system and on-device neural voices.",
      "accepts": "Library files, pasted text, open documents",
      "action": "Open the tool, choose a voice, play; from the Reader use 'Narrate this document' (#rNarrate)",
      "output": "Audio playback in-view",
      "agent_notes": "On-device neural voices download on first use (~75-500 MB). System voices need no download." },

    { "slug": "dictate", "name": "Dictation", "app": "https://drazil.app/tool/dictate/", "landing": "https://drazil.app/dictate/", "group": "Study & AI",
      "summary": "Speak; get live transcribed text. Runs on browser speech or on-device Whisper.",
      "accepts": "speech (microphone)",
      "action": "Open the tool, press the named 'Start' mic control, speak, stop; copy the transcript",
      "output": "Transcript text in-view",
      "agent_notes": "Needs a microphone grant. Browser engine uses the browser's service; Whisper mode is fully on-device after a one-time download." },

    { "slug": "repeat", "name": "Repeat After Me", "app": "https://drazil.app/tool/repeat/", "landing": "https://drazil.app/repeat/", "group": "Study & AI",
      "summary": "Hear a line, say it back, compare takes; pronunciation drill on-device.",
      "accepts": "typed or pasted lines",
      "action": "Enter the line, play it ('Play' / id #rpOpen area controls), record yourself, compare",
      "output": "Take comparison in-view",
      "agent_notes": "Route /tool/repeat/ folds to the study workspace Repeat tab." },

    { "slug": "chat", "name": "Chatbot", "app": "https://drazil.app/tool/chat/", "landing": "https://drazil.app/chat/", "group": "Study & AI",
      "summary": "AI study companion right beside your material. Your provider, or local Ollama; free unauthenticated web search with citations when none is set.",
      "accepts": "questions (text)",
      "action": "Open the tool, type in the composer, press the send button (accessible name 'Send')",
      "output": "Streamed chat answer in-view",
      "agent_notes": "Route /tool/chat/ folds to the study workspace Chat tab. Without any provider the chat still answers via free web search, labelled as such." },

    { "slug": "brainly", "name": "Ask & Learn", "app": "https://drazil.app/tool/ask-learn/", "landing": "https://drazil.app/ask-learn/", "group": "Study & AI",
      "summary": "Ask questions against your documents, practise eight question kinds, or build a course from a topic.",
      "accepts": "questions, topics, or your documents",
      "action": "Open the tool; paste a text or pick a document; ask or start practice",
      "output": "AI answers, practice sessions, courses (local)",
      "agent_notes": "Route /tool/brainly/ and /tool/ask-learn/ both open this view. AI features need a provider." },

    { "slug": "transcript", "name": "Transcript Analysis", "app": "https://drazil.app/tool/transcript/", "landing": "https://drazil.app/transcript/", "group": "Study & AI",
      "summary": "Paste any transcript; get a structured summary, quiz, flashcards and notes.",
      "accepts": "a transcript (text)",
      "action": "Paste into the transcript box, press the named 'Analyse' control",
      "output": "Summary + quiz + flashcards + notes (local, saved to Library)",
      "agent_notes": "AI quality follows the configured provider; without one the tool cannot analyse deeply." },

    { "slug": "calendar", "name": "Calendar", "app": "https://drazil.app/tool/calendar/", "landing": "https://drazil.app/calendar/", "group": "Study & AI",
      "summary": "Exams, deadlines and reminders on an offline month grid; import/export .ics.",
      "accepts": ".ics import, or typed events",
      "action": "Add with '+' (id #calAdd); export via the .ics export button (id #calIcsExport)",
      "output": "Calendar events (local); .ics export",
      "agent_notes": "Route /tool/calendar/ folds to the study workspace Calendar tab." },

    { "slug": "tasks", "name": "Tasks & Notes", "app": "https://drazil.app/tool/tasks/", "landing": "https://drazil.app/tasks/", "group": "Study & AI",
      "summary": "Tasks, timers, alarms and sticky notes in one place; fully local.",
      "accepts": "typed tasks/notes",
      "action": "Add with the quick bar (id #tsAddBar); complete by toggling the task's checkbox",
      "output": "Tasks/notes (local)",
      "agent_notes": "Alarms are local to this device; nothing syncs." },

    { "slug": "todo", "name": "To-Do List", "app": "https://drazil.app/tool/todo/", "landing": "https://drazil.app/todo/", "group": "Study & AI",
      "summary": "Fast focused checklist with projects, labels, priorities, recurrence.",
      "accepts": "typed tasks",
      "action": "Type in the input and press Enter, or press the add button (id #tdAdd)",
      "output": "Checklist (local)",
      "agent_notes": "Route /tool/todo/ folds to the study workspace To-Do tab. Separate from Tasks & Notes by design." },

    { "slug": "notes", "name": "Notes", "app": "https://drazil.app/tool/notes/", "landing": "https://drazil.app/notes/", "group": "Study & AI",
      "summary": "Autosaving notes beside your reading; plain text or Markdown; saved to the local Library.",
      "accepts": "typed or pasted text",
      "action": "Write in the pad; save state is continuous; manage via named buttons",
      "output": "Notes (local; Library backup)",
      "agent_notes": "Route /tool/notes/ folds to the study workspace Notes tab. Paste-from-clipboard and save actions are named buttons." },

    { "slug": "notebook", "name": "Notebooks", "app": "https://drazil.app/tool/notebook/", "landing": "https://drazil.app/notebook/", "group": "Study & AI",
      "summary": "Topic notebooks bundling PDFs, notes, flashcards, quizzes; open and continue where you left off.",
      "accepts": "files, notes, decks, quizzes",
      "action": "Pick a notebook; 'New' (#nbNew) or 'Add PDFs' (#nbUpload); tabs switch members (Sources/Notes/Flashcards/Quizzes/Exam/Canvas/Chat/Highlights/Plan)",
      "output": "Notebook state (local; shareable as JSON via the share button)",
      "agent_notes": "Route /tool/notebook/ folds to the study workspace Notebook tab. Share produces a notebook JSON file; import on another origin via the same button." },

    { "slug": "docgen", "name": "Document Generator", "app": "https://drazil.app/tool/docgen/", "landing": "https://drazil.app/docgen/", "group": "Documents & PDF",
      "summary": "Describe a document; guided chat drafts clean Markdown via hidden templates (agreements, stories, essays, resumes, minutes...).",
      "accepts": "a description of the document",
      "action": "Open the tool, pick a template type, answer the guided questions; export Markdown",
      "output": "Markdown document (download or save to Library)",
      "agent_notes": "Requires an AI provider; templates do the structuring." },

    { "slug": "prodoc", "name": "Professional Document Engine", "app": "https://drazil.app/tool/prodoc/", "landing": "https://drazil.app/prodoc/", "group": "Documents & PDF",
      "summary": "Describe the document; get a typeset PDF - planned, designed and laid out locally (Text-to-PDF + real XeLaTeX pipeline).",
      "accepts": "a description, or an existing document to restagger",
      "action": "Describe it and press the generate control (id #pdGenerate); or open an existing file with 'Open' (id #pdOpenPdf)",
      "output": "Typeset PDF (download)",
      "agent_notes": "AI planning needs a provider; layout/typesetting itself is local and deterministic." },

    { "slug": "text-pdf", "name": "Text to PDF", "app": "https://drazil.app/tool/text-pdf/", "landing": "https://drazil.app/text-pdf/", "group": "Documents & PDF",
      "summary": "Text, Markdown or HTML in; a genuinely paginated PDF out - real engine, fonts, tables, code blocks and math.",
      "accepts": "plain text, Markdown, HTML, or rich paste into #tpText",
      "action": "Write/paste into the editor, press Build (id #tpGo); math and tables auto-layout",
      "output": "PDF download (result card with Download button)",
      "agent_notes": "No AI required. First-run font/engine assets download once (~tens of MB), then it is fully offline." },

    { "slug": "latex-pdf", "name": "LaTeX to PDF", "app": "https://drazil.app/tool/latex-pdf/", "landing": "https://drazil.app/latex-pdf/", "group": "Documents & PDF",
      "summary": "Compile LaTeX in the browser with TeX Live 2025 XeLaTeX (WebAssembly): real sections, math, tables, 672 packages.",
      "accepts": "a LaTeX document (preamble + body) or a template",
      "action": "Write LaTeX into the editor, press 'Compile' (id #ltGo); check issues panel (#ltIssues) on failure; status region #ltLive announces state",
      "output": "PDF download; compile log; named failure blocks on error",
      "agent_notes": "Engine is ~30 MB on first use, cached afterwards for offline compiles. Auto-compile mode is silent (no toast); the status region and the result card are the reliable success signals." },

    { "slug": "latex-editor", "name": "LaTeX Studio", "app": "https://drazil.app/tool/latex-editor/", "landing": "https://drazil.app/latex-editor/", "group": "Documents & PDF",
      "summary": "Full LaTeX IDE: project tree, bidirectional PDF<->source sync, templates, AI error assist and continuous compile.",
      "accepts": ".tex projects (new from templates, or opened files), project folders",
      "action": "Work in the editor; press Compile (button named 'Compile', usually Ctrl/Cmd+Enter); toolbar groups: Files / Search / Outline / References / AI; 'Export' downloads the PDF or project",
      "output": "PDF download; .tex project (shareable via ?share= link)",
      "agent_notes": "AI assistant proposes, compiler disposes: every AI edit is recompiled locally. Auto-compile is debounced; success surfaces on the status bar and the '.res' result card. Share button copies a URL-embedded project snapshot (client-side)." },

    { "slug": "word-pdf", "name": "Word to PDF", "app": "https://drazil.app/tool/word-pdf/", "landing": "https://drazil.app/word-pdf/", "group": "Documents & PDF",
      "summary": "Word (.docx) in; structured PDF out - headings, lists, images, bold/italic preserved.",
      "accepts": ".docx files",
      "action": "Drop the .docx onto the zone (or click it), press the Convert control (id #wpGo)",
      "output": "PDF download",
      "agent_notes": "Fully local; no upload." },

    { "slug": "pdf-merge", "name": "PDF Merge", "app": "https://drazil.app/tool/pdf-merge/", "landing": "https://drazil.app/pdf-merge/", "group": "Documents & PDF",
      "summary": "Combine several PDFs in your chosen order; text layer stays searchable.",
      "accepts": "2+ PDFs (drop or click)",
      "action": "Add files, reorder with the named controls, press 'Merge' (id #pmGo)",
      "output": "Single merged PDF download",
      "agent_notes": "Drop zone id #pmZone; result card appears with a 'Download' button." },

    { "slug": "pdf-split", "name": "PDF Split", "app": "https://drazil.app/tool/pdf-split/", "landing": "https://drazil.app/pdf-split/", "group": "Documents & PDF",
      "summary": "Split one PDF by page ranges; each range becomes its own PDF (or a burst ZIP).",
      "accepts": "one PDF plus page ranges",
      "action": "Drop the PDF, enter ranges, press the Split control (id #psGo)",
      "output": "Split PDFs / ZIP download",
      "agent_notes": "Drop zone id #psZone." },

    { "slug": "pdf-reorder", "name": "PDF Reorder", "app": "https://drazil.app/tool/pdf-reorder/", "landing": "https://drazil.app/pdf-reorder/", "group": "Documents & PDF",
      "summary": "Reorder, rotate, delete, reverse pages with a thumbnail strip.",
      "accepts": "one PDF",
      "action": "Open the PDF; drag thumbnails; press Save/Apply (id #prSave); 'Reverse' (id #prReverse) flips the order",
      "output": "Reordered PDF download",
      "agent_notes": "Drag interactions are pointer-based; for keyboard/agent use, operate the named rotate/reverse/delete buttons per thumbnail instead of dragging." },

    { "slug": "pdf-reverse", "name": "Reverse PDF", "app": "https://drazil.app/tool/pdf-reverse/", "landing": "https://drazil.app/pdf-reverse/", "group": "Documents & PDF",
      "summary": "Flip page order end to first (structural flip; text layer untouched) - for booklets and backwards scans.",
      "accepts": "one PDF",
      "action": "Drop the PDF, press Reverse (id #rvGo)",
      "output": "Reversed PDF download",
      "agent_notes": "One click, no options." },

    { "slug": "dual-pager", "name": "Dual Page Printer", "app": "https://drazil.app/tool/dual-pager/", "landing": "https://drazil.app/dual-pager/", "group": "Documents & PDF",
      "summary": "Split a PDF into odd/even halves for manual duplex printing, with blank 'delay' pages and reverse-feed options.",
      "accepts": "one PDF",
      "action": "Drop the PDF, choose options, press the Split/Generate control",
      "output": "Two PDFs (odd/even) downloads",
      "agent_notes": "View is injected at runtime by the dual-pager bundle; controls are named." },

    { "slug": "watermark", "name": "Watermark", "app": "https://drazil.app/tool/watermark/", "landing": "https://drazil.app/watermark/", "group": "Documents & PDF",
      "summary": "Stamp text across every page (or Word doc) - local, no upload.",
      "accepts": "a PDF or Word file, plus stamp text",
      "action": "Drop the file, type the stamp text, press the Watermark control (id #wmGo)",
      "output": "Watermarked PDF download",
      "agent_notes": "Preview canvas is visual-only; the stamp text field is a plain input." },

    { "slug": "pdf-unlock", "name": "PDF Unlocker", "app": "https://drazil.app/tool/pdf-unlock/", "landing": "https://drazil.app/pdf-unlock/", "group": "Documents & PDF",
      "summary": "Remove owner-password restrictions (printing/copying/editing flags) from PDFs that open without a password.",
      "accepts": "one restricted PDF that opens without a password",
      "action": "Drop the PDF, press the Unlock control (id #ulGo)",
      "output": "Unrestricted PDF download",
      "agent_notes": "Cannot and will not guess unknown passwords." },

    { "slug": "pdf-editor", "name": "PDF Editor", "app": "https://drazil.app/tool/pdf-editor/", "landing": "https://drazil.app/pdf-editor/", "group": "Documents & PDF",
      "summary": "Edit PDFs: text, highlight, images, shapes, rotate/delete/split/reorder, watermark.",
      "accepts": "one PDF",
      "action": "Open (button named 'Open PDF', id #peOpenBtn); annotate with the named toolbar; save with 'Save' (id #peSave)",
      "output": "Edited PDF download",
      "agent_notes": "Canvas pages are visual-only; use toolbar buttons and the (readable) text layer. Errors surface in a role=alert region (#peOpenError)." },

    { "slug": "img-pdf", "name": "Images to PDF", "app": "https://drazil.app/tool/img-pdf/", "landing": "https://drazil.app/img-pdf/", "group": "Documents & PDF",
      "summary": "Combine images into one tidy PDF, in your chosen order.",
      "accepts": "JPG/PNG/WebP and other browser-readable images",
      "action": "Add images, reorder with the named controls, press the Build control (id #ipGo)",
      "output": "Single PDF download",
      "agent_notes": "Fully local." },

    { "slug": "tiler", "name": "Poster Tiler", "app": "https://drazil.app/tool/tiler/", "landing": "https://drazil.app/tiler/", "group": "Documents & PDF",
      "summary": "Cut a big image or PDF into print-ready A4/Letter tiles with overlap and crop marks.",
      "accepts": "one image or PDF",
      "action": "Drop it, set paper size/overlap/scale, press the Generate control (id #ptGo)",
      "output": "Tiled pages PDF download",
      "agent_notes": "Preview canvas is visual-only; dimensions inputs are plain number fields." },

    { "slug": "ocr", "name": "OCR & Text Extraction", "app": "https://drazil.app/tool/ocr/", "landing": "https://drazil.app/ocr/", "group": "Documents & PDF",
      "summary": "On-device OCR (Tesseract) for images and scanned PDFs; multi-page, searchable output.",
      "accepts": "images or scanned PDFs",
      "action": "Open the file picker (button id #ocrOpenBtn or drop onto the zone), press the Extract control (id #ocrGo)",
      "output": "Extracted text in-view (copy/download)",
      "agent_notes": "Engine downloads language data once; OCR is slow on huge scans; extracted text is fully readable text." },

    { "slug": "viewer", "name": "Image Viewer / Editor", "app": "https://drazil.app/tool/viewer/", "landing": "https://drazil.app/viewer/", "group": "Images, video & audio",
      "summary": "View and edit images: zoom, crop, draw, rotate, flip, background removal, filters.",
      "accepts": "images (files, paste, clipboard)",
      "action": "Open the image; edit with the named toolbar; save (id #ivSave)",
      "output": "Edited image download",
      "agent_notes": "Canvas is visual-only; every edit operation is a named button." },

    { "slug": "convert-img", "name": "Image Converter (JPG/PNG/WebP)", "app": "https://drazil.app/tool/convert-img/", "landing": "https://drazil.app/convert-img/", "group": "Images, video & audio",
      "summary": "Convert image formats one file or batched (ZIP out), with quality control.",
      "accepts": "image files (batch ok)",
      "action": "Drop files in, pick target format/quality, press Convert",
      "output": "Converted image(s) / ZIP download",
      "agent_notes": "Each direction the pair allows; no upload." },

    { "slug": "compress-image", "name": "Image Compressor", "app": "https://drazil.app/tool/compress-image/", "landing": null, "group": "Images, video & audio",
      "summary": "Shrink images with AVIF/WebP/MozJPEG; sized by measured quality.",
      "accepts": "image files",
      "action": "Drop images in, pick format/target, press Compress (id #ciGo)",
      "output": "Compressed image(s) download",
      "agent_notes": "No landing document; this entry is the canonical description. App route only; deep-linkable." },

    { "slug": "compress-pdf", "name": "PDF Compressor", "app": "https://drazil.app/tool/compress-pdf/", "landing": null, "group": "Images, video & audio",
      "summary": "Re-encode embedded images to shrink PDFs; keeps text sharp.",
      "accepts": "one PDF",
      "action": "Drop the PDF, pick a level, press Compress (id #cpGo)",
      "output": "Compressed PDF download",
      "agent_notes": "No landing document. App route only; deep-linkable." },

    { "slug": "compress-video", "name": "Video Compressor", "app": "https://drazil.app/tool/compress-video/", "landing": null, "group": "Images, video & audio",
      "summary": "Re-encode video H.264/VP9/AV1; best-of-several encodes, measured quality.",
      "accepts": "video files",
      "action": "Drop the video, pick codec/quality, press Compress (id #cvGo)",
      "output": "Compressed video download",
      "agent_notes": "FFmpeg engine (~25 MB) downloads once. CPU-heavy; long files take a while." },

    { "slug": "compress-audio", "name": "Audio Compressor", "app": "https://drazil.app/tool/compress-audio/", "landing": null, "group": "Images, video & audio",
      "summary": "Opus/AAC/MP3/FLAC with loudness normalization.",
      "accepts": "audio files",
      "action": "Drop the audio, pick codec/bitrate, press Compress (id #cauGo)",
      "output": "Compressed audio download",
      "agent_notes": "No landing document. App route only; deep-linkable." },

    { "slug": "convert", "name": "Convert (MKV/MP4, Doc to PDF, CSV to JSON)", "app": "https://drazil.app/tool/convert/", "landing": "https://drazil.app/convert/", "group": "Images, video & audio",
      "summary": "Container/format utility belt: video containers, doc to PDF, CSV to JSON and more - all local.",
      "accepts": "video/audio files, documents, CSV/JSON",
      "action": "Pick the conversion, drop the file, press the Convert control (id #cfGo)",
      "output": "Converted file download",
      "agent_notes": "FFmpeg downloads once for video work." },

    { "slug": "convert-audio", "name": "Audio Extractor", "app": "https://drazil.app/tool/convert-audio/", "landing": "https://drazil.app/convert-audio/", "group": "Images, video & audio",
      "summary": "Pull the soundtrack out of any video (MP4/MKV/MOV/WebM) to WAV.",
      "accepts": "video files",
      "action": "Drop the video, press the Extract control (id #caGo)",
      "output": "WAV download",
      "agent_notes": "Local; FFmpeg downloads once." },

    { "slug": "html", "name": "HTML Viewer", "app": "https://drazil.app/tool/html/", "landing": "https://drazil.app/html/", "group": "Images, video & audio",
      "summary": "Open one HTML file or a whole folder; rendered sandboxed, with a file tree - fully offline.",
      "accepts": ".html files, or a folder picker",
      "action": "Open via named buttons (#htmlOpen or #htmlOpenFolder), press Render (id #htmlGo); download the render (id #htmlDownload)",
      "output": "Rendered page in sandboxed iframe",
      "agent_notes": "Sandboxed frame; unknown HTML cannot harm the app or device." },

    { "slug": "qr", "name": "QR Generator", "app": "https://drazil.app/tool/qr/", "landing": "https://drazil.app/qr/", "group": "Images, video & audio",
      "summary": "QR codes for links, Wi-Fi and text; PNG/SVG, error correction, colors.",
      "accepts": "text (typed in the field)",
      "action": "Type content, pick error correction/size/color; the code renders live; download PNG or SVG",
      "output": "PNG/SVG download",
      "agent_notes": "No button needed to generate; configure then download." },

    { "slug": "imagegen", "name": "SVG Generator", "app": "https://drazil.app/tool/imagegen/", "landing": "https://drazil.app/imagegen/", "group": "Images, video & audio",
      "summary": "Describe an icon/illustration/logo; get SVG or PNG. Runs via your AI provider.",
      "accepts": "a text description",
      "action": "Type the description, press Generate (id #igGenerate, or Ctrl/Cmd+Enter)",
      "output": "SVG/PNG download",
      "agent_notes": "Requires an AI provider; there is no hidden default." },

    { "slug": "ollama-guide", "name": "Local Models (Ollama guide)", "app": "https://drazil.app/tool/ollama-guide/", "landing": "https://drazil.app/ollama-guide/", "group": "Study & AI",
      "summary": "Four steps to connect Drazil to Ollama on this machine; every AI feature then stays on-device.",
      "accepts": "nothing (documentation view)",
      "action": "Read the steps; set OLLAMA_ORIGINS, restart Ollama, pick the model in Settings -> AI",
      "output": "Local AI wired into every AI tool",
      "agent_notes": "Drazil auto-detects Ollama on 127.0.0.1:11434 on fresh origins; explicit setup needed only for custom hosts." }
  ]
}
