mortenjust/cleartext-mac
A text editor that will help you write clearer and simpler
Stale — last commit 4y ago
worst of 4 axescopyleft license (GPL-3.0) — review compatibility; last commit was 4y ago…
no tests detected; no CI workflows detected…
Documented and popular — useful reference codebase to read through.
last commit was 4y ago; no CI workflows detected
- ✓15 active contributors
- ✓GPL-3.0 licensed
- ⚠Stale — last commit 4y ago
Show 4 more →Show less
- ⚠Single-maintainer risk — top contributor 82% of recent commits
- ⚠GPL-3.0 is copyleft — check downstream compatibility
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
- →Fork & modify Mixed → Healthy if: add a test suite
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/mortenjust/cleartext-mac)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/mortenjust/cleartext-mac on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: mortenjust/cleartext-mac
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/mortenjust/cleartext-mac shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 4y ago
- 15 active contributors
- GPL-3.0 licensed
- ⚠ Stale — last commit 4y ago
- ⚠ Single-maintainer risk — top contributor 82% of recent commits
- ⚠ GPL-3.0 is copyleft — check downstream compatibility
- ⚠ No CI workflows detected
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live mortenjust/cleartext-mac
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/mortenjust/cleartext-mac.
What it runs against: a local clone of mortenjust/cleartext-mac — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in mortenjust/cleartext-mac | Confirms the artifact applies here, not a fork |
| 2 | License is still GPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 1363 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of mortenjust/cleartext-mac. If you don't
# have one yet, run these first:
#
# git clone https://github.com/mortenjust/cleartext-mac.git
# cd cleartext-mac
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of mortenjust/cleartext-mac and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "mortenjust/cleartext-mac(\\.git)?\\b" \\
&& ok "origin remote is mortenjust/cleartext-mac" \\
|| miss "origin remote is not mortenjust/cleartext-mac (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is GPL-3.0" \\
|| miss "license drift — was GPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 1363 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1333d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/mortenjust/cleartext-mac"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Cleartext is a macOS text editor (Swift, ~22KB codebase) that restricts writing to the 1,000 most common English words, enforcing clarity through vocabulary constraint. It includes a 'Trump mode' trained on speech patterns and supports multiple languages via bundled word lists (English.txt, Deutsch.txt, Français.txt, etc.). The core feature blocks keystrokes for words outside the allowed dictionary in real-time. Single-target macOS app structure: Simpler.xcodeproj contains the main project; Simpler/ folder holds source files (AppDelegate.swift, Document.swift, C.swift, LanguagePopupButton.swift) and language dictionaries as plain-text .txt files. UI defined in Base.lproj/Main.storyboard. Assets organized in Assets.xcassets with app icon and background images.
👥Who it's for
Writers, educators, and communicators who want to simplify their writing (inspired by Randall Munroe's Thing Explainer approach). Also appeals to developers interested in constraint-based text editing as a UX experiment. Originally created by Morten Just as a productivity/clarity tool.
🌱Maturity & risk
Experimental/archived stage. The project shows no recent commits (repo structure suggests development halted ~2016), with a January 2020 README update pointing to Textato as the successor. No visible test suite, CI setup, or active issue tracking. The codebase is complete but not actively maintained.
Single-maintainer project with no visible CI/CD, test coverage, or active maintenance. The 1,000-word dictionary is static (hard-coded in language .txt files) and not easily updateable without recompilation. Xcode user data folders (xcuserdata/) are committed to git, suggesting no .gitignore discipline. macOS-only and may require SDK updates to run on modern systems (last built for 10.11+).
Active areas of work
No active development. The README notes a redirect to Textato (January 2020) as the updated version. This repo serves as a historical reference and proof-of-concept for constrained-vocabulary editing.
🚀Get running
Clone the repo and open in Xcode: git clone https://github.com/mortenjust/cleartext-mac.git && cd cleartext-mac && open Simpler.xcodeproj. Then build and run the Cleartext scheme in Xcode (⌘R). Requires macOS 10.11+ and a recent Xcode version.
Daily commands: Open Simpler.xcodeproj in Xcode, select the Cleartext scheme, and press ⌘R to build and launch. The app appears as a native macOS window with a text editor and language selector popup (LanguagePopupButton.swift).
🗺️Map of the codebase
- Simpler/Document.swift: Likely contains NSDocument subclass managing text state and word validation on user input (keystroke interception)
- Simpler/AppDelegate.swift: Cocoa app entry point; manages app lifecycle, menus, and high-level document creation
- Simpler/C.swift: Unknown purpose from name alone, but likely contains core constraint/validation logic or word-list utilities
- Simpler/LanguagePopupButton.swift: UI component for switching between English, Trump, and other language word lists at runtime
- Simpler/English.txt: Master word list (~1,000 most common English words); defines the primary constraint vocabulary
- Simpler/Base.lproj/Main.storyboard: Primary UI layout (text editor, menus, language selector); defines the main app window and controls
🛠️How to make changes
For new word dictionaries, add a new .txt file (e.g., Português.txt) to Simpler/ following the format of English.txt. For UI changes, edit Simpler/Base.lproj/Main.storyboard in Interface Builder. Core validation logic likely in Simpler/Document.swift (word-filtering on keypress) or Simpler/C.swift (constraint logic). To add a new mode (like Trump mode), extend the language/mode selection in LanguagePopupButton.swift.
🪤Traps & gotchas
Xcode user data (xcuserdata/) is committed to git, causing merge conflicts if multiple developers open the project. Word dictionaries are loaded statically at compile-time; runtime word-list switching may have performance implications. No visible error handling for malformed .txt language files. The app targets macOS 10.11+; newer features (e.g., Dark Mode, NotchKit) are not implemented. Trump mode background image (trumpBackground.png) is hardcoded; difficult to extend to other modes visually.
💡Concepts to learn
- Vocabulary-constrained writing — The core design principle of Cleartext: restricting input to a small approved word list forces clearer, more accessible prose and is a novel UX pattern for text editors
- Real-time keystroke validation — Cleartext likely intercepts NSTextView keystrokes to validate words before they appear; understanding event handling in Cocoa text editing is critical to modifying validation logic
- NSDocument architecture (Cocoa) — Cleartext is built on macOS's document-based app pattern; Document.swift extends NSDocument, which handles file I/O, undo/redo, and state persistence
- Localized word lists / language switching — The app bundles separate .txt dictionaries for multiple languages (English, Deutsch, Français, etc.); understanding how to load and swap language data at runtime is essential for adding new languages
- Storyboard-based UI design — Cleartext uses Interface Builder (Main.storyboard) for layout; modern Swift UI is different, so understanding this older paradigm is needed to modify the UI without rewriting
- Trump mode (n-gram frequency analysis) — Trump mode suggests words based on speech patterns; this hints at a simplistic language model or Markov chain trained on speeches, a concept useful for understanding text suggestion systems
🔗Related repos
mortenjust/simpler-thesaurus— Companion project by the same author; a thesaurus that suggests simpler word alternatives for complex vocabularyfirst20hours/google-10000-english— The canonical source for the top 10,000 English words; Cleartext likely derives its 1,000-word list from this datasettextato/textato— The official successor to Cleartext; a modernized version of the same vocabulary-constrained text editorxkcd/xkcd-inspired-projects— Cleartext was inspired by Randall Munroe's Thing Explainer book; community ports and similar constraint-writing tools
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add unit tests for SimplerTextStorage.swift text filtering logic
SimplerTextStorage.swift is the core component that filters text against the 1,000 most common words list, but there are no test files in the repository. Adding XCTest unit tests would ensure the filtering logic works correctly across edge cases (punctuation, capitalization, contractions) and prevent regressions when refactoring the word validation engine.
- [ ] Create SimplerTextStorageTests.swift in Simpler.xcodeproj/
- [ ] Add test cases for: basic word filtering, punctuation handling, case-insensitive matching, and edge cases like hyphenated words
- [ ] Test integration with SimpleWords.swift to verify the word list loading
- [ ] Run tests locally and document how to run them in README.md
Add GitHub Actions workflow for automated macOS builds and release validation
The repo has no CI/CD pipeline. Adding a GitHub Action that builds the Simpler.xcodeproj on each push/PR would catch build regressions early, especially important given the Xcode project structure with multiple language files and assets that could easily break during refactoring.
- [ ] Create .github/workflows/macos-build.yml with xcodebuild steps to build the Simpler target
- [ ] Add validation that all language files (English.txt, Dansk.txt, etc.) are properly bundled
- [ ] Configure the workflow to run on pull requests to main/master branch
- [ ] Add build status badge to README.md
Refactor language files into a structured Language.swift model and remove duplicate language definitions
The repo has redundant language files: both Spanish.txt and Español.txt, plus multiple naming inconsistencies (Trump.txt, hemingway.txt, jobs.txt, xkcd.txt, trumpBackground.imageset). Also, LanguagePopupButton.swift likely has hardcoded file paths. Creating a centralized Language enum in Swift would eliminate duplication, make localization maintainable, and remove dead assets.
- [ ] Audit Simpler/ directory to identify duplicate language definitions and consolidate (e.g., Spanish.txt vs Español.txt)
- [ ] Create Language.swift with an enum listing all supported languages and their file mappings
- [ ] Refactor LanguagePopupButton.swift to use the Language model instead of raw filenames
- [ ] Remove unused .txt files (hemingway.txt, jobs.txt, xkcd.txt) unless they're documented features, and clarify purpose of Trump.txt in README
🌿Good first issues
- Add unit tests for word validation logic: create a test file in Simpler/ that verifies Document.swift correctly blocks words outside the 1,000-word list and allows valid words. Start with a test for 'hello' (valid) and 'pseudohexaemiolamineoxidase' (invalid).
- Extract and document the word-list loading mechanism: write a README section explaining how .txt language files are parsed and loaded, then refactor C.swift (or whichever file handles this) to use a cleaner struct/enum for word-list management.
- Add a missing language: pick a language with an existing .txt file (e.g., Deutsch.txt), verify the word list is sorted and deduplicated, then add it to the LanguagePopupButton.swift menu if missing, and test it in the UI.
⭐Top contributors
Click to expand
Top contributors
- @mortenjust — 82 commits
- @andreaponza — 4 commits
- @ejensen — 2 commits
- @davelab6 — 1 commits
- @nickeb96 — 1 commits
📝Recent commits
Click to expand
Recent commits
8469faa— Update README.md (mortenjust)021b94a— add smoother animation on bad words (mortenjust)95eb337— change version (mortenjust)a47cfa5— make it work for macos sierra (mortenjust)a9c93ab— make it work on Sierra (mortenjust)70d723d— Merge branch 'ejensen-missing_assets' (mortenjust)c211c1c— Add missing trump image (ejensen)31ae55a— Merge branch 'ejensen-language_menu' (mortenjust)86d5509— Merge branch 'language_menu' of https://github.com/ejensen/cleartext-mac into ejensen-language_menu (mortenjust)40c1209— add is and zwemmen to dutch (mortenjust)
🔒Security observations
This macOS text editor application presents a relatively low security risk profile. No critical vulnerabilities were identified. The codebase lacks external dependencies (no Package.swift or Podfile), significantly reducing supply chain risks. Primary concerns are minor: poor gitignore configuration allowing user-specific files and system metadata in version control. The application is written in Swift for macOS with no apparent injection risks, hardcoded credentials, or exposed infrastructure components. The application's scope as a simple text editor with local file operations further limits attack surface. Recommend: (1) Clean up version control artifacts, (2) Ensure proper code signing for distribution, (3) Validate file handling operations in ViewController.swift and Document.swift for path traversal issues, (4) Review SimplerTextStorage.swift for any unsafe string processing.
- Low · User-specific build artifacts in version control —
Simpler.xcodeproj/xcuserdata/, Simpler.xcodeproj/project.xcworkspace/xcuserdata/. The repository contains xcuserdata directories with user-specific Xcode configuration files (Breakpoints_v2.xcbkptlist, UserInterfaceState.xcuserstate) that should not be committed. While not a direct security vulnerability, this indicates poor .gitignore configuration and could expose system paths or local development information. Fix: Add xcuserdata/ to .gitignore and remove from version control history using 'git rm -r --cached' for these directories. - Low · macOS system metadata file in repository —
.DS_Store. .DS_Store files contain macOS filesystem metadata and should not be version controlled. This can expose system information and cause unnecessary repository bloat. Fix: Add .DS_Store to .gitignore and remove from git history using 'git rm --cached .DS_Store'. - Low · Potential politically sensitive easter egg content —
Simpler/Trump.txt, Simpler/Assets.xcassets/trumpBackground.imageset/, ViewController.swift (likely references). The codebase contains Trump-themed features and word lists ('Trump.txt', 'trumpBackground.png', 'Trump mode' functionality). While not a security vulnerability per se, this could create reputational or operational risks depending on the target audience and use case. Fix: Consider documenting the purpose of easter eggs and ensure they align with project goals. Optionally remove if not aligned with application brand.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.