{"id":47616274,"url":"https://github.com/phazonoverload/wordsworth","last_synced_at":"2026-04-01T21:28:17.085Z","repository":{"id":340728251,"uuid":"1166584776","full_name":"phazonoverload/wordsworth","owner":"phazonoverload","description":"Microtools for Technical Authors","archived":false,"fork":false,"pushed_at":"2026-02-26T07:34:20.000Z","size":848,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-26T12:33:20.781Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://wordsworth.lws.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phazonoverload.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-25T11:34:32.000Z","updated_at":"2026-02-26T07:19:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/phazonoverload/wordsworth","commit_stats":null,"previous_names":["phazonoverload/wordsworth"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/phazonoverload/wordsworth","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phazonoverload%2Fwordsworth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phazonoverload%2Fwordsworth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phazonoverload%2Fwordsworth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phazonoverload%2Fwordsworth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phazonoverload","download_url":"https://codeload.github.com/phazonoverload/wordsworth/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phazonoverload%2Fwordsworth/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292263,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-01T21:28:15.435Z","updated_at":"2026-04-01T21:28:17.065Z","avatar_url":"https://github.com/phazonoverload.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003e\u003cimg src=\"docs/images/main.png\" alt=\"Wordsworth. Microtools for technical writers.\"\u003e\u003c/h1\u003e\n\nWordsworth is a browser-based writing workbench for people who write technical content. Paste your Markdown into the editor, pick a tool, and get instant feedback on readability, style, and more.\n\nMost tools run entirely in the browser with no account or API key required. AI-powered features (audience assessment, style fixes) are bring-your-own-key -- enter an OpenAI, Anthropic, or Google API key in settings and requests go directly through a lightweight proxy. You can also use [Ollama](https://ollama.com) to run models locally with no API key or cloud account required. Nothing is stored server-side.\n\n## Tools\n\n\u003ch3\u003e\u003cimg src=\"docs/images/readability.png\" alt=\"Readability. Level, time, and audience fit at a glance.\"\u003e\u003c/h3\u003e\n\nAnswers the question: _is this pitched at the right level for my readers?_\n\nWordsworth calculates three standard readability metrics from your text: Flesch-Kincaid score, Gunning Fog index, and an overall grade level. It also shows word count, sentence count, and estimated reading time.\n\nThe grade level is displayed with a color-coded indicator -- green for grade 8 and below, yellow for 9-12, and red for 13+. A plain-English label (e.g. \"middle school\", \"college\") accompanies the number so you can quickly judge whether your writing matches your audience.\n\nBelow the metrics, you can select a target audience from presets (Senior developers, Junior developers, Non-technical stakeholders, General audience) or write your own custom description. If you have an AI API key configured, an \"Assess for audience with AI\" button sends your document and audience description to an LLM, which returns a one-paragraph verdict on whether your jargon level, sentence complexity, and assumed knowledge are appropriate. The assessment considers context -- it won't penalise technical terminology when writing for a technical audience.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/style-check.png\" alt=\"Style Check. Passive voice, wordiness, and inconsistencies.\"\u003e\u003c/h3\u003e\n\nScans your prose for three categories of style issues:\n\n- **Passive voice** -- flags constructions like \"was written\" or \"is being built\" that weaken technical writing.\n- **Wordy phrases** -- catches verbose constructions (\"in order to\", \"due to the fact that\", \"utilize\") and suggests concise alternatives.\n- **Inconsistencies** -- detects mixed US/UK spelling (\"color\" vs \"colour\") and inconsistent terminology (\"user\" vs \"customer\" vs \"client\") within the same document, flagging the minority usage.\n\nEach issue shows the line number, the flagged text, and a suggestion. Clicking an issue highlights the relevant line in the editor. If you have an AI API key configured, you can fix individual issues or all issues at once -- the AI rewrites the affected text and presents a diff for you to review and accept before anything changes.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/pronouns.png\" alt=\"Pronouns. See who your writing talks to.\"\u003e\u003c/h3\u003e\n\nReveals the pronoun balance in your writing by counting three groups: I/me/my, you/your, and we/us/our. It calculates percentages and produces a tone assessment -- from \"strongly reader-focused\" to \"strongly author-focused\" -- so you can see at a glance whether your docs talk _to_ the reader or _at_ them.\n\nAll pronoun matches are highlighted inline in the editor with color-coded markers (blue for I-group, green for you-group, amber for we-group), making it easy to spot clusters.\n\nTechnical documentation generally benefits from a reader-focused \"you\" voice. This tool makes the balance visible without you having to count anything.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/header-shift.png\" alt=\"Header Shift. Promote or demote all heading levels at once.\"\u003e\u003c/h3\u003e\n\nBulk-shifts all Markdown header levels up or down by one. Promote turns every H2 into H1, every H3 into H2, and so on. Demote does the reverse.\n\nThis is useful when embedding content into a larger site where the page title occupies H1, so your document headings need to drop a level. The tool shows a breakdown of how many headers exist at each level (H1-H6), blocks unsafe operations (promoting when an H1 already exists, demoting when an H6 exists), and provides an undo button to revert the last shift.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/parallel-structure.png\" alt=\"List Consistency. Make your lists consistent.\"\u003e\u003c/h3\u003e\n\nAnswers the question: _are my bullet lists grammatically consistent?_\n\nWordsworth scans every Markdown list in your document -- both ordered and unordered -- and classifies each item by its grammatical opening: imperative verb (\"Install the package\"), gerund (\"Installing the package\"), infinitive (\"To install the package\"), noun phrase (\"The package\"), or full sentence (\"You install the package\"). It also tracks whether items are capitalized and whether they end with punctuation.\n\nWhen items in the same list don't match, the tool flags the outliers. Each issue is categorized as a pattern mismatch, a capitalization inconsistency, or a punctuation inconsistency, and shows the line number and the offending text. Clicking an issue highlights it in the editor. If you have an AI API key configured, you can fix individual issues or all issues at once -- the AI rewrites the inconsistent items to match the dominant pattern.\n\nCode blocks are excluded from analysis so fenced examples don't produce false positives.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/acronym-checker.png\" alt=\"Acronyms. Find acronyms that aren't expanded on first use.\"\u003e\u003c/h3\u003e\n\nAnswers the question: _did I introduce every acronym before using it?_\n\nWordsworth finds sequences of two or more uppercase letters (API, HTML, SAML) and checks whether each one is expanded on first use. It recognizes three expansion patterns: parenthetical definition (\"Application Programming Interface (API)\"), reverse parenthetical (\"API (Application Programming Interface)\"), and inline definition (\"API, or Application Programming Interface\"). Common abbreviations like OK, US, AM/PM, and ID are skipped automatically, and text inside code blocks is excluded.\n\nThe result shows how many acronyms were found versus how many lack an expansion. Each unexpanded acronym is displayed as a card with a violet badge, usage count, and line number. Clicking a card highlights the first occurrence in the editor. If an acronym is intentionally unexpanded, you can dismiss it -- dismissed issues are hidden from the current results but reappear on the next run. A toggleable \"detection details\" panel at the bottom explains the heuristics so you know exactly what the tool looks for.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/hedge-words.png\" alt=\"Hedges. See how tentative your writing sounds.\"\u003e\u003c/h3\u003e\n\nAnswers the question: _is my writing too tentative or wishy-washy?_\n\nWordsworth scans your prose for hedging language -- words and phrases that soften assertions or introduce unnecessary uncertainty. It detects three groups: **uncertainty hedges** (might, could, may, perhaps, possibly, conceivably, presumably), **frequency hedges** (generally, usually, often, sometimes, occasionally, typically, normally, frequently, rarely, seldom), and **softeners** (somewhat, fairly, rather, quite, slightly, relatively, arguably, practically, essentially, basically, virtually).\n\nThe result shows an overall tone assessment based on hedge density -- from \"fully assertive\" (0%) through \"balanced\" (1-3%) to \"heavily hedged\" (5%+). Each group is displayed as a card with a count, a percentage-of-words bar, and an expandable list of matches. Clicking a match highlights it in the editor with a color-coded marker (orange for uncertainty, amber for frequency, rose for softeners). If a flagged word is intentional, you can dismiss it from the current results.\n\nCode blocks are excluded from analysis so inline examples don't produce false positives.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/promises.png\" alt=\"Promises. Check if your intro delivers on its claims.\"\u003e\u003c/h3\u003e\n\nAnswers the question: _does your article deliver on what the introduction sets up?_\n\nThis AI-powered tool reads through your document and identifies claims or promises made in the opening paragraphs -- things like \"this guide will show you how to...\" or \"by the end you'll understand...\". It then checks whether each promise is actually fulfilled in the body and conclusion, returning a verdict of pass, fail, or partial for each one, along with evidence from the text.\n\nThe result shows a summary count (e.g. \"2 of 3 promises fulfilled\") followed by each promise with a color-coded verdict -- green for pass, red for fail, yellow for partial. Requires an AI API key.\n\n\u003ch3\u003e\u003cimg src=\"docs/images/cut-by-20.png\" alt=\"Cut by 20%. Trim the fat without losing meaning.\"\u003e\u003c/h3\u003e\n\nAnswers the question: _can this be shorter without losing anything important?_\n\nThis AI-powered tool sends your document to an LLM with a single directive: cut approximately 20% of the word count while preserving technical accuracy and meaning. If you have a target audience configured, the model factors that in when deciding what to trim -- it won't cut context that your readers need.\n\nThe result shows original and edited word counts with the reduction percentage, followed by a list of individual edit chunks. Each chunk displays the original text (struck through, red) alongside the condensed replacement (green), with a brief reason for the cut. You review each suggestion independently -- Accept applies the edit to your document immediately, Reject keeps the original, and Highlight scrolls to the relevant passage in the editor. Requires an AI API key.\n\n## Running locally\n\nMost tools (Readability, Style Check, Pronouns, Header Shift, List Consistency, Acronyms, Hedges) run entirely in the browser with no backend. The AI-powered features (audience assessment, style fixes, parallel structure fixes, promise tracking, cut by 20%) route through a Netlify Functions proxy at `netlify/functions/ai-proxy.mts`, so you need to use the Netlify CLI to run the dev server:\n\n```\nnpm install\nnetlify dev\n```\n\nThis starts both the Vite frontend and the Netlify Functions server. The proxy accepts requests at `/api/ai` and forwards them to your configured AI provider (OpenAI, Anthropic, or Google). API keys are entered in the settings modal and stored in your browser's local storage -- they are sent per-request to the proxy and are never stored server-side.\n\nIf you only need the non-AI tools, `npx vite` works fine -- the AI buttons simply won't appear unless you configure a key.\n\n### Using Ollama (local models)\n\nIf you'd rather run AI features against a local model instead of a cloud API, you can use [Ollama](https://ollama.com):\n\n1. [Install Ollama](https://ollama.com/download) and pull a model (e.g. `ollama pull llama3.1:8b`).\n2. Make sure Ollama is running (`ollama serve` or the desktop app).\n3. In Wordsworth's settings modal, click the **Ollama** provider button.\n4. Enter the model name as shown by `ollama list` (e.g. `llama3.1:8b`).\n5. The base URL defaults to `http://localhost:11434` -- change it if Ollama is running on a different host or port.\n\nNo API key is needed. Ollama requests go directly from your browser to the local Ollama server, bypassing the Netlify proxy entirely. Smaller models may produce lower-quality results for complex tasks like promise tracking, but work well for style fixes and audience assessment.\n\n\u003e **Note:** On the hosted version of Wordsworth, Ollama is disabled since it requires a local server. To use Ollama, clone the repo and run locally with `netlify dev`. If you're deploying your own instance, set the `VITE_DISABLE_OLLAMA` environment variable to `true` in your Netlify dashboard to show a \"run locally\" message instead of the Ollama configuration inputs.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphazonoverload%2Fwordsworth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphazonoverload%2Fwordsworth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphazonoverload%2Fwordsworth/lists"}