Skip to content
wandeln_

Plugins

Plugins are script extensions that add commands to the palette or items to the top bar. Just drop a folder in place.

  • Directory%APPDATA%/dev.wandeln.app/
    • Directoryplugins/
      • Directorytranslate/
        • plugin.json
        • tr.py
      • Directoryuptime/
        • plugin.json
        • uptime.ps1

The full path is %APPDATA%\dev.wandeln.app\plugins\<plugin name>\plugin.json. Create one folder per plugin and put plugin.json and your script inside.

Open it from Settings › Plugins (プラグイン) › Open folder (フォルダを開く) (it’s created if missing). After adding or changing a plugin, reopen the palette or click Reload (再読み込み) in settings.

plugin.json
{
"name": "Translate",
"type": "palette",
"keyword": "tr",
"command": "tr.py",
"description": "optional"
}
Key Required Description
name ✓ Name shown in the palette and settings
type "palette" (default) or "bar"
keyword If set, a search plugin; if omitted, a one-shot command
command ✓ Script inside the plugin folder
description Description
interval bar only: refresh interval in seconds. Default 60, minimum 2

Supported scripts: .ps1 (PowerShell), .bat / .cmd, .exe, .py (needs python on PATH), .js (needs node on PATH). The working directory is the plugin folder. No console window is shown. .ps1 files can contain Japanese and emoji whether saved as UTF-8 (with or without BOM) or Shift-JIS.

Search for the plugin’s name in the palette. Enter runs it with no arguments. Output is ignored.

Type keyword + space + text in the palette. The script runs and its results are listed.

  • The text is passed both as the first argument and in the WANDELN_QUERY environment variable.
  • Scripts that don’t finish within 5 seconds are stopped.
  • Write stdout as UTF-8 (.ps1 is UTF-8 automatically; .py gets PYTHONIOENCODING=utf-8).

Output format:

{
"items": [
{ "title": "Display name", "subtitle": "Detail (optional)", "action": { "type": "copy", "value": "Text to copy" } }
]
}
action.type On Enter
copy Copy value to the clipboard
open Open value (URL / file / folder)
run Run the same script with value as the first argument (output ignored)

If the output isn’t JSON, each line becomes a copy item.

plugins\hello\plugin.json
{ "name": "Create a note on the desktop", "command": "hello.ps1" }
plugins\hello\hello.ps1
$desktop = [Environment]::GetFolderPath("Desktop")
$file = Join-Path $desktop ("memo-" + (Get-Date -Format "yyyyMMdd-HHmmss") + ".txt")
Set-Content -Path $file -Value "Created from Wandeln" -Encoding UTF8
Start-Process notepad $file
plugins\case\plugin.json
{ "name": "Change case", "keyword": "case", "command": "case.py" }
plugins\case\case.py
import json, sys
text = sys.argv[1] if len(sys.argv) > 1 else ""
items = []
if text:
for label, value in [("UPPERCASE", text.upper()), ("lowercase", text.lower()), ("Title Case", text.title())]:
items.append({"title": value, "subtitle": label, "action": {"type": "copy", "value": value}})
print(json.dumps({"items": items}, ensure_ascii=False))

Type case hello world in the palette to see the results.

Items shown on the top bar. Drop one in and click Reload, and it appears in the widget list under Settings › Bar (バー) (right zone, disabled) with the plugin’s name. Enable and place it like any other widget.

The script runs with no arguments every interval seconds and its stdout is shown (stopped after 5 seconds).

{ "text": "Text to show", "tooltip": "On hover (optional)", "action": { "type": "open", "value": "https://..." } }
  • action is the same copy / open / run as in the palette, run on click (run refreshes the item right after).
  • If the output isn’t JSON, the first line is shown and the remaining lines become the tooltip.
  • An empty text hides the item.
plugins\uptime\plugin.json
{ "name": "Uptime", "type": "bar", "command": "uptime.ps1", "interval": 60 }
plugins\uptime\uptime.ps1
$up = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
"⏱ {0}d {1}h" -f $up.Days, $up.Hours
"Time since last boot"