LinkPaster for Jira

Release notes

Version 0.6.0

Changed

  • Renamed to LinkPaster for Jira. New bundle id org.parallel45labs.linkpaster and update feed linkpaster.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 dispatchPrecondition locks 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 the status field alongside summary and issuetype; 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/⌘A now 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.