Skip to content

Rename FreeFlow to Fluent and document efficiency improvements#16

Merged
inhaq merged 1 commit into
mainfrom
rename-to-fluent
Jun 26, 2026
Merged

Rename FreeFlow to Fluent and document efficiency improvements#16
inhaq merged 1 commit into
mainfrom
rename-to-fluent

Conversation

@inhaq

@inhaq inhaq commented Jun 26, 2026

Copy link
Copy Markdown
Owner

This pull request was created by @kiro-agent on behalf of @inhaq 👻

Comment with /kiro fix to address specific feedback or /kiro all to address everything.
Learn about Kiro Web


Summary

Rebrands the project from FreeFlow to Fluent across the entire repository and rewrites the docs to reflect the post-fork direction: more efficient, fewer tokens per dictation, and faster.

  • Full rename: Swift sources, Info.plist, Makefile, entitlements (FreeFlow.entitlements -> Fluent.entitlements), GitHub workflows, and the release skill (.agents/skills/fluent-release/). Bundle identifier is now com.inhaq.fluent, the @main app is FluentApp, and all repo/site links point to inhaq/fluent (freeflow.zachlatta.com -> fluent.inhaq.com).
  • README rewrite: Leads with a "Why Fluent Is Faster and Cheaper" section grounded in the actual code — plain dictation skips screenshot capture, screenshots are downscaled (768px) + JPEG-compressed + whitespace-cropped when used, the default cleanup model runs with low reasoning effort and reasoning output disabled, and reasoning tags are always stripped. Updated defaults commands to com.inhaq.fluent and added a Credits section attributing upstream Free Flow.
  • CHANGELOG + website: New [1.2.0] changelog entry describing the rebrand and efficiency work; llms.txt and index.html updated with the new positioning.

Notes / assumptions

  • I inferred the bundle ID com.inhaq.fluent and the site domain fluent.inhaq.com from your inhaq.com email/ownership. Adjust if you use different values.
  • The only remaining freeflow/zachlatta references are intentional attribution links to the upstream Free Flow repo.
  • The app icon still points at the existing Resources/AppIcon-Source.png placeholder; swap in the new Fluent logo when you share it.

Tested

  • Verified via repo-wide grep that no unintended old-brand references remain.
  • Did not run a macOS build (no Xcode/macOS toolchain in this Linux sandbox).

Summary by CodeRabbit

  • New Features

    • Rebranded the app and website to Fluent, including updated download links, app name, and release assets.
    • Added clearer website and README guidance for quick start, privacy, and local model setup.
  • Bug Fixes

    • Updated release and update behavior so users receive the correct Fluent build, version tag, and DMG filenames.
    • Improved displayed release notes and metadata to match Fluent branding across the app and site.

Rebrand the entire project from FreeFlow to Fluent across Swift sources,
Info.plist, Makefile, entitlements, GitHub workflows, the release skill,
and the website. Update the bundle identifier to com.inhaq.fluent and all
repository/site links to inhaq/fluent.

Rewrite the README and add a CHANGELOG entry to explain that Fluent is a
faster, more token-efficient fork of Free Flow: plain dictation skips
screenshot capture, screenshots are smaller and compressed when used, and
the default cleanup model runs with low reasoning effort.

Co-authored-by: Inzimam Ul Haq <27832433+inhaq@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR rebrands the app, release tooling, workflows, website, and documentation from FreeFlow to Fluent. It also updates build tags, bundle identifiers, logging and queue labels, updater paths, and release asset names to match Fluent artifacts.

Changes

Fluent rebrand and release plumbing

Layer / File(s) Summary
Release skill and checker
.agents/skills/fluent-release/agents/openai.yaml, .agents/skills/fluent-release/SKILL.md, .agents/skills/fluent-release/scripts/fluent-release-check.sh
The Fluent release skill interface, skill guidance, and checker script switch from FreeFlow names to Fluent names, including the default prompt and temporary changelog notes path.
App identity and bundle wiring
Info.plist, Makefile, Sources/App.swift, Sources/AppName.swift, Sources/AppState.swift, Sources/KeychainStorage.swift, Sources/SettingsView.swift
App bundle metadata, build defaults, entry-point naming, bundle-name fallback, dev-bundle detection, recording-state path, settings build-tag lookup, and keychain service fallback now resolve to Fluent identifiers.
Runtime namespaces and temp names
Sources/AppState.swift, Sources/AudioRecorder.swift, Sources/GlobalShortcutBackend.swift, Sources/NetworkMonitor.swift, Sources/PipelineSignpost.swift, Sources/RealtimeTranscriptionService.swift, Sources/StreamingMultipartBody.swift, Sources/TestCaseExporter.swift, Sources/TranscriptionService.swift
Logging subsystems, dispatch queue labels, automatic-termination messages, and temporary export names are renamed to the Fluent namespace across the recording, audio, shortcut, network, transcription, upload, signpost, and test export paths.
Dev release workflow
.github/workflows/dev-release.yml
The dev release workflow stamps Fluent build tags, signs and renames the Fluent Dev DMG, and publishes the Fluent Dev prerelease asset with the updated download link and filename.
Release workflow and updater
.github/workflows/release.yml, Sources/UpdateManager.swift
The main release workflow and UpdateManager switch to the Fluent build tag, Fluent release feed, Fluent DMG names, and Fluent staging/update directories.
Product docs and changelog
CHANGELOG.md, README.md
The changelog and README are rewritten around the Fluent rebrand, the 1.2.0 notes, local model setup, timeout defaults, and updated feature/privacy text.
Website copy and metadata
website/README.md, website/index.html, website/llms.txt, website/robots.txt, website/sitemap.xml
The website README, landing page, llms text, robots, and sitemap now reference Fluent branding, Fluent repo links, Fluent release assets, and the updated stars widget source.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐇 I hop through Fluent fields tonight,
With build tags shining clear and bright.
The DMG jingles, docs take flight,
And release notes glow in carrot light.
Hop hop — Fluent feels just right!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: project-wide rebranding from FreeFlow to Fluent plus updated efficiency documentation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch rename-to-fluent

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Sources/KeychainStorage.swift (1)

5-15: 🗄️ Data Integrity & Integration | 🟠 Major

Add a migration from the old FreeFlow identity

  • AppName.displayName now resolves to Fluent, so the settings file moves from Application Support/FreeFlow/.settings to Application Support/Fluent/.settings.
  • migrateFromKeychainIfNeeded only reads the current bundle ID (com.inhaq.fluent), so existing keychain items under com.zachlatta.freeflow are never picked up.
  • Add a first-launch migration for the legacy settings path and keychain service, or in-place upgrades will lose saved API keys/preferences.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Sources/KeychainStorage.swift` around lines 5 - 15, The storage migration is
incomplete because KeychainStorage now uses the Fluent app name and current
bundle ID, but existing FreeFlow settings and keychain items are still left
behind. Update the startup/migration flow in KeychainStorage and
migrateFromKeychainIfNeeded to detect and import legacy data from the old
Application Support/FreeFlow settings location and the old keychain service
identifier com.zachlatta.freeflow before switching to the new
AppName.displayName and bundleID values. Make this a first-launch or upgrade
migration so saved API keys and preferences are preserved in place.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/skills/fluent-release/scripts/fluent-release-check.sh:
- Around line 50-67: The release check script is using a predictable temporary
path for changelog output, which can be raced or pre-created by another local
process. Update the logic around the changelog extraction in the fluent-release
check flow to create and use a unique temp file per run, then reuse that same
generated path for the emptiness and heading checks as well as the final cat
output. Keep the existing validation behavior in the script’s changelog handling
block, but avoid any hardcoded shared temp filename.

In `@README.md`:
- Line 43: The quick-start link text in the README is vague and should be made
descriptive for accessibility and searchability. Update the download CTA in the
README content where the Fluent.dmg link is referenced so it clearly describes
what is being downloaded, using the existing link target but replacing the
generic “click here” text with meaningful wording.
- Around line 58-60: The privacy section overstates network behavior by saying
the only outbound traffic is transcription and LLM API calls, but update
checking via UpdateManager also makes GitHub release requests. Soften the
wording in README.md to scope the claim to user content or explicitly mention
update-related traffic, and apply the same revised phrasing in the website copy
so the privacy message is consistent.

In `@website/index.html`:
- Around line 986-988: The “Custom cleanup” card currently links to the
repository top-level README instead of the actual prompt section. Update the
anchor in the card markup within the related HTML snippet so it points directly
to the “Custom Cleanup” section anchor in the README, using the existing card
text and link element as the place to fix it.

---

Outside diff comments:
In `@Sources/KeychainStorage.swift`:
- Around line 5-15: The storage migration is incomplete because KeychainStorage
now uses the Fluent app name and current bundle ID, but existing FreeFlow
settings and keychain items are still left behind. Update the startup/migration
flow in KeychainStorage and migrateFromKeychainIfNeeded to detect and import
legacy data from the old Application Support/FreeFlow settings location and the
old keychain service identifier com.zachlatta.freeflow before switching to the
new AppName.displayName and bundleID values. Make this a first-launch or upgrade
migration so saved API keys and preferences are preserved in place.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a0db9ad5-90fc-4875-a710-f55bb36a919a

📥 Commits

Reviewing files that changed from the base of the PR and between 9408117 and 2922ee9.

📒 Files selected for processing (30)
  • .agents/skills/fluent-release/SKILL.md
  • .agents/skills/fluent-release/agents/openai.yaml
  • .agents/skills/fluent-release/scripts/fluent-release-check.sh
  • .agents/skills/freeflow-release/agents/openai.yaml
  • .github/workflows/dev-release.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • Fluent.entitlements
  • Info.plist
  • Makefile
  • README.md
  • Sources/App.swift
  • Sources/AppName.swift
  • Sources/AppState.swift
  • Sources/AudioRecorder.swift
  • Sources/GlobalShortcutBackend.swift
  • Sources/KeychainStorage.swift
  • Sources/NetworkMonitor.swift
  • Sources/PipelineSignpost.swift
  • Sources/RealtimeTranscriptionService.swift
  • Sources/SettingsView.swift
  • Sources/StreamingMultipartBody.swift
  • Sources/TestCaseExporter.swift
  • Sources/TranscriptionService.swift
  • Sources/UpdateManager.swift
  • website/README.md
  • website/index.html
  • website/llms.txt
  • website/robots.txt
  • website/sitemap.xml
💤 Files with no reviewable changes (1)
  • .agents/skills/freeflow-release/agents/openai.yaml

Comment on lines +50 to +67
if ! .github/scripts/changelog-section.sh "$version" >/tmp/fluent-release-notes.md; then
echo "Could not extract CHANGELOG.md section for $version" >&2
exit 1
fi

if [[ ! -s /tmp/freeflow-release-notes.md ]]; then
if [[ ! -s /tmp/fluent-release-notes.md ]]; then
echo "Extracted changelog section is empty for $version" >&2
exit 1
fi

if ! grep -q "^## \\[$version\\]" /tmp/freeflow-release-notes.md; then
if ! grep -q "^## \\[$version\\]" /tmp/fluent-release-notes.md; then
echo "Extracted changelog section has an unexpected heading." >&2
exit 1
fi

echo "Release checks passed for $tag"
echo
cat /tmp/freeflow-release-notes.md
cat /tmp/fluent-release-notes.md

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Use a unique temp file here.

/tmp/fluent-release-notes.md is predictable, so another local process can pre-create or symlink it and race this checker. That can corrupt the release precheck on shared machines.

🔧 Suggested fix
+tmp_notes="$(mktemp)"
+trap 'rm -f "$tmp_notes"' EXIT
🧰 Tools
🪛 ast-grep (0.44.0)

[warning] 59-59: Writing to or reading from a hardcoded, predictable path under /tmp is vulnerable to symlink and TOCTOU attacks: a local attacker can pre-create the file (or a symlink pointing elsewhere) and hijack or corrupt the contents. Generate a unique, unpredictable temporary file with mktemp instead, e.g. tmpfile="$(mktemp)" (or mktemp -d for directories) and reference "$tmpfile".
Context: /tmp/fluent-release-notes.md
Note: [CWE-377] Insecure Temporary File.

(predictable-tmp-file-bash)


[warning] 66-66: Writing to or reading from a hardcoded, predictable path under /tmp is vulnerable to symlink and TOCTOU attacks: a local attacker can pre-create the file (or a symlink pointing elsewhere) and hijack or corrupt the contents. Generate a unique, unpredictable temporary file with mktemp instead, e.g. tmpfile="$(mktemp)" (or mktemp -d for directories) and reference "$tmpfile".
Context: /tmp/fluent-release-notes.md
Note: [CWE-377] Insecure Temporary File.

(predictable-tmp-file-bash)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/fluent-release/scripts/fluent-release-check.sh around lines
50 - 67, The release check script is using a predictable temporary path for
changelog output, which can be raced or pre-created by another local process.
Update the logic around the changelog extraction in the fluent-release check
flow to create and use a unique temp file per run, then reuse that same
generated path for the emptiness and heading checks as well as the final cat
output. Keep the existing validation behavior in the script’s changelog handling
block, but avoid any hardcoded shared temp filename.

Source: Linters/SAST tools

Comment thread README.md
## Quick Start

1. Download the app from above or [click here](https://github.com/zachlatta/freeflow/releases/latest/download/FreeFlow.dmg)
1. Download the app from above or [click here](https://github.com/inhaq/fluent/releases/latest/download/Fluent.dmg)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use descriptive quick-start link text.

click here is vague for screen readers and search indexing; make the CTA describe the download target instead.

Suggested fix
-1. Download the app from above or [click here](https://github.com/inhaq/fluent/releases/latest/download/Fluent.dmg)
+1. Download the app from above or [download Fluent.dmg](https://github.com/inhaq/fluent/releases/latest/download/Fluent.dmg)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
1. Download the app from above or [click here](https://github.com/inhaq/fluent/releases/latest/download/Fluent.dmg)
1. Download the app from above or [download Fluent.dmg](https://github.com/inhaq/fluent/releases/latest/download/Fluent.dmg)
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 43-43: Link text should be descriptive

(MD059, descriptive-link-text)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 43, The quick-start link text in the README is vague and
should be made descriptive for accessibility and searchability. Update the
download CTA in the README content where the Fluent.dmg link is referenced so it
clearly describes what is being downloaded, using the existing link target but
replacing the generic “click here” text with meaningful wording.

Source: Linters/SAST tools

Comment thread README.md
Comment on lines 58 to +60
## Privacy

There is no FreeFlow server, so FreeFlow does not store or retain your data. The only information that leaves your computer are API calls to your configured transcription and LLM provider.
There is no Fluent server, so Fluent does not store or retain your data. The only information that leaves your computer are API calls to your configured transcription and LLM provider.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Narrow the privacy claim.

Sources/UpdateManager.swift still makes GitHub release requests for update checks, so “the only information that leaves your computer” overstates the app’s network behavior. Please scope this to user content or mention update traffic explicitly, and mirror the softened wording in the website copy too.

Suggested fix
-There is no Fluent server, so Fluent does not store or retain your data. The only information that leaves your computer are API calls to your configured transcription and LLM provider.
+There is no Fluent server, so Fluent does not store or retain your data. Fluent also makes update-check requests, and user content only leaves your computer via your configured transcription and LLM provider.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
## Privacy
There is no FreeFlow server, so FreeFlow does not store or retain your data. The only information that leaves your computer are API calls to your configured transcription and LLM provider.
There is no Fluent server, so Fluent does not store or retain your data. The only information that leaves your computer are API calls to your configured transcription and LLM provider.
## Privacy
There is no Fluent server, so Fluent does not store or retain your data. Fluent also makes update-check requests, and user content only leaves your computer via your configured transcription and LLM provider.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 58 - 60, The privacy section overstates network
behavior by saying the only outbound traffic is transcription and LLM API calls,
but update checking via UpdateManager also makes GitHub release requests. Soften
the wording in README.md to scope the claim to user content or explicitly
mention update-related traffic, and apply the same revised phrasing in the
website copy so the privacy message is consistent.

Comment thread website/index.html
Comment on lines 986 to +988
<div class="card-head"><span class="card-icon"><svg viewBox="0 0 36 36" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 10h26M5 18h26M5 26h26"/><circle cx="14" cy="10" r="3"/><circle cx="23" cy="18" r="3"/><circle cx="12" cy="26" r="3"/></svg></span><h3>Custom cleanup</h3></div>
<p>Prefer a more literal cleanup? Use a simpler prompt in the custom system prompt setting.</p>
<a href="https://github.com/zachlatta/freeflow#readme">View simple prompt →</a>
<a href="https://github.com/inhaq/fluent#readme">View simple prompt →</a>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Point the card at the prompt section.

#readme only lands on the repo page top, so users still have to hunt for the custom-cleanup prompt. Link directly to the Custom Cleanup anchor.

Suggested fix
-<a href="https://github.com/inhaq/fluent#readme">View simple prompt →</a>
+<a href="https://github.com/inhaq/fluent#custom-cleanup">View simple prompt →</a>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div class="card-head"><span class="card-icon"><svg viewBox="0 0 36 36" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 10h26M5 18h26M5 26h26"/><circle cx="14" cy="10" r="3"/><circle cx="23" cy="18" r="3"/><circle cx="12" cy="26" r="3"/></svg></span><h3>Custom cleanup</h3></div>
<p>Prefer a more literal cleanup? Use a simpler prompt in the custom system prompt setting.</p>
<a href="https://github.com/zachlatta/freeflow#readme">View simple prompt →</a>
<a href="https://github.com/inhaq/fluent#readme">View simple prompt →</a>
<div class="card-head"><span class="card-icon"><svg viewBox="0 0 36 36" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 10h26M5 18h26M5 26h26"/><circle cx="14" cy="10" r="3"/><circle cx="23" cy="18" r="3"/><circle cx="12" cy="26" r="3"/></svg></span><h3>Custom cleanup</h3></div>
<p>Prefer a more literal cleanup? Use a simpler prompt in the custom system prompt setting.</p>
<a href="https://github.com/inhaq/fluent#custom-cleanup">View simple prompt →</a>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@website/index.html` around lines 986 - 988, The “Custom cleanup” card
currently links to the repository top-level README instead of the actual prompt
section. Update the anchor in the card markup within the related HTML snippet so
it points directly to the “Custom Cleanup” section anchor in the README, using
the existing card text and link element as the place to fix it.

@inhaq inhaq merged commit 1863b1e into main Jun 26, 2026
2 checks passed
@inhaq inhaq deleted the rename-to-fluent branch June 26, 2026 06:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant