Kevin3k downloadsCreate customizable button panels for quick access to files, commands, links, and scripts.
<p>[<a href="https://github.com/TracingOrigins/obsidian-buttons-panel-plugin/blob/master/README.zh.md">中文</a> | English | <a href="https://github.com/TracingOrigins/obsidian-buttons-panel-plugin/blob/master/README.ru.md">Русский</a>]</p>
<p><a href="https://community.obsidian.md/plugins/buttons-panel" target="_blank">Buttons Panel</a> is a modern Obsidian plugin that lets you create a customizable button panel for quick access to files, commands, links, and scripts.</p>
🎯 Quick Access: Instantly open files, execute commands, visit links, or run scripts with a single click.
🎨 Icon Options: Search and preview from the Lucide icon library, plus support for custom SVG icons.
🏷️ Three View Modes: Switch between list, tabbed, and folder views.
📁 Folder View: Android-style folder grid with drag-and-drop, auto-expand on hover, pin to keep open, click-to-close, and editable folder names.
📁 Category Management: Organize buttons by category; reorder categories and buttons via long-press drag-and-drop.
⚙️ Flexible Configuration: Fully customizable panel layout, button styles, and animation effects.
📱 Cross-Platform: Works on all platforms supported by Obsidian (Windows, macOS, Linux, iOS, Android).
🌙 Theme Adaptation: Seamlessly adapts to Obsidian’s light and dark themes.
🔄 Live Updates: All changes take effect immediately—no restart required.
🛡️ Form Validation: Required fields (button name, file path, command ID, URL, folder, script name) are highlighted in red if empty for intuitive feedback.
🖱️ Interaction Mode: Three modes — Locked (view only), Sort (drag to reorder), Edit (create/edit/delete via context menu) — switchable from the top navigation bar.
🧭 Top Navigation Bar: Dropdown menus to quickly switch panel view, button style, and interaction mode; plus search and settings access.
🔍 Search Feature: The navigation bar includes a search function that filters categories and buttons in real-time for quick access.
🔗 Action Sequences: Configure multiple actions for a single button and execute them in order with one click.
main.js, manifest.json, and styles.css from Releases.buttons-panel folder under your Obsidian plugins directory (e.g. YourVault/.obsidian/plugins/buttons-panel/) and place the three files inside.TracingOrigins/obsidian-buttons-panel-plugin.Want to see Buttons Panel in action? Check out the showcase vault, which includes complete configuration examples and common usage scenarios. Download it and open with Obsidian to try it out.
Use the command palette (Ctrl+P) and run "Open buttons panel", or click the ribbon icon to quickly open the panel.
Click the settings button in the navigation bar, or go to Settings → Community Plugins → Buttons Panel.
templates/). The create file action uses templates from this path.scripts/). The run script action loads scripts from this path.{{DATE:YYYY-MM-DD}}), and content can use a fixed template.You can paste custom SVG code as button icons. Here are some recommended online icon libraries:
Tips:
fill to currentColor: After copying the SVG, change fill to currentColor (e.g. fill="currentColor") so the icon automatically follows Obsidian's theme color and works seamlessly across light and dark themes.viewBox="0 0 24 24" — the most universal size standard, matching the plugin's built-in icon style.Click the edit button in the navigation bar to open a dropdown with three modes:
| Mode | Icon | Behavior |
|---|---|---|
| 🔒 Locked | lock |
View only — all interactions disabled (no drag, no context menu) |
| ↕️ Sort | arrow-up-down |
Long-press drag to reorder buttons and categories |
| ✏️ Edit | pencil |
Right-click / long-press menu to add, edit, copy, or delete |
Switch to folder view from the navigation bar or settings. Categories appear as folder tiles in a responsive grid.
| Feature | Description |
|---|---|
| Open/Close | Click a tile to expand; click outside, press ESC, or click blank space (configurable) to close |
| 📌 Pin | Click 📌 to lock — folder stays open until unpinned or you switch folders |
| Edit name | Click folder name to rename (configurable in settings) |
| Reorder folders | Long-press drag in sort mode |
| Cross-folder drag | Drag button out → auto-close → hover 0.6s on another tile → auto-expand → continue sorting |
| Auto-scroll | Drag near edges inside expanded folder to scroll |
When Sort mode is active and search is not active, long-press and drag to reorder (mouse long-press works on desktop too):
| Target | List view | Tabbed view | Folder view |
|---|---|---|---|
| Buttons | Long-press a button, then drag to reorder within a category; drag over another category's tab/zone to move across categories | Same; active tab's grid supports drag reorder | Drag within expanded folder or between folders; hover 0.6s over a tile to auto-expand |
| Categories | Long-press the category block (title or non-button area), then drag vertically to reorder | Long-press a tab, hold ~0.4s over another tab to confirm drop target, then release to reorder | Long-press a tile to reorder in grid |
Select a script: In the button editor, set the action type to "Script" and choose or enter a script file name (.js only).
Script location: Scripts must be placed in the folder specified in Path Config (e.g. scripts/).
Single format: Scripts export via CommonJS module.exports. The entry function takes no parameters and reads its context from this.$context:
```js
// scripts/hello.js
module.exports = {
entry: main,
name: {
zh: '打招呼',
en: 'Say hello',
ru: 'Поздороваться',
},
description: {
zh: '向通知栏发送一条问候。',
en: 'Send a greeting to the notice bar.',
ru: 'Отправить приветствие в уведомление.',
},
tags: ['demo'],
};
async function main() {
const { app, obsidian, notice } = this.$context;
notice('Hello from script!');
}
```
Runtime context: Available inside the entry function via this.$context: app (the running obsidian.App instance — not the class, so don't use new), plugin, obsidian (module namespace for destructuring Notice/TFile/Modal, etc.), requestUrl (equivalent to obsidian.requestUrl, avoids CORS), and notice (equivalent to new obsidian.Notice(msg)).
Entry must be a regular function: Arrow functions have no own this, so $context would be unavailable.
Helper functions: Helpers do not receive the context automatically — pass what they need explicitly, e.g. await renameFile(app, obsidian, file).
Localization: name / description accept a localized object keyed by zh/en/ru (missing languages fall back to en → zh) or a plain string; when picking a script in the button settings, the dropdown shows them in the current Obsidian language.
Field order: entry → name → description → tags is recommended; entry is required and points to the function to run; tags is an optional string array for categorization; helper functions can live in the same file without affecting the export.
Errors & security: Script errors are automatically caught and shown as notifications; do not run scripts from untrusted sources.
node --version), LTS version recommended.npm install to install dependencies.npm run dev to start development mode with live compilation (automatically deploys to test vault).npm run build to build the production version and deploy to test vault.npm run lint to check code quality..env file in the project root and add: VAULT_PATH=/path/to/your/vault.This project is licensed under the MIT License. See the LICENSE file for details.
If you find this plugin helpful, please consider:
This plugin uses icons from the open-source project Lucide, which is licensed under the ISC License.