by Christina
Upload files to daily GitHub Release assets and insert ready-to-use links or media players.
Release File Publisher
Upload any local file to a GitHub repository's Release assets, then insert a ready-to-use player or link into the active note and copy the download URL.
The plugin is designed for a simple workflow: choose a file → upload → insert → copy link. It does not use Git commands and does not commit uploaded files to the repository.
Features
- Creates or reuses a published Release named with the current date (
YYYY-MM-DD) in your configured timezone. - Uploads files only as GitHub Release assets.
- Shows upload progress and waits for GitHub to confirm the upload before reporting success.
- Inserts only the file from the current upload into the active Markdown editor.
- Generates audio and video players, Markdown images, or icon-labelled download links according to file type.
- Copies the returned
browser_download_urlto the clipboard. - Preserves Chinese and other Unicode filenames while replacing unsafe filename characters.
- Supports Replace existing and Keep both filename-conflict modes.
- Browses remote assets by date and deletes selected files after confirmation.
- Removes a date Release after its final asset is deleted and the Release is confirmed empty.
Requirements
- Obsidian Desktop 1.8.7 or later. Mobile is not supported because upload progress uses Node.js HTTPS APIs.
- A GitHub repository. Use a public repository if links must work for readers who are not signed in to GitHub.
- A fine-grained personal access token limited to the selected repository.
- The repository must be initialized and must not use immutable Releases.
Setup
1. Prepare a repository
Create or choose a repository for uploaded files. Initialize it with a README if it is otherwise empty. Uploaded files will not appear in the repository tree; they are stored in Releases.
Do not enable immutable Releases. The plugin needs to add, replace, and delete assets after each daily Release is published.
2. Create a fine-grained token
In GitHub, create a fine-grained personal access token with the smallest practical scope:
| Setting | Value |
|---|---|
| Repository access | Only selected repositories |
| Selected repositories | Only the repository used by this plugin |
| Contents | Read and write |
| Metadata | Read |
| Other permissions | No access |
Organization-owned repositories may require administrator approval.
3. Configure the plugin
Open Settings → Release File Publisher, then enter:
- Owner: the GitHub user or organization that owns the repository.
- Repository: the repository name only.
- Fine-grained Token: the token created above.
- Timezone: an IANA timezone such as
Europe/BerlinorAmerica/New_York. The detected system timezone is used initially.
Select Test connection. A successful check shows GitHub connection successful. The check verifies read access; the first upload confirms write access.
Usage
Use either ribbon icon or the Command Palette:
- Upload & insert uploads one selected file, inserts it at the current Markdown cursor when it is still safe to do so, and copies the URL when enabled.
- Upload & copy link uploads one file and copies its URL without changing a note.
- Browse uploaded files lists daily Releases and lets you delete a selected asset.
If no editable Markdown note is active, the plugin still uploads the file and copies the URL. If the active note, selection, or cursor changes while an upload is running, the plugin avoids inserting into the wrong location and falls back to copying.
Smart insert formats
| Type | Extensions | Inserted content |
|---|---|---|
| Audio | mp3, wav, m4a, ogg, flac | HTML audio player with matching MIME type |
| Images | png, jpg, jpeg, gif, webp, svg | Markdown image |
| Video | mp4, webm, mov, m4v | Responsive HTML video player |
| PDF and documents | pdf, doc, docx, odt, rtf | Document download link |
| Spreadsheets | xls, xlsx, csv, ods | Spreadsheet download link |
| Presentations | ppt, pptx, odp | Presentation download link |
| Archives | zip, rar, 7z, tar, gz, tgz | Archive download link |
| Other files | Any extension | Generic download link |
The asset list is used only for conflict checks and management. A successful upload calls the editor insertion once for the newly uploaded file; it never inserts every asset from that day's Release.
Filename conflicts
- Replace existing deletes the same-named asset and uploads the new file. This usually preserves the download URL, but replacement is not atomic: a network failure after deletion can temporarily leave the link unavailable. Upload the local file again to recover.
- Keep both chooses the next available name, for example
recording-2.mp3andrecording-3.mp3.
Deleting uploaded files
Open Browse uploaded files, choose a date, select Delete, and confirm. The local file and note are never changed. Existing links to that asset stop working.
After the final asset is deleted, the plugin reads the remote list again and removes the empty Release and its date entry. An old empty Release can be removed with Remove empty date. GitHub does not provide an atomic “delete only if empty” operation, so avoid uploading to the same date from another device during cleanup.
Privacy, security, and external services
- Account and network use: this plugin connects directly to
api.github.comanduploads.github.comfor the repository configured by the user. GitHub's terms and privacy policy apply. - Credentials: the token is stored in Obsidian's plugin data file (
data.json) without additional encryption. The token is masked in settings and is never placed in download URLs. Protect the vault configuration directory and do not publish or sharedata.json. - Local file access: a native file picker lets the user explicitly select one file from anywhere on the computer. The plugin reads only that selected file for upload.
- Note access: the plugin reads the active editor state to avoid writing to the wrong location and uses the Obsidian editor API to insert generated text. It does not scan or upload vault notes.
- Clipboard: the plugin writes the successful download URL when requested or when insertion is unavailable.
- Deletion: remote deletion occurs only after explicit confirmation. It affects the selected Release asset and, when confirmed empty, that date's Release. It does not delete local files, notes, repository commits, branches, or tags.
- Telemetry: there is no analytics, advertising, tracking, or custom telemetry.
- Token safety: credentials are not intentionally written to logs, notices, error messages, or generated links.
Only upload content you are permitted to share. Files in public repositories are publicly accessible. Private-repository links generally require the reader to sign in to GitHub because the plugin does not put credentials in embedded links.
Known limitations
- Files are read into memory before upload; very large files may use substantial memory. GitHub's current Release asset limits also apply.
- Uploads cannot be resumed or cancelled after transfer begins, and automatic retry is not implemented.
- Node.js HTTPS upload traffic may not inherit every system or Obsidian proxy configuration.
- Playback support depends on the media codecs available in Obsidian's Electron runtime.
- GitHub may normalize an asset filename. The plugin uses the download URL returned by GitHub rather than constructing one.
- Cross-device operations have no global lock. Avoid replacing or deleting assets for the same date from multiple devices at the same time.
Development
npm install
npm run typecheck
npm test
npm run build
The production build creates main.js. The project uses TypeScript, the Obsidian API, Node.js, npm, and esbuild. It performs all repository operations through the GitHub REST API and never invokes Git or a shell command at runtime.
License
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.