Sidd Shah80 downloadsEmbed live Atlassian Jira Cloud issues as rich tiles in your notes via code blocks or auto-linked issue URLs. Mobile-friendly.
Embed live Jira issue tiles in your Obsidian notes via fenced code blocks.
```jira
PROJ-123
```
The plugin replaces that block with a rich tile showing:
Epic AI-3855 in Jira Cloud for child issues, Story PROJ-1 in Jira Cloud for top-level)Target: Atlassian Cloud only. Mobile-friendly (iOS + Android).
id.atlassian.com lets you mint tokens
regardless of how you sign in.data.json only carries the name of the secret.dev branch.npm installnpm run build → produces main.js.manifest.json, main.js, and styles.css into
<your-vault>/.obsidian/plugins/obsidian-jira-tiles/.Once submitted, install via Settings → Community plugins → Browse → search "Jira Tiles".
In Settings → Jira Tiles, configure your Atlassian API token:
https://your-site.atlassian.netdata.json only
records the name of the secret.Note on OAuth: earlier builds attempted an OAuth 2.0 (3LO) flow. It was removed for two reasons. First, a distributable Obsidian plugin cannot safely complete Atlassian's token exchange: it requires a
client_secret, and bundling a secret in a publicly-downloadable plugin would expose it to everyone. Second, the Atlassian token endpoint repeatedly returnedaccess_deniedto the Obsidian-bundled HTTP client across multiple body encodings and authentication shapes. API tokens cover the same use cases (including SSO accounts) without shipping a shared secret.
Tokens are stored in Obsidian's
SecretStorage
(Obsidian 1.11.4+). The plugin's data.json carries only your site URL,
email, feature toggles, and the name of the secret — no credential
values.
Recommendations:
See SECURITY.md for the full threat model.
In Settings → Jira Tiles → Display → Embedding mode, choose how issues become tiles:
```jira blocks render as tiles.
Explicit and predictable.```jira
PROJ-123
```
List several keys, one per line — each renders as its own tile, and each
line can carry its own !compact / !full flag:
```jira
ABC-123
ABC-321 !compact
ABC-987 !full
```
Lines starting with # are treated as comments and ignored.
With auto-link (or both) enabled, a line containing just a Jira issue URL becomes a tile:
https://your-site.atlassian.net/browse/PROJ-123
This works in both Reading view and Live Preview. In Live Preview the raw URL reappears when your cursor is on that line, so you can still edit it.
Tiles can render as a single compact row instead of the full card.
Set the default in Settings → Jira Tiles → Display → Compact tiles by default. Code blocks inherit this default and can override it per tile with a flag on the key line:
```jira
PROJ-123 !compact
```
```jira
PROJ-123 !full
```
!compact forces a compact tile and !full forces a full tile, regardless
of the global default. Auto-linked Jira URLs have no per-link syntax, so they
always follow the global default.
```jira
key: PROJ-123
compact: true
```
compact: accepts true/false (also yes/no, 1/0). Omit it to
inherit the global default.
Open the command palette (Cmd/Ctrl-P):
| Command | Behavior |
|---|---|
| Jira Tiles: Insert Jira issue tile | Prompts for a key, inserts a jira block at the cursor |
| Jira Tiles: Refresh tiles in current note | Invalidates cache for keys in the current note + rebuilds the view |
| Jira Tiles: Refresh all Jira tiles | Clears the in-memory cache; tiles refresh on next render |
| Jira Tiles: Clear Jira cache | Same as above, alternative palette label |
Add fields in Settings → Custom fields:
Fields render via smart formatters that detect:
{ accountId, displayName, avatarUrls } → avatar + name{ value } → texttitle<code>JSON.stringify(value)</code> truncated at 240 charsnpm install # install dependencies
npm run build # one-shot production build → main.js
npm run dev # watch mode for plugin development
npm test # run the Jest test suite
npm run test:watch # tests in watch mode
npm run test:coverage # tests with coverage report
npm run typecheck # tsc --noEmit
A browser-based preview harness for iterating on tile UI without a real Jira
account or reloading Obsidian lives on the
dev branch
(npm run dev:preview there). It is kept off main because it is a
standalone browser tool that is never shipped with the plugin.
src/ Plugin source (shipped to Obsidian)
main.ts Plugin entry / lifecycle
constants.ts Shared constants (REST endpoints, default fields, cache)
commands.ts Command palette commands
auth/ API token + AuthManager + SecretsService (README inside)
jira/ REST client + types + field discovery (README inside)
cache/ In-memory TTL cache (README inside)
render/ Code block processor + tile DOM + smart formatters (README inside)
settings/ Settings tab + field picker modal (README inside)
tests/ Jest test suite
Each src/* subdirectory has its own README with module-level details.
Coverage spans:
Run npm test — completes in ~1s.
PRs welcome. Run npm run typecheck && npm test before submitting.
MIT — see LICENSE.