Ashly Lorenzana32 downloadsImport HTML files as permanent interactive Markdown notes.
Turn Obsidian notes into interactive mini-apps.

Notelets is an Obsidian plugin for creating and importing small frontend applications directly into your vault. A Notelet is still an ordinary Markdown note, but its embedded HTML, CSS, and JavaScript can render as a working interactive interface inside Obsidian.
Import a self-contained HTML file, import an entire frontend project folder, or start from a blank Notelet template and build directly in Obsidian.
localStorage data through a Notelets storage bridge, so compatible mini-apps can keep their state between sessions.icon.src = "chores.gif".A Notelet is a Markdown note containing a fenced notelet block:
---
notelet: true
notelet-version: 1
---
```notelet
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
body {
font-family: system-ui, sans-serif;
}
</style>
</head>
<body>
<button id="hello">Click me</button>
<script>
document.querySelector("#hello").addEventListener("click", () => {
alert("Hello from a Notelet!");
});
</script>
</body>
</html>
```
In Reading mode, Notelets renders that block as an interactive iframe. In Source mode, the underlying HTML, CSS, and JavaScript remain directly editable inside the note.
Notelets currently adds three commands to Obsidian:
Notelets folder and opens it in Source mode..html or .htm file.A ribbon button is also available for importing an HTML file as a Notelet.
Folder import is intended for small frontend projects such as:
my-app/
├── index.html
├── styles.css
├── script.js
└── images/
├── icon.gif
└── background.png
When imported, Notelets will:
index.html when present.The result looks roughly like this:
Your Vault/
└── Notelets/
├── my-app.md
└── _assets/
└── my-app/
├── icon.gif
└── background.png
The original source folder is no longer required after a successful import.
Large images and media files are not embedded into the Markdown as base64 data. Instead, Notelets copies referenced assets into Notelets/_assets/ and stores lightweight internal references in the Notelet source.
When the note renders, those references are resolved to Obsidian resource paths for the iframe.
Supported asset types currently include common:
Filename matching also supports JavaScript-driven interfaces where an asset name is stored in data and assigned later, for example:
const activities = [
{ label: "Chores", icon: "chores.gif" },
{ label: "Creative", icon: "creative.gif" }
];
const image = document.createElement("img");
image.src = activities[0].icon;
If the selected folder contains exactly one matching chores.gif, Notelets can import and resolve it automatically.
Many small frontend apps use localStorage for persistence. Sandboxed Notelets use a storage bridge so compatible apps can continue using familiar code such as:
localStorage.setItem("my-app-state", JSON.stringify(state));
const saved = localStorage.getItem("my-app-state");
Notelets stores that data through the plugin so it can be restored when the Notelet is opened again.
Notelets is currently installed manually.
Create this folder inside your vault:
.obsidian/plugins/notelets/
Place the plugin files inside it:
notelets/
├── main.js
├── manifest.json
└── styles.css
Then:
[!WARNING] Only import or run Notelets from sources you trust.
Notelets is intentionally designed to execute frontend JavaScript. Its iframe currently uses both allow-scripts and allow-same-origin so imported applications can function correctly and access copied vault assets.
That means a Notelet should be treated as executable content, not as passive Markdown. Do not import unknown or untrusted HTML projects simply to inspect them.
Obsidian notes are usually documents. Notelets makes them capable of being tools.
A Notelet can be a kanban board, tracker, calculator, generator, recorder, form, dashboard, visualizer, or any other small interface that can run entirely in frontend HTML, CSS, and JavaScript—while remaining part of the vault alongside ordinary notes.
The goal is not to make Obsidian imitate a browser. It is to make interactive mini-apps a native-feeling kind of note.