Skip to content
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
1 change: 1 addition & 0 deletions .github/topics.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"names":["ai-writing","writing-assistant","author-voice","creative-writing","fiction","nonfiction","knowledge-graph","graphrag","humanizer","deslop","codex","oauth","local-first","windows","python","jev","openrouter","typesafe"]}
49 changes: 35 additions & 14 deletions .github/workflows/windows.yml
Original file line number Diff line number Diff line change
@@ -1,37 +1,58 @@
name: Windows desktop package
name: Build and publish Windows release
on:
workflow_dispatch:
push:
tags: ['v*']
permissions:
contents: write
jobs:
package:
runs-on: windows-latest
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: pip
- run: python -m pip install -r requirements-dev.txt
- run: python -m pip install -q -r requirements-dev.txt
- run: python -m pytest -q
- shell: pwsh
run: ./scripts/build_windows.ps1
- name: Verify frozen backend serves the bundled interface
- run: python -m playwright install --with-deps chromium
- run: python scripts/ui_smoke.py
- run: python scripts/ui_studio_smoke.py
windows:
needs: quality
runs-on: windows-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: python -m pip install -q -r requirements-dev.txt
- run: python -m pytest -q --junitxml=test-results/windows.xml
- name: Build verified Windows package with official Codex runtime
shell: pwsh
run: |
python scripts/check_package.py dist/GraphPaper
env:
GITHUB_TOKEN: ${{ github.token }}
run: ./scripts/build_release.ps1
- uses: actions/upload-artifact@v4
with:
name: GraphPaper-Windows-x64
path: dist/GraphPaper-Windows-x64.zip
- name: Attach package to version release
path: |
dist/GraphPaper-v*-Windows-x64.zip
dist/SHA256SUMS.txt
- name: Publish a versioned release when built from a tag
if: startsWith(github.ref, 'refs/tags/v')
env:
GH_TOKEN: ${{ github.token }}
shell: pwsh
run: |
$version = python -c "from graphpaper import __version__; print(__version__)"
if ($env:GITHUB_REF_NAME -ne "v$version") { throw 'Tag does not match application version.' }
gh release view $env:GITHUB_REF_NAME *> $null
if ($LASTEXITCODE -ne 0) { gh release create $env:GITHUB_REF_NAME --title "GraphPaper $env:GITHUB_REF_NAME" --generate-notes }
gh release upload $env:GITHUB_REF_NAME dist/GraphPaper-Windows-x64.zip --clobber
if ($LASTEXITCODE -ne 0) { gh release create $env:GITHUB_REF_NAME --verify-tag --title "GraphPaper $env:GITHUB_REF_NAME" --notes-file docs/RELEASE-0.2.md }
gh release upload $env:GITHUB_REF_NAME "dist/GraphPaper-v$version-Windows-x64.zip" dist/SHA256SUMS.txt --clobber
- uses: actions/upload-artifact@v4
if: always()
with:
name: Windows-validation
path: test-results/
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,9 @@ playwright-report/
*.sqlite3
*.sqlite3-shm
*.sqlite3-wal

vendor/

.build-venv/

.playwright/
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## 0.2.0 — 2026-10-05

- Learn and edit an author voice from uploaded writing or selected article URLs.
- Separate project folders, stable-file automatic Inbox imports, role subfolders and original uploads.
- Local prose inspection, humanizer/deslopping proposals, protected factual spans and explicit accept/reject with version history.
- Official Codex browser OAuth and subscription-based writing, with an isolated account directory and bundled Windows runtime.
- Dedicated new workflow, API, subprocess and browser tests; versioned Windows release packaging with SHA-256 provenance.


## 0.1.0 — 2026-10-05

Initial GraphPaper writing studio:
Expand Down
16 changes: 14 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@ GraphPaper is a local-first, Windows-oriented writing studio for **nonfiction an
![GraphPaper's interactive graph studio](docs/images/graph.webp)
*Actual app screenshot using the explicitly illustrative project included with the application.*

## Open the studio on Windows
## GraphPaper 0.2.0

[**Download the Windows release**](https://github.com/AronAxe/GraphPaper/releases/latest) · [What is new](docs/UPDATE-0.2.md)

Your own writing voice from uploads or article URLs; a project Inbox with automatic local imports; reversible humanizer/deslopping passes; and **Codex / ChatGPT browser sign-in instead of a writing API key**. The Windows package includes Python and the official Codex runtime. Existing API providers and the optional JEV connection remain available.

## Open the source edition on Windows

1. Extract the complete source ZIP to a normal folder, not inside the ZIP viewer.
2. Double-click **`Open GraphPaper.vbs`**. This source edition needs **Python 3.11 or newer**, including Tcl/Tk. Python 3.12 or 3.13 is the conservative choice for the desktop dependencies.
Expand All @@ -19,7 +25,7 @@ GraphPaper is a local-first, Windows-oriented writing studio for **nonfiction an

There is no need to type commands. The native window uses Microsoft Edge WebView2. See [Windows setup and troubleshooting](docs/WINDOWS.md).

**Executable packaging:** a Windows build script and GitHub Actions workflow are included. They generate a portable `GraphPaper.exe` folder/ZIP; this source package is not a prebuilt or signed Windows executable. Native Windows execution remains to be validated. The backend and interface have been tested on Linux; see [validation scope](docs/QUALITY.md).
**Executable packaging:** a Windows build script and GitHub Actions workflow are included. They generate a portable `GraphPaper.exe` folder/ZIP; this source package is not a prebuilt or signed Windows executable. Version 0.2 has native Windows automated tests and real-HTTP browser validation; see [validation scope](docs/QUALITY.md). Interactive native dialogs remain a separate check.

## A connected writing workflow

Expand Down Expand Up @@ -71,6 +77,12 @@ There are no analytics, remote fonts, hidden publishing or automatic agent loops

**The city that forgot the dark** demonstrates nonfiction angle discovery with clearly fictional, illustrative source notes. **The last keeper of borrowed mornings** demonstrates literary speculative fiction with original canon and character relationships. They are interface examples, not benchmark results or verified reporting.

## Version 0.2 validation update

The 0.2 update was tested on a native Windows 11 machine with an isolated Python 3.13 environment: **120 automated tests passed**, with one symlink-permission test skipped; **all 26 real-HTTP browser workflow checks passed** with zero JavaScript page errors. The official bundled **Codex CLI 0.160.1** passed its signed-out app-server handshake and required-command checks. These are local Windows results, not GitHub-hosted CI results; the hosted runner remained queued and that run was cancelled. Reports are in [docs/validation/v0.2](docs/validation/v0.2/) (or the corresponding directory from this documentation page).

A real user OAuth completion, paid model calls, output-quality comparisons and hands-on native-window dialog interaction are not claimed as tested. Historical 0.1 results below remain a record of that earlier build.

## Development and validation

```bash
Expand Down
8 changes: 8 additions & 0 deletions docs/QUALITY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Quality, tests and known limits

## Version 0.2 validation update

The 0.2 update was tested on a native Windows 11 machine with an isolated Python 3.13 environment: **120 automated tests passed**, with one symlink-permission test skipped; **all 26 real-HTTP browser workflow checks passed** with zero JavaScript page errors. The official bundled **Codex CLI 0.160.1** passed its signed-out app-server handshake and required-command checks. These are local Windows results, not GitHub-hosted CI results; the hosted runner remained queued and that run was cancelled. Reports are in [validation/v0.2](validation/v0.2/) (or the corresponding directory from this documentation page).

A real user OAuth completion, paid model calls, output-quality comparisons and hands-on native-window dialog interaction are not claimed as tested. Historical 0.1 results below remain a record of that earlier build.

## Initial local validation

Validation date: **5 October 2026**. Initial build environment: **Linux, Python 3.13**, system Chromium. Subsequent GitHub Actions results are separate and visible in the repository's Actions tab.
Expand Down Expand Up @@ -50,3 +56,5 @@ The practical quality goal is a better final article or story with less author c
The source launcher and visual native shell need a real Windows interactive validation pass. No signed installer is included. Provider endpoint/model availability can change. Citation support is sampled. There is no automatic paywall bypass, OCR, live-web fact verification, trained author-preference model, cloud-sync collaboration or full WYSIWYG editor. HTML/Word typography should still be checked for a publisher's specific template.

Large graphs are visually capped while the full project remains stored. Graphify IDs and native canonical IDs may leave duplicate conceptual labels after augmentation. Direction and pins influence candidate exploration but do not guarantee every requested connection is defensible.

The compiled Windows executable passed its startup, local backend and bundled-interface self-test. The versioned Windows ZIP includes the official Codex runtime and its verified provenance. This check does not complete a real account OAuth login or make a live model request.
26 changes: 26 additions & 0 deletions docs/RELEASE-0.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
## GraphPaper 0.2.0

A Windows writing studio for fiction and nonfiction, now with:

- **Your writing voice:** upload samples, paste writing, or discover and selectively import articles from your author/blog URL; learn an editable style profile with adjustable influence.
- **Project folders:** a local Inbox per project, automatic idle-time import, role-specific subfolders and original upload files.
- **Humanizer and deslopping:** separate or combined editing passes, explainable local inspection, protected factual spans, side-by-side proposals, diffs and explicit acceptance.
- **Codex / ChatGPT sign-in:** use your account allowance instead of a writing API key; official runtime included, with browser OAuth handled by Codex. Other API providers remain available. JEV is a separate optional connection.

### Windows

Download **GraphPaper-v0.2.0-Windows-x64.zip**, extract the complete folder and open **GraphPaper.exe**. No separate Python installation or terminal workflow is needed. Keep the `_internal` companion folder. Edge WebView2 must be available. The build is unsigned.

The SHA256SUMS file records the package checksum. The bundled Codex runtime has its own version, download URL and SHA-256 provenance in `_internal/vendor/codex-release.json`.

### Quality and limits

The build process runs automated tests, browser workflows and actual Windows package checks. Model responses in tests use controlled fixtures. The official runtime is checked while signed out; a real user's OAuth ceremony and live prose generation cannot be completed by CI. Inspect claims, citations and proposed edits before publishing.

Existing projects load with defaults for the new features. User data stays in the existing local GraphPaper data directory; extracting the new executable does not replace your project database.

### Verified on Windows

120 automated tests passed; one symlink-permission test was skipped. All 26 browser workflow checks passed over real local HTTP with no JavaScript page errors. Official Codex CLI 0.160.1 passed its signed-out app-server handshake. Hosted Actions were queued, so these results come from the isolated native Windows build, not a claimed successful CI run.

The compiled Windows executable passed its startup, local backend and bundled-interface self-test. The versioned Windows ZIP includes the official Codex runtime and its verified provenance. This check does not complete a real account OAuth login or make a live model request.
63 changes: 63 additions & 0 deletions docs/UPDATE-0.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# GraphPaper 0.2 — your voice, your project folder, cleaner prose

## Your writing voice

In **Sources → Your writing voice**, upload your own writing, paste a sample, or choose **Find my writing online**. The website tool reads the article/author page you enter and lists up to 30 same-site candidate links. Choose up to 12 of your own pieces to import. It does not assume every link was written by you or crawl an entire site invisibly.

**Learn my writing style** analyzes balanced beginning/middle/end excerpts and measurable cadence. The resulting profile is editable and has an influence slider and an on/off switch. It guides drafting, revision and humanizing. This is reusable, source-informed prompting, not weight fine-tuning or a guarantee of perfect imitation. Voice samples never become factual citations. When samples change, an old learned profile is ignored until refreshed; current samples can still guide style. Explicitly edited instructions are treated as author direction.

## A folder for every project

**Sources → Project folder** opens the project's workspace in Windows Explorer. Its stable ID keeps it associated with the same project even after renaming. The folder's ABOUT file records its human-readable title.

Put files in **Inbox**, or its **Evidence**, **Voice**, **Canon** or **Inspiration** subfolders. GraphPaper checks automatically every five seconds while that project is open, visible and idle. It waits for a stable file before importing; **Import files now** runs an explicit check. Files added while the app is closed are picked up on a later visit. Source changes do not silently trigger paid model requests.

Changed inbox files update their associated sources without multiplying duplicates. Removing files leaves the imported source intact. Source roles, file limits, symlink checks and conflict protection remain in effect. Uploads through the app are also kept in **Originals**. **Exports** is an available folder for your own output. Deleting the database project does not delete the folder. SQLite still holds the authoritative graph, outline, draft and history; use Export → Project backup for a portable project.

## Humanizer and deslopping

The writing desk offers **Humanize**, **Deslop**, **Both**, and a no-cost **Inspect prose** action. Humanizing focuses on the author's cadence and expression; deslopping focuses on filler, repetition, staged emphasis, formulaic contrasts and unsupported vague attribution.

These are editing tools, not AI-authorship detectors or promises to evade detection. Intentional dashes, repetition, formal language, humor and scientific qualifications are not blindly banned. The author's samples take precedence over generic style advice.

Quoted text, numbers, citations, links, code and blockquotes are protected during the edit. Missing or newly invented protected material fails validation. A separate editorial check looks for meaning drift. The proposal is stored separately, with side-by-side comparison and a line diff. **Accept** is explicit; changed drafts cannot be overwritten by stale proposals, and the previous draft remains in Versions. A model's fidelity judgment is not proof; check material claims yourself.

### Research and inspiration

GitHub searches for widely starred writing humanizers identified **blader/humanizer**, whose repository showed **54,162 stars on 5 October 2026**. Its structural-pattern-first approach, author-sample priority, and rewrite-then-check workflow informed this independent implementation. **stephenturner/skill-deslop** provided a second writing-specific reference for filler, repeated structures, inflated stakes and context-sensitive register. **peteromallet/desloppify** was excluded as the main prose reference because it targets code quality rather than article editing. No code or full prompt text from those projects is vendored here.

Primary references:
- https://github.com/blader/humanizer
- https://github.com/blader/humanizer/blob/main/SKILL.md
- https://github.com/stephenturner/skill-deslop
- https://github.com/stephenturner/skill-deslop/blob/main/SKILL.md

## Codex / ChatGPT sign-in instead of a writing API key

In **Connections**, select **Codex — sign in with ChatGPT**, then press **Sign in with ChatGPT**. Complete the official browser flow and check the connection. A blank model uses Codex's configured default; the model list can also be loaded. The Windows release bundles an official, digest-verified Codex runtime. A source installation can point to an existing native runtime.

GraphPaper uses Codex's documented app-server login and non-interactive execution. It does not scrape ChatGPT, ask you to paste session tokens, read another application's auth.json, or silently fall back to API billing. Codex handles its own credentials in GraphPaper's separate `codex-account` directory. Sign-out affects this directory, not your other Codex setups. Runtime provenance and its Apache licence are included in the bundle. Provider API keys are not inherited by the child process.

Writing through Codex consumes the applicable ChatGPT/Codex account allowance and remains subject to that account's limits and OpenAI's policies. Cloud processing still needs your consent. Codex controls its own output limits; GraphPaper's API output-token setting does not override them. Token usage is recorded when the runtime reports it, without inventing a monetary cost. **JEV is separate**: it needs its own optional OpenRouter/TypeSafe connection. Without one, writing still works and graph screening is explicitly unscored. External Graphify CLI mode also needs separate API credentials; Native graph extraction works with Codex sign-in.

Primary official documentation:
- https://developers.openai.com/codex/auth
- https://developers.openai.com/codex/app-server
- https://developers.openai.com/codex/noninteractive
- https://github.com/openai/codex

## Validation boundaries

The release process runs the existing suite plus new voice, inbox, provenance, protected-edit and Codex subprocess tests. Browser workflows exercise uploads, voice learning/editing, folder ownership and automatic import, humanizing/deslopping comparisons, acceptance/rejection and the Codex settings option. Controlled model and authentication doubles do not establish real prose quality or complete a real user OAuth ceremony.

A separate Windows check runs the actual bundled Codex executable, verifies the supported CLI flags, and performs a signed-out app-server handshake. No live model request or user sign-in is performed in CI. The compiled GraphPaper application also runs its backend/assets self-test. Interactive Windows dialog behavior and completion of your own browser sign-in remain user-environment checks. The executable is unsigned.

## Interface previews

![Author voice settings](images/voice-v0.2.webp)

![Reversible humanizer comparison](images/humanizer-v0.2.webp)

![Codex sign-in settings](images/codex-v0.2.webp)

These are actual UI renders using controlled test material, not live-model quality demonstrations.
Binary file added docs/images/codex-v0.2.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/folder-v0.2.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/humanizer-v0.2.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/voice-v0.2.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 25 additions & 0 deletions docs/validation/v0.2/browser.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"mode": "HTTP browser",
"live_models": false,
"checks": [
"Welcome and empty state",
"Illustrative graph renders with 18 nodes",
"Inspect graph node and persist pin",
"Path query and highlight",
"Edit and select an angle",
"Edit and reorder outline",
"Manuscript autosave and safe live preview",
"Clickable source references",
"Read and restore earlier version",
"Export options and valid Word output",
"Configure provider through UI (mock transport only)",
"Browser file-input upload and source ingestion",
"Complete graph \u2192 JEV \u2192 angle \u2192 outline \u2192 draft \u2192 review path with deterministic AI",
"Explicit revision job and versioning",
"Fiction from premise, scene generation and continuity ledger",
"Light theme",
"Responsive 390px layout without horizontal overflow"
],
"page_errors": [],
"ok": true
}
Loading
Loading