Doc update#101
Conversation
📝 WalkthroughWalkthroughThis PR consolidates and expands Flow Launcher documentation by adding Quick Start and keyboard-shortcuts guides, rewriting the plugin development overview, consolidating Node.js and Python plugin guides into single comprehensive files, adding a new executable plugins guide, creating a FAQ/troubleshooting resource, and updating navigation and onboarding touchpoints. Several old split documentation files are removed. ChangesDocumentation Restructuring and Expansion
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 12
🧹 Nitpick comments (1)
quickstart.md (1)
83-86: ⚡ Quick winUse consistent root-relative links in “Next steps”.
These links are relative while most docs links use
/.... Standardizing to root-relative avoids path-resolution issues across routes.Suggested link normalization
-- Browse the [Plugin Store](plugins.md) to extend Flow -- Read [Usage Tips](usage-tips.md) for power-user tricks -- Explore [Settings](settings.md) for full configuration reference -- Build your own plugin → [Plugin Development](plugin-dev.md) +- Browse the [Plugin Store](/plugins.md) to extend Flow +- Read [Usage Tips](/usage-tips.md) for power-user tricks +- Explore [Settings](/settings.md) for full configuration reference +- Build your own plugin → [Plugin Development](/plugin-dev.md)🤖 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 `@quickstart.md` around lines 83 - 86, Update the “Next steps” links to use root-relative paths to avoid route resolution issues: change the four bullets in the Next steps section (the lines linking "Plugin Store", "Usage Tips", "Settings", and "Plugin Development") from relative links like plugins.md, usage-tips.md, settings.md, plugin-dev.md to root-relative links (/plugins.md, /usage-tips.md, /settings.md, /plugin-dev.md) so they match the rest of the docs.
🤖 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 `@_sidebar.md`:
- Around line 3-8: The sidebar is missing a navigation link for the newly added
keyboard-shortcuts.md; update _sidebar.md to include a new entry labeled
"Keyboard Shortcuts" (or similar) that links to keyboard-shortcuts.md so the
page is discoverable in the docs navigation—locate the list of entries in
_sidebar.md (the existing Quick Start, Settings, File Manager, Usage Tips,
Support, FAQ entries) and insert the new "Keyboard Shortcuts" link alongside
them in the same format.
In `@develop-dotnet-plugins.md`:
- Line 11: Replace generic link text "here" in occurrences like 'Find our API
Reference [here](/API-Reference/Flow.Launcher.Plugin.md)' with descriptive link
text (e.g., 'Flow.Launcher.Plugin API Reference') so the link reads something
like 'Find our API Reference: Flow.Launcher.Plugin API Reference' and do the
same for the second occurrence; search for the exact link target
'/API-Reference/Flow.Launcher.Plugin.md' to locate both instances and update the
link text to a descriptive phrase for improved accessibility and scanability.
In `@executable-develop-plugins.md`:
- Around line 324-330: Two fenced code blocks are missing language labels (the
block with the directory tree "MyPlugin/ … icon.png" and the block with the
Windows path "%APPDATA%\FlowLauncher\Plugins\MyPlugin\"); label the first block
as "text" (or "bash" if preferred) and the second as "powershell" (or "text") to
silence MD040 warnings by updating the opening fences for those code blocks so
they read ```text and ```powershell respectively.
In `@installation.md`:
- Line 7: Update the sentence that currently reads "Flow version 2.0" to
explicitly reference the product and version range by replacing it with "Flow
Launcher v2.0+" so the minimum requirement is unambiguous; edit the line
containing "Note that as of Flow version 2.0, Windows 10 is the minimum
requirement." to read "Note that as of Flow Launcher v2.0+, Windows 10 is the
minimum requirement."
In `@plugin-dev.md`:
- Around line 23-37: The two unlabeled fenced code blocks in plugin-dev.md (the
ASCII flow diagram block starting with "User types query" and the file-tree
block starting with "MyPlugin/") violate MD040; update each triple-backtick
fence to include a language tag (use "text") so they read ```text, ensuring both
the diagram block and the file-tree block are explicitly labeled and the
markdown linter will pass.
In `@plugin-explorer.md`:
- Line 40: Update the text "Completely exit out of Everything (right click the
Everything system tray icon and click Exit)" to use the hyphenated form
"right-click" so it reads "Completely exit out of Everything (right-click the
Everything system tray icon and click Exit)"; locate and replace the exact
phrase "right click" in the markdown line to preserve the rest of the sentence.
- Around line 38-47: The documentation currently contradicts itself by saying
"Flow Launcher does not support Everything 1.5 alpha" while later providing
setup steps using Everything-1.5a.ini and alpha_instance=0; update the page so
both statements align by choosing one approach and clarifying it: either change
the earlier sentence to "Flow Launcher does not officially support Everything
1.5 alpha, but the following workaround (edit Everything-1.5a.ini and set
alpha_instance=0) can enable partial compatibility with caveats" or remove the
workaround and keep the unsupported statement, and ensure references to
"Everything 1.5 alpha", "Everything-1.5a.ini", and "alpha_instance=0" are
updated to reflect that decision.
In `@README.md`:
- Line 9: Replace the awkward phrase "world-wide team of productivity passionate
volunteers" with a clearer compound adjective; update the sentence to read
something like "worldwide team of productivity-passionate volunteers" so the
modifier is hyphenated and "worldwide" uses standard spelling, preserving the
original meaning and tone.
- Line 5: Update the README sentence that reads "community created
[**Plugins**](/plugins.md)" to use a hyphenated compound adjective: change it to
"community-created [**Plugins**](/plugins.md)"; locate this phrase in the
README.md content where the Quick Start/Support/Plugins sentence appears and
replace the unhyphenated form with the hyphenated "community-created".
- Line 5: Replace the typo/awkward phrasing in the README sentence that
currently reads "and the dive into more detail" by changing it to "then dive
into more detail" so the onboarding sentence reads smoothly: "Start with the
Quick Start guide for your first steps, then dive into more detail from there."
Locate and update the exact sentence text in the README.md content block.
In `@usage-tips.md`:
- Line 24: Update the incomplete sentence in usage-tips.md: modify the line that
mentions pressing `Ctrl + Backspace` while in the query window and searching a
directory so it reads "press `Ctrl + Backspace` to go back one level in the
directory tree" (ensure the phrase "to go back" is added so the sentence is
grammatically complete and retains the `Ctrl + Backspace` key reference).
- Line 4: Split the long sentence that begins "Flow is published as a
self-contained app..." into two or more shorter sentences for clarity and change
"trade off" to the hyphenated noun "trade-off"; e.g., keep the first sentence
explaining the self-contained and portable mode behavior, add a second sentence
that states the trade-off and uses "trade-off is slightly bigger (around 250 MB)
because it bundles the required .NET components together." Refer to the exact
sentence starting "Flow is published as a self-contained app..." to apply this
change.
---
Nitpick comments:
In `@quickstart.md`:
- Around line 83-86: Update the “Next steps” links to use root-relative paths to
avoid route resolution issues: change the four bullets in the Next steps section
(the lines linking "Plugin Store", "Usage Tips", "Settings", and "Plugin
Development") from relative links like plugins.md, usage-tips.md, settings.md,
plugin-dev.md to root-relative links (/plugins.md, /usage-tips.md, /settings.md,
/plugin-dev.md) so they match the rest of the docs.
🪄 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
Run ID: cb7d99c7-eb1d-4a0b-899d-340ae7051142
📒 Files selected for processing (11)
README.md_sidebar.mddevelop-dotnet-plugins.mdexecutable-develop-plugins.mdfaq.mdinstallation.mdkeyboard-shortcuts.mdplugin-dev.mdplugin-explorer.mdquickstart.mdusage-tips.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
There was a problem hiding this comment.
♻️ Duplicate comments (1)
README.md (1)
5-5:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winFix the onboarding sentence grammar.
Line 5 still reads “and the dive into more detail,” which is grammatically incorrect; “then dive into more detail” fits the sentence.
Suggested patch
-Start with the [**Quick Start**](/quickstart.md) guide for your first steps, and the dive into more detail from there. Any issues, check out the [**Support**](/support.md) page to see where you can go to get help. Browse the many community-created [**Plugins**](/plugins.md) to extend Flow to do just about anything. +Start with the [**Quick Start**](/quickstart.md) guide for your first steps, then dive into more detail from there. Any issues, check out the [**Support**](/support.md) page to see where you can go to get help. Browse the many community-created [**Plugins**](/plugins.md) to extend Flow to do just about anything.🤖 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 5, Replace the incorrect phrase "and the dive into more detail" in the onboarding sentence with "then dive into more detail" so the line reads: "Start with the Quick Start guide for your first steps, then dive into more detail from there." Locate this sentence in README.md and update the wording accordingly.
🤖 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.
Duplicate comments:
In `@README.md`:
- Line 5: Replace the incorrect phrase "and the dive into more detail" in the
onboarding sentence with "then dive into more detail" so the line reads: "Start
with the Quick Start guide for your first steps, then dive into more detail from
there." Locate this sentence in README.md and update the wording accordingly.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 4266ff85-7673-4036-b31b-d166121338d1
📒 Files selected for processing (8)
README.md_sidebar.mddevelop-dotnet-plugins.mdexecutable-develop-plugins.mdinstallation.mdplugin-dev.mdplugin-explorer.mdusage-tips.md
✅ Files skipped from review due to trivial changes (6)
- installation.md
- _sidebar.md
- plugin-explorer.md
- executable-develop-plugins.md
- plugin-dev.md
- usage-tips.md
There was a problem hiding this comment.
Remove the mentions of merging Explorer and Everything plugin- no longer relevant now.
|
Not sure of what the scope of this PR is - theres plenty room for more to add I think but maybe best left for later or a seperate PR I'm not sure if the ? tip and the plugin manager commands should be under keyboard shortcuts The ? tip specifically already appears under Usage Tips > Plugins I do like the formatting of the Keyboard Shortcuts section more than the existing usage tips - so maybe best to break that up - seperating out Keyboard shortcuts, Useful Commands, and Other Tips, or something like that? |
|
Agree, maybe @deefrawley can define the scope, happy for the other improvements be in separate PR/s |
| - **Title / SubTitle** — what the user sees | ||
| - **IcoPath** — path to an icon (relative to your plugin folder) | ||
| - **Score** — influences result ordering (higher = ranked higher) | ||
| - **JsonRPCAction** — what happens when the user selects this result |
There was a problem hiding this comment.
In C# its just Action instead of JsonRPCAction, and in general looks quite different
Perhaps we could add a note explaining at least that this is different in C#
Or just have a seperate section for it from the JsonRPC ones?
There was a problem hiding this comment.
@DavidGBrett can you suggest an edit here as I'm not a C# dev so not sure how to improve this?
| MyPlugin/ | ||
| ├── plugin.json ← required: plugin metadata | ||
| ├── main.py ← your entry point (language-dependent name) | ||
| ├── SettingsTemplate.yaml ← optional: defines settings shown in Flow's UI |
There was a problem hiding this comment.
Is this specific only to python? at least myself I've never seen or used a file like that working on C# plugins - runs the risk of people thinking they've missed something
There was a problem hiding this comment.
This example is Python specific so perhaps we need a structure per language or at least some general form to cover them all?
|
|
||
| For example: | ||
| - `g <query>` → Google search | ||
| - `wt` → open Windows Terminal |
There was a problem hiding this comment.
are these real plugin keywords?
I think we should only use examples from the built in ones
| | Set a plugin's action keyword | Plugins → [plugin name] → Action Keyword | | ||
| | Prioritise a plugin's results | Plugins → [plugin name] → Priority | | ||
|
|
||
| ## Useful things you might not discover on your own |
There was a problem hiding this comment.
This section is again repeating stuff from usage tips and keyboard shortcuts
Once those are reworked maybe we can just link to them?
There was a problem hiding this comment.
We should probably also mention the Hotkeys tab in the settings window as somewhere the user can look for a full list.
Though the different names of Hotkeys and Keyboard Shortcuts could be confusing again.
I find Keyboard Shortcuts to be more clear but Hotkeys is already established so hard to change.
There was a problem hiding this comment.
We can also use
https://github.com/Flow-Launcher/Flow.Launcher#%EF%B8%8F-hotkeys from the readme as a reference
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
develop-executable-plugins.md (1)
214-221:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winFix incorrect parameter unmarshaling in Go example.
Line 216 incorrectly unmarshals the query parameter into a
[]stringslice, but according to the JSON-RPC protocol (line 76), thequerymethod receives a single string asparameters[0], not an array.🐛 Proposed fix
switch req.Method { case "query": - var params []string - json.Unmarshal(req.Parameters[0], ¶ms) - query := "" - if len(params) > 0 { - query = params[0] - } + var query string + if len(req.Parameters) > 0 { + json.Unmarshal(req.Parameters[0], &query) + } resp = handleQuery(query)🤖 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 `@develop-executable-plugins.md` around lines 214 - 221, The code in the "query" case incorrectly unmarshals req.Parameters[0] into a []string; change it to unmarshal directly into a single string variable (e.g., "query") instead of "params", remove the slice length check, and pass that string to handleQuery; update the json.Unmarshal call to decode into &query and use that query variable when calling handleQuery to match the JSON-RPC protocol expectation.plugin-explorer.md (1)
64-64:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winFix typo: "maye" should be "may".
🔤 Proposed fix
-- Adding a directory here will exclude it from the Flow Launcher search, over-riding any settings you maye have in Windows Indexing or Everything. +- Adding a directory here will exclude it from the Flow Launcher search, over-riding any settings you may have in Windows Indexing or Everything.🤖 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 `@plugin-explorer.md` at line 64, Update the typo in the documentation sentence string "Adding a directory here will exclude it from the Flow Launcher search, over-riding any settings you maye have in Windows Indexing or Everything." by replacing "maye" with "may" so it reads "...any settings you may have in Windows Indexing or Everything."; ensure the corrected sentence is saved in plugin-explorer.md.
🧹 Nitpick comments (3)
develop-python-plugins.md (1)
172-176: ⚡ Quick winConsider using consistent sys.path setup approach.
This example uses
os.pathwhile the earlier example (lines 22-29) usespathlib. Having two different approaches in the same guide may confuse readers.♻️ Suggested consolidation using pathlib (matches earlier example)
-import sys,os -parent_folder_path = os.path.abspath(os.path.dirname(__file__)) -sys.path.append(parent_folder_path) -sys.path.append(os.path.join(parent_folder_path, 'lib')) -sys.path.append(os.path.join(parent_folder_path, 'plugin')) +import sys +from pathlib import Path + +plugindir = Path.absolute(Path(__file__).parent) +paths = (".", "lib", "plugin") +sys.path = [str(plugindir / p) for p in paths] + sys.path🤖 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 `@develop-python-plugins.md` around lines 172 - 176, The snippet mixes os.path with earlier pathlib usage; replace the os.path-based setup (variables like parent_folder_path and calls to sys.path.append(os.path.join(...)) and sys.path.append(parent_folder_path)) with the same pathlib-based pattern used earlier in the doc: derive the current file parent via Path(__file__).resolve().parent and append str(parent) and str(parent / "lib") and str(parent / "plugin") to sys.path so the approach is consistent across the guide.develop-nodejs-plugins.md (1)
106-106: 💤 Low valueConsider using forward slashes for cross-platform compatibility.
While backslashes work on Windows, forward slashes don't require escaping in JSON and work across all platforms.
♻️ Suggested change
- "IcoPath": "Images\\app.png", + "IcoPath": "Images/app.png",🤖 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 `@develop-nodejs-plugins.md` at line 106, The JSON value for the "IcoPath" key uses Windows backslashes ("Images\\app.png") which require escaping and hurt cross-platform compatibility; update the value to use forward slashes ("Images/app.png") so the path is valid JSON and works on all platforms, locating the change at the "IcoPath" property in the document.plugin-explorer.md (1)
3-3: 💤 Low valueConsider hyphenating "third-party" when used as a compound adjective.
The phrase "third party tool" should be "third-party tool" when the compound adjective appears before a noun.
📝 Suggested fix
-The Explorer plugin is a default plugin that installs with Flow Launcher and is used to search for files and folders on your filesystem. You can now choose which search engine will search for what type of item through Flow. You can use the built-in Windows Search Index which is default and is part of the Windows operating system or you can use a popular third party tool called Everything from the company Voidtools. Everything tends to be a faster search and offers more search options than Windows Index however you do need to download and install it to use it. If you don't already have the Everything search tool from Voidtools installed, Flow will automatically download and install it if you choose it as your search index engine. To trigger automatic install, fire a search and click the "Warning: Everything is not running" result. +The Explorer plugin is a default plugin that installs with Flow Launcher and is used to search for files and folders on your filesystem. You can now choose which search engine will search for what type of item through Flow. You can use the built-in Windows Search Index which is default and is part of the Windows operating system or you can use a popular third-party tool called Everything from the company Voidtools. Everything tends to be a faster search and offers more search options than Windows Index however you do need to download and install it to use it. If you don't already have the Everything search tool from Voidtools installed, Flow will automatically download and install it if you choose it as your search index engine. To trigger automatic install, fire a search and click the "Warning: Everything is not running" result.🤖 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 `@plugin-explorer.md` at line 3, The phrase "third party tool" in the sentence describing Everything should be hyphenated when used as a compound adjective; change the fragment "popular third party tool" to "popular third-party tool" (refer to the string containing "Everything from the company Voidtools" and "popular third party tool") to correct the compound adjective formatting.
🤖 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 `@develop-executable-plugins.md`:
- Line 21: Edit the sentence in develop-executable-plugins.md that mentions
“JsonRPC v2 (for v1 it runs when called and then exits)” to either (A) expand
and document what “v1” vs “v2” means and whether executable plugins support both
modes—add a short note referencing json-rpc.md and describe the lifetime/IO
differences for the plugin process—or (B) if v1 is not supported or is
irrelevant, remove the “v1” clause and simplify the sentence to state that
executable plugins must run as a long‑lived process that reads stdin in a loop
and writes responses to stdout; update the surrounding sentence in
develop-executable-plugins.md accordingly to keep the doc consistent with
json-rpc.md.
In `@develop-nodejs-plugins.md`:
- Around line 91-121: In the JSON returned when method === "query" (the object
logged inside the console.log call), fix the field name casing to match Flow's
schema by renaming "Subtitle" to "SubTitle" and "score" to "Score" in the result
object literal; update the keys in that returned item so Flow can parse/render
it correctly (no other logic changes needed).
- Line 16: Update the Node.js version mention and download URL where the string
"node-v16.18.0-win-x64.zip" appears: replace the hardcoded v16.18.0 reference
with the current LTS (v24.16.0 as of May 2026) or change the wording and link to
refer to the "latest LTS" (e.g., the Node.js latest LTS download or the
latest-v24.x alias) so the text and hyperlink both point to a supported LTS
release rather than the End-of-Life v16.18.0.
In `@develop-python-plugins.md`:
- Around line 47-61: In the query(self, query) function the dict returned has a
missing comma after the "ContextData" entry which causes a syntax error; add a
trailing comma after the "ContextData": ["foo", "bar"] line so the
"JsonRPCAction" key/value pair is correctly separated and the function (query)
returns a valid dictionary containing "Title", "SubTitle", "IcoPath",
"ContextData", and "JsonRPCAction".
- Around line 171-218: The example's returned dict keys in HelloWorld.query and
HelloWorld.context_menu use wrong casing; update the top-level result fields to
PascalCase so Flow can parse them: change "title" -> "Title", "subTitle" ->
"SubTitle", "icoPath" -> "IcoPath", "jsonRPCAction" -> "JsonRPCAction" and
"score" -> "Score" in the dicts returned by the query and context_menu methods
(keep the inner JsonRPCAction payload keys as-is if your schema expects them).
Ensure both HelloWorld.query and HelloWorld.context_menu are updated
consistently.
---
Outside diff comments:
In `@develop-executable-plugins.md`:
- Around line 214-221: The code in the "query" case incorrectly unmarshals
req.Parameters[0] into a []string; change it to unmarshal directly into a single
string variable (e.g., "query") instead of "params", remove the slice length
check, and pass that string to handleQuery; update the json.Unmarshal call to
decode into &query and use that query variable when calling handleQuery to match
the JSON-RPC protocol expectation.
In `@plugin-explorer.md`:
- Line 64: Update the typo in the documentation sentence string "Adding a
directory here will exclude it from the Flow Launcher search, over-riding any
settings you maye have in Windows Indexing or Everything." by replacing "maye"
with "may" so it reads "...any settings you may have in Windows Indexing or
Everything."; ensure the corrected sentence is saved in plugin-explorer.md.
---
Nitpick comments:
In `@develop-nodejs-plugins.md`:
- Line 106: The JSON value for the "IcoPath" key uses Windows backslashes
("Images\\app.png") which require escaping and hurt cross-platform
compatibility; update the value to use forward slashes ("Images/app.png") so the
path is valid JSON and works on all platforms, locating the change at the
"IcoPath" property in the document.
In `@develop-python-plugins.md`:
- Around line 172-176: The snippet mixes os.path with earlier pathlib usage;
replace the os.path-based setup (variables like parent_folder_path and calls to
sys.path.append(os.path.join(...)) and sys.path.append(parent_folder_path)) with
the same pathlib-based pattern used earlier in the doc: derive the current file
parent via Path(__file__).resolve().parent and append str(parent) and str(parent
/ "lib") and str(parent / "plugin") to sys.path so the approach is consistent
across the guide.
In `@plugin-explorer.md`:
- Line 3: The phrase "third party tool" in the sentence describing Everything
should be hyphenated when used as a compound adjective; change the fragment
"popular third party tool" to "popular third-party tool" (refer to the string
containing "Everything from the company Voidtools" and "popular third party
tool") to correct the compound adjective formatting.
🪄 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
Run ID: d1c4628d-9f8f-4582-a1a6-5aafd0b4e053
📒 Files selected for processing (18)
develop-executable-plugins.mddevelop-nodejs-plugins.mddevelop-python-plugins.mdfaq.mdkeyboard-shortcuts.mdnodejs-develop-plugins.mdnodejs-plugin-references.mdnodejs-release-project.mdnodejs-setup-project.mdnodejs-write-code.mdplugin-dev.mdplugin-explorer.mdpy-develop-plugins.mdpy-plugin-references.mdpy-release-project.mdpy-setup-project.mdpy-write-code.mdquickstart.md
💤 Files with no reviewable changes (10)
- py-write-code.md
- py-setup-project.md
- py-release-project.md
- nodejs-write-code.md
- py-plugin-references.md
- nodejs-develop-plugins.md
- py-develop-plugins.md
- nodejs-release-project.md
- nodejs-plugin-references.md
- nodejs-setup-project.md
✅ Files skipped from review due to trivial changes (3)
- quickstart.md
- plugin-dev.md
- keyboard-shortcuts.md
🚧 Files skipped from review as they are similar to previous changes (1)
- faq.md
| 3. Reads the JSON-RPC response from the process's **stdout** | ||
| 4. Renders the returned results | ||
|
|
||
| Your process stays alive for the lifetime of the Flow session with JsonRPC v2 (for v1 it runs when called and then exits). It must read from stdin in a loop and write responses to stdout. |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Search for other references to JSON-RPC versioning
rg -n -C3 'JSON.?RPC.*v[12]|version.*JSON.?RPC' --type=mdRepository: Flow-Launcher/docs
Length of output: 44
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Matches for JsonRPC / JSON-RPC across repo =="
rg -n --hidden --no-ignore -S 'JsonRPC|JSON-RPC' .
echo
echo "== Nearby context in develop-executable-plugins.md (around line 21) =="
FILE='develop-executable-plugins.md'
# Print ~15 lines around the target line
nl -ba "$FILE" | sed -n '10,35p'Repository: Flow-Launcher/docs
Length of output: 5150
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE='develop-executable-plugins.md'
echo "== Context around $FILE: lines 15-30 =="
awk 'NR>=15 && NR<=30 {printf "%d\t%s\n", NR, $0}' "$FILE"
echo
echo "== Searches for JSON-RPC v1/v2 wording (all file types) =="
rg -n --hidden --no-ignore -S 'JsonRPC v[12]|JSON-RPC v[12]|json-rpc v[12]|JSONRPC v[12]|v[12].*JSON-RPC|JSON-RPC.*v[12]' .
echo
echo "== json-rpc.md (first ~120 lines) =="
FILE2='json-rpc.md'
[ -f "$FILE2" ] && awk 'NR<=120 {printf "%d\t%s\n", NR, $0}' "$FILE2" || echo "Missing $FILE2"Repository: Flow-Launcher/docs
Length of output: 3649
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Any remaining JSON-RPC v1/v2 mentions (all file types) =="
rg -n --hidden --no-ignore -S 'JsonRPC v[12]|JSON-RPC v[12]|json-rpc v[12]|JSON.?RPC v[12]|v1.*JSON.?RPC|v2.*JSON.?RPC' .
echo
echo "== Search for 'v1'/'v2' specifically inside json-rpc.md and json-rpc-settings.md =="
for f in json-rpc.md json-rpc-settings.md; do
if [ -f "$f" ]; then
echo "--- $f ---"
rg -n --no-ignore -S 'v1|v2' "$f" || true
fi
done
echo
echo "== Search for 'JsonRPC v' across repo (all file types) =="
rg -n --hidden --no-ignore -S 'JsonRPC v' .Repository: Flow-Launcher/docs
Length of output: 762
Clarify or remove the “JsonRPC v2 (for v1 it runs when called and then exits)” wording
The only place that references a JSON-RPC v1 vs v2 behavior distinction is develop-executable-plugins.md line 21; json-rpc.md doesn’t explain it. Either document what “v1” vs “v2” means (and whether executable plugins support both modes), or drop the v1 phrasing and just state the required long-running stdin/stdout loop.
🤖 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 `@develop-executable-plugins.md` at line 21, Edit the sentence in
develop-executable-plugins.md that mentions “JsonRPC v2 (for v1 it runs when
called and then exits)” to either (A) expand and document what “v1” vs “v2”
means and whether executable plugins support both modes—add a short note
referencing json-rpc.md and describe the lifetime/IO differences for the plugin
process—or (B) if v1 is not supported or is irrelevant, remove the “v1” clause
and simplify the sentence to state that executable plugins must run as a
long‑lived process that reads stdin in a loop and writes responses to stdout;
update the surrounding sentence in develop-executable-plugins.md accordingly to
keep the doc consistent with json-rpc.md.
There was a problem hiding this comment.
@deefrawley I think until we add documentation for v2, let's not mention the difference.
There was a problem hiding this comment.
Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!
| ```js | ||
| const open = require('./node_modules/open'); | ||
|
|
||
| const { method, parameters, settings } = JSON.parse(process.argv[2]); | ||
|
|
||
| if (method === "query") { | ||
| console.log(JSON.stringify( | ||
| { | ||
| "result": [{ | ||
| "Title": "Hello World Typescript", | ||
| "Subtitle": "Showing your query parameters: " + parameters + ". Click to open Flow's website", | ||
| "JsonRPCAction": { | ||
| "method": "do_something_for_query", | ||
| "parameters": ["https://github.com/Flow-Launcher/Flow.Launcher"] | ||
| }, | ||
| "IcoPath": "Images\\app.png", | ||
| "score" : 0 | ||
| }] | ||
| } | ||
| )); | ||
| } | ||
|
|
||
| if (method === "do_something_for_query") { | ||
| url = parameters[0]; | ||
| do_something_for_query(url); | ||
| } | ||
|
|
||
| function do_something_for_query(url) { | ||
| open(url); | ||
| } | ||
| ``` |
There was a problem hiding this comment.
Fix JSON field name casing to match Flow's expected schema.
The result object field names must match Flow's schema exactly:
- Line 101:
"Subtitle"should be"SubTitle"(capital T) - Line 107:
"score"should be"Score"(capital S)
These inconsistencies will prevent Flow from correctly parsing and rendering the results.
🐛 Proposed fix for field name casing
"result": [{
"Title": "Hello World Typescript",
- "Subtitle": "Showing your query parameters: " + parameters + ". Click to open Flow's website",
+ "SubTitle": "Showing your query parameters: " + parameters + ". Click to open Flow's website",
"JsonRPCAction": {
"method": "do_something_for_query",
"parameters": ["https://github.com/Flow-Launcher/Flow.Launcher"]
},
"IcoPath": "Images\\app.png",
- "score" : 0
+ "Score": 0
}]📝 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.
| ```js | |
| const open = require('./node_modules/open'); | |
| const { method, parameters, settings } = JSON.parse(process.argv[2]); | |
| if (method === "query") { | |
| console.log(JSON.stringify( | |
| { | |
| "result": [{ | |
| "Title": "Hello World Typescript", | |
| "Subtitle": "Showing your query parameters: " + parameters + ". Click to open Flow's website", | |
| "JsonRPCAction": { | |
| "method": "do_something_for_query", | |
| "parameters": ["https://github.com/Flow-Launcher/Flow.Launcher"] | |
| }, | |
| "IcoPath": "Images\\app.png", | |
| "score" : 0 | |
| }] | |
| } | |
| )); | |
| } | |
| if (method === "do_something_for_query") { | |
| url = parameters[0]; | |
| do_something_for_query(url); | |
| } | |
| function do_something_for_query(url) { | |
| open(url); | |
| } | |
| ``` |
🤖 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 `@develop-nodejs-plugins.md` around lines 91 - 121, In the JSON returned when
method === "query" (the object logged inside the console.log call), fix the
field name casing to match Flow's schema by renaming "Subtitle" to "SubTitle"
and "score" to "Score" in the result object literal; update the keys in that
returned item so Flow can parse/render it correctly (no other logic changes
needed).
| ```python | ||
| def query(self, query): | ||
| return [ | ||
| { | ||
| "Title": "Hello World, this is where title goes. {}".format(('Your query is: ' + query , query)[query == '']), | ||
| "SubTitle": "This is where your subtitle goes, press enter to open Flow's url", | ||
| "IcoPath": "Images/app.png", | ||
| "ContextData": ["foo", "bar"] | ||
| "JsonRPCAction": { | ||
| "method": "open_url", | ||
| "parameters": ["https://github.com/Flow-Launcher/Flow.Launcher"] | ||
| } | ||
| } | ||
| ] | ||
| ``` |
There was a problem hiding this comment.
Fix missing comma in dictionary.
Line 54 is missing a trailing comma after the "ContextData" entry, which will cause a Python syntax error.
🐛 Proposed fix
"IcoPath": "Images/app.png",
- "ContextData": ["foo", "bar"]
+ "ContextData": ["foo", "bar"],
"JsonRPCAction": {🤖 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 `@develop-python-plugins.md` around lines 47 - 61, In the query(self, query)
function the dict returned has a missing comma after the "ContextData" entry
which causes a syntax error; add a trailing comma after the "ContextData":
["foo", "bar"] line so the "JsonRPCAction" key/value pair is correctly separated
and the function (query) returns a valid dictionary containing "Title",
"SubTitle", "IcoPath", "ContextData", and "JsonRPCAction".
| ```python | ||
| import sys,os | ||
| parent_folder_path = os.path.abspath(os.path.dirname(__file__)) | ||
| sys.path.append(parent_folder_path) | ||
| sys.path.append(os.path.join(parent_folder_path, 'lib')) | ||
| sys.path.append(os.path.join(parent_folder_path, 'plugin')) | ||
|
|
||
| from flowlauncher import FlowLauncher | ||
| import webbrowser | ||
|
|
||
|
|
||
| class HelloWorld(FlowLauncher): | ||
|
|
||
| def query(self, query): | ||
| return [ | ||
| { | ||
| "title": "Hello World, this is where title goes. {}".format(('Your query is: ' + query , query)[query == '']), | ||
| "subTitle": "This is where your subtitle goes, press enter to open Flow's url", | ||
| "icoPath": "Images/app.png", | ||
| "jsonRPCAction": { | ||
| "method": "open_url", | ||
| "parameters": ["https://github.com/Flow-Launcher/Flow.Launcher"] | ||
| }, | ||
| "score": 0 | ||
| } | ||
| ] | ||
|
|
||
| def context_menu(self, data): | ||
| return [ | ||
| { | ||
| "title": "Hello World Python's Context menu", | ||
| "subTitle": "Press enter to open Flow the plugin's repo in GitHub", | ||
| "icoPath": "Images/app.png", # related path to the image | ||
| "jsonRPCAction": { | ||
| "method": "open_url", | ||
| "parameters": ["https://github.com/Flow-Launcher/Flow.Launcher.Plugin.HelloWorldPython"] | ||
| }, | ||
| "score" : 0 | ||
| } | ||
| ] | ||
|
|
||
| def open_url(self, url): | ||
| webbrowser.open(url) | ||
|
|
||
| if __name__ == "__main__": | ||
| HelloWorld() | ||
|
|
||
| ``` |
There was a problem hiding this comment.
Fix inconsistent field name casing in the second example.
The field names in this main.py example use incorrect casing (camelCase/lowercase) instead of the required PascalCase. This contradicts:
- The first example (lines 47-61) which correctly uses
"Title","SubTitle","IcoPath","JsonRPCAction" - The schema documented in plugin-dev.md
Flow expects PascalCase field names. The current casing will prevent Flow from correctly parsing results.
🐛 Proposed fix for correct field casing
def query(self, query):
return [
{
- "title": "Hello World, this is where title goes. {}".format(('Your query is: ' + query , query)[query == '']),
- "subTitle": "This is where your subtitle goes, press enter to open Flow's url",
- "icoPath": "Images/app.png",
- "jsonRPCAction": {
+ "Title": "Hello World, this is where title goes. {}".format(('Your query is: ' + query , query)[query == '']),
+ "SubTitle": "This is where your subtitle goes, press enter to open Flow's url",
+ "IcoPath": "Images/app.png",
+ "JsonRPCAction": {
"method": "open_url",
"parameters": ["https://github.com/Flow-Launcher/Flow.Launcher"]
},
- "score": 0
+ "Score": 0
}
]
def context_menu(self, data):
return [
{
- "title": "Hello World Python's Context menu",
- "subTitle": "Press enter to open Flow the plugin's repo in GitHub",
- "icoPath": "Images/app.png", # related path to the image
- "jsonRPCAction": {
+ "Title": "Hello World Python's Context menu",
+ "SubTitle": "Press enter to open Flow the plugin's repo in GitHub",
+ "IcoPath": "Images/app.png", # related path to the image
+ "JsonRPCAction": {
"method": "open_url",
"parameters": ["https://github.com/Flow-Launcher/Flow.Launcher.Plugin.HelloWorldPython"]
},
- "score" : 0
+ "Score": 0
}
]🤖 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 `@develop-python-plugins.md` around lines 171 - 218, The example's returned
dict keys in HelloWorld.query and HelloWorld.context_menu use wrong casing;
update the top-level result fields to PascalCase so Flow can parse them: change
"title" -> "Title", "subTitle" -> "SubTitle", "icoPath" -> "IcoPath",
"jsonRPCAction" -> "JsonRPCAction" and "score" -> "Score" in the dicts returned
by the query and context_menu methods (keep the inner JsonRPCAction payload keys
as-is if your schema expects them). Ensure both HelloWorld.query and
HelloWorld.context_menu are updated consistently.
| Executable plugins let you build a Flow Launcher plugin in **any language that can produce a binary** — Go, Rust, C, compiled TypeScript, Zig, or anything else. Flow treats the executable as a subprocess and communicates with it over JSON-RPC via stdin/stdout. | ||
|
|
||
| This is a good choice when you want: | ||
| - Minimal startup latency (no interpreter to boot) |
There was a problem hiding this comment.
This probably is not worth mentioning, interpreter usage doesn't increase much latency.
|
|
||
| When a user triggers your plugin, Flow: | ||
|
|
||
| 1. Launches your executable as a subprocess |
There was a problem hiding this comment.
| 1. Launches your executable as a subprocess | |
| 1. Launches your executable as a short-lived subprocess |
| 3. Reads the JSON-RPC response from the process's **stdout** | ||
| 4. Renders the returned results | ||
|
|
||
| Your process stays alive for the lifetime of the Flow session with JsonRPC v2 (for v1 it runs when called and then exits). It must read from stdin in a loop and write responses to stdout. |
There was a problem hiding this comment.
@deefrawley I think until we add documentation for v2, let's not mention the difference.
| | `Flow.Launcher.OpenUrl` | `[url]` | Opens a URL in the default browser | | ||
| | `Flow.Launcher.OpenDirectory` | `[path]` | Opens a folder in Explorer | | ||
| | `Flow.Launcher.OpenFile` | `[path]` | Opens a file with its default app | | ||
| | `Flow.Launcher.CopyToClipboard` | `[text]` | Copies text to the clipboard | | ||
| | `Flow.Launcher.ShellRun` | `[command]` | Runs a shell command | |
There was a problem hiding this comment.
Pretty sure there are more methods that can be called right?
|
|
||
| ## Tips | ||
|
|
||
| - Typing **`?`** shows all currently active action keywords. Narrow them by typing the first character or two of the keyword you're looking for. |
There was a problem hiding this comment.
Think typing first few characters of the plugin name you are looking for?
|
|
||
| #### Minimum Requirement | ||
|
|
||
| Note that as of Flow version 2.0+, Windows 10 is the minimum requirement. |
There was a problem hiding this comment.
| Note that as of Flow version 2.0+, Windows 10 is the minimum requirement. | |
| Note that as of Flow version 2.0.0+, Windows 10 is the minimum requirement. |
| - Right-click with the mouse, or press right-arrow on the keyboard, on a result to access the context menu for additional actions. The context menu is specific to the plugin providing the result. | ||
|
|
||
| #### Plugins | ||
| - Typing `?` in the search bar will show you the keywords currently active. This can be refined by typing the first letter or two of the keywords you are after. |
There was a problem hiding this comment.
Plugin name instead of 'keywords'?
There was a problem hiding this comment.
If we delete or rename this remember to edit the main repo's readme as it links to this
https://github.com/Flow-Launcher/Flow.Launcher#%E2%80%8D%EF%B8%8F-tips
Added
Updated