LinkPaster for Jira
Release notes
Version 0.6.0
Changed
- Renamed to LinkPaster for Jira. New bundle id
org.parallel45labs.linkpasterand update feedlinkpaster.parallel45labs.org. Because the bundle id changed, this is a fresh install: re-enter your settings and API token, and re-grant Accessibility. Older JiraPaster builds don't auto-update to it. - No built-in site defaults. The Atlassian base URL and the ID-link base URL now start blank; set them in Preferences. Pressing the hotkey before the Atlassian URL is set shows a hint pointing to Connection.
- The account-link feature is now the generic ID Links tab (any 24-char hex id →
<base URL>/<id>), and its Reset button is gone.
Version 0.5.1
Fixed
- Offline-proof first launch: the release now notarizes and staples the notarization ticket into the
.app(not just the DMG), so a freshly installed copy passes Gatekeeper even with no network on first open. The DMG is still notarized + stapled in its own right.
Version 0.5.0
Sparkle auto-updates
- The app now keeps itself up to date via Sparkle: Check for Updates… lives in the menu-bar menu (and the app menu), and Sparkle's standard scheduled background checks kick in after it asks once for permission.
- Updates are EdDSA-signed and served from a Cloudflare R2 bucket behind a custom domain. Each release uploads a versioned DMG plus a fresh
appcast.xml. - Dev
build-*releases are now marked prerelease so they don't claim the "Latest" badge on the Releases page. - Note: installs of v0.4.0 and earlier predate the updater and need one last manual DMG download; updates are automatic from then on.
Version 0.4.1
Fixed
- Crash on any hotkey paste after Preferences had been opened (v0.4.0 regression): the paste path ran the keyboard-layout lookup (the TIS APIs behind the non-QWERTY ⌘V keycode) on the background paste queue. Once SwiftUI text input initializes — the first time Preferences opens — macOS binds those APIs to the main thread and kills off-main callers with a dispatch-queue assertion (SIGTRAP in HIToolbox). The keycode is now resolved on the main thread, per paste, and handed to the paste queue; a
dispatchPreconditionlocks the constraint in.
Version 0.4.0
Account (ID) links
- Copy a 24-char hex id (e.g. a MongoDB ObjectId), hit the hotkey, and it pastes as a clickable link to
<base URL>/<id>— no more searching an admin tool for a record you already have the id for. - Runs entirely offline: no Jira API call, no token, and no email needed. The enrichment pipeline recognises the id (or an already-pasted ID link, so re-pressing re-enriches) before the Atlassian guards.
- New Account tab in Preferences to set the base URL, with a live example link. Clear it to turn account links off. The id is appended with a single
/regardless of whether the URL has a trailing slash. - Account links have their own paste format (on the same tab), defaulting to a new URL Only format that pastes just the bare address — ideal for a browser bar. Jira/Confluence keep the General paste format (Rich Link / Markdown / Plain Text).
Clipboard restore (paste-special)
- The hotkey no longer permanently rewrites your clipboard: ~½ second after the enriched link pastes, the original clipboard is restored, so a later plain ⌘V pastes what you'd actually copied. A change-count guard skips the restore if you copy something new in that window.
- Toggle in Preferences → General → Output (default on). Enrich Clipboard Only is unaffected — keeping the enriched link on the clipboard is its purpose — and a failed paste also keeps the enriched link so you can ⌘V it manually.
Faster pasting
- The synthetic ⌘V is now posted directly via CGEvent instead of spawning
osascript→ System Events, cutting ~⅓ second of overhead off every paste. Account links — which skip the network entirely — now land near-instantly; Jira/Confluence pastes feel snappier once the API responds. The AppleScript route remains as a fallback when Accessibility isn't granted, since its error output is what drives the permission alert.
Hardening (review pass)
- Non-QWERTY layouts: the synthetic ⌘V now posts the keycode that maps to "v" on your current keyboard layout (via UCKeyTranslate), so Dvorak / AZERTY / etc. paste correctly instead of firing a different ⌘-shortcut.
- Secure keyboard entry: when a password field or password manager has secure input active (which silently swallows synthetic keystrokes), the app no longer "pastes" into the void and then wipes the link — it detects it, leaves the enriched link on the clipboard, and tells you to ⌘V it.
- No double-paste / no lost clipboard: a paste (and its restore window) now holds a re-entry lock, so a double-tapped hotkey can't paste twice or chain restores that replace your real clipboard with the enriched link.
- Account id matching tightened: only ASCII hex counts (fullwidth look-alikes are rejected), and a longer hex run after the base URL is rejected rather than truncated to a wrong-account link.
- Jira/Confluence win over account links when a clipboard somehow holds both, preserving the original behavior.
- Clipboard restore is safer: only text representations are snapshotted (no main-thread stall force-resolving promised image/PDF data), type fidelity order is preserved, and an unreadable/empty snapshot skips the restore instead of clearing the clipboard.
- Account ids are truncated in the in-app log; the Base URL field validates as a real URL (a half-typed
https://no longer builds a broken link); and the "Enrich Clipboard Only" confirmation reports what's actually on the clipboard (the URL under URL Only, not the id).
Version 0.3.0
Templates
- New Jira placeholders
{status}and{STATUS}(uppercased) let you fold the issue's workflow status —To Do,In Progress,Done— into the pasted link. Opt-in: add the token to your Jira → Display format template (the default is unchanged). The fetch now requests thestatusfield alongsidesummaryandissuetype; an issue with no status resolves to empty and collapses its surrounding-separators, same as{type}.
Version 0.2.0
Confluence support
- Paste a Confluence page link (
…/wiki/spaces/ENG/pages/123/Title) and it's enriched with the page title. New Confluence template with{title},{space}(key, read from the URL),{type}(Page/Blog), and{id}. - Confluence needs its own scoped token (
read:page:confluence) — Atlassian scoped tokens are single-product — managed on the Connection tab alongside the Jira one. Leave it blank to skip Confluence links.
Preferences
- Sidebar is now General · Jira · Confluence · Connection (the old Display tab is the Jira tab).
- The live Preview is a prominent card with a Comment / Issue sample toggle so the
<c>…</c>behaviour is visible at a glance. - Paste format moved to General → Output (it governs both products), and the Connection tab links straight to the Atlassian API-tokens page.
Templates
- Renamed
{emoji}→{type-emoji}(distinct from{comment-emoji}). - Bold / italic on any span via
<i>…</i>and<b>…</b>, rendered in Rich Link, Markdown, and the previews.
Fixes & hardening
⌘X/⌘C/⌘V/⌘Anow work in the Preferences text fields (the menu-bar app had no Edit menu, so only right-click paste worked).- The hotkey finds a link inside already-enriched clipboard content (markdown/plain, or a rich link's HTML href), so re-pressing on an enriched link re-enriches instead of erroring.
- Paste no longer briefly freezes the app (moved the blocking keystroke synthesis off the main thread); a re-triggered hotkey is ignored while a fetch is in flight (no duplicate calls / double pastes); menu-bar artwork and template regexes are cached instead of rebuilt on every use.
Version 0.1.0
First versioned, signed & notarized release. (Earlier builds were timestamped build-* dev builds cut via manual workflow dispatch.)
Preferences redesign
- Rebuilt the Preferences window as a sidebar layout (like macOS System Settings / 1Password): colored category badges, a hover highlight, and a consistent, larger type scale.
- General is now the first item and absorbs the old Hotkey tab.
- Text fields have clearly visible borders.
- The Display format field is now a wrapping, top-aligned editor (built on
NSTextView) you can drag taller by the corner grip. - The Paste format picker shows a live example of the selected format.
Comment-link support
- Pasting a link to a specific comment (
…?focusedCommentId=…) now keeps the anchor, so the pasted link jumps to that comment instead of the top of the ticket (the anchor used to be dropped). - New template placeholders, filled only for comment links: -
{commenter-name}— the commenter's first name (italic) -{commenttext}— the first 7 words of the comment, quoted (italic) -{comment-emoji}— a configurable emoji, set in the new Comment row of the Type → Emoji map - New HTML-style
<c>…</c>block — kept only on comment links, removed (along with any literal punctuation inside) on normal links. - Italics render in Rich Link and Markdown pastes; Plain Text pastes unstyled.
Distribution
- Releases are cut from
v*tags via GitHub Actions: Developer ID–signed, notarized by Apple, and stapled. - Note: CI builds on GitHub's macOS 15 runner, so on macOS 26 (Tahoe) the released app shows the macOS 15 system appearance rather than the Tahoe "Liquid Glass" look a local 26-SDK build would have. Cosmetic only; will update once GitHub ships a macOS 26 runner image. See
docs/SIGNING.md.