Noteli

Add Your Heading Text Here

Noteli is a professional dock-able panel for Adobe Photoshop that gives digital artists and illustrators a seamless way to manage notes directly inside their creative workflow. Instead of juggling external apps, sticky notes, or scattered files, Noteli embeds your notes straight into your Photoshop documents using XMP metadata. This means your ideas, project details, and creative reminders always travel with your PSDs—no matter where they go.

Designed with creative professionals in mind, Noteli offers a clean, distraction-free interface that sits comfortably alongside Photoshop’s workspace. It supports rich text formatting, quick sectioning, and link management, making it easy to organize everything from quick sketches of thought to fully structured project briefs. Visual indicators keep you in sync at all times, while customizable themes let you work in a style that matches your environment, whether you prefer a sleek professional notepad or a casual sticky-note aesthetic.

With powerful document management at its core, Noteli automatically associates notes with each open Photoshop file, switching context instantly as you move between projects. Every document receives its own permanent identity key, ensuring your notes stay attached even if files are renamed, moved, or duplicated. For added flexibility, your notes can also be exported in RTF or PDF formats, giving you polished, shareable documents for clients, teams, or personal archives.

Noteli is built for creative professionals who value clarity and efficiency. Whether you’re a freelance illustrator managing multiple commissions, a studio team coordinating revisions, or a student learning to document your process, Noteli provides a reliable, embedded solution that keeps your creative flow intact. With permanent note preservation, cross-platform support, and a streamlined design, it’s more than just a plugin—it’s your creative memory inside Photoshop.

  • Embedded Notes – Notes are written into Photoshop files via XMP metadata, ensuring they travel permanently with your PSDs.
  • Dockable Panel – Seamlessly integrates into Photoshop as a professional, distraction-free workspace.
  • Rich Text Formatting – Supports bold, italic, bullet points, section dividers, and links for structured documentation.
  • Real-Time Sync – Automatic saving with clear status indicators (red while saving, green when synced).
  • Multi-Document Support – Instantly switches notes as you move between open Photoshop files.
  • Custom Themes – Choose from Black Pearl Paper, Post Note Yellow, and Light Parchment styles.
  • Character Management – Built-in counter with customizable limits for precise note control.
  • Flexible Export – Export notes as RTF or PDF for client presentations, project archives, or team sharing.
  • Cross-Platform – Works on both macOS and Windows with full feature parity.
  • Creative Professional Focus – Ideal for digital artists, illustrators, designers, students, and creative teams.

Requirements:

  1. Minimum PS Version: 24.0.0
  2. Internet Connection
  3. Valid Licence Key from Gumroad/Adobe Cloud Account

*Please note this plugin has the following built in languages: English, English US, Français, Deutsch, Español, Italiano, Português, Ελληνικά and 日本語

  • There is a projected release date for V.1.0.0 for January 2026.
  • In an incredible series of events and the release of Photoshop 27, there was a break in the code that allowed XMP data to be written from the UXP environment. Mainly due to security and a new pipeline built to deal with Content Credential data. For that reason, the past 3 days has been used to find a solution. Luckily a new more robust data saving XMP engine has been designed and is being deployed into th app. So V 1.1.0 is still set for January release.
Changelog

Noteli - Version History

Version 1.2.13 Bugfix

2026-03-18
  • ## [1.2.13] - 2026-03-18
  • ### Fixed
  • - **XMP note restore**: Replaced `noteli-xmp-wrapper.js` with Remind-A's proven pattern — same structure, correct `setupSaveInterception()` call, identical encoding flow
  • - **psd-metadata-engine.js**: Replaced with Remind-A's disk-read version — reads XMP via `XMPFile` from disk instead of stale batchPlay in-memory cache
  • - **Empty write on close**: `handleAutoSave` now guards against `!app.activeDocument` and `!content` — prevents blur-on-close overwriting good XMP with empty string
  • - **Load/save race condition**: `_loadInProgress` flag blocks `writeNote` during `loadCurrentDocument` to prevent empty auto-save firing mid-load
  • ### Files Modified
  • - `lib/core/noteli-xmp-wrapper.js` (all versions) — full rewrite based on Remind-A pattern
  • - `lib/core/psd-metadata-engine.js` (all versions) — replaced with Remind-A disk-read version
  • - `script.js` (all versions) — `handleAutoSave` guards, `_loadInProgress` flag, `loadCurrentDocument` finally block

Version 1.2.12 Bugfix

2026-03-18
  • ### Fixed
  • - **Double save dialog**: Auto-save now uses `cancellableDebounce(1500ms)` — saves only after typing pause, not on every keystroke
  • - **Concurrent save guard**: `_saveInProgress` flag in `writeNote` prevents two XMP writes running simultaneously
  • - **Blur + debounce collision**: `blur` event now calls `debouncedAutoSave.flush()` instead of `writeNote` directly, eliminating duplicate saves
  • - **Redundant internal timer**: Removed double-debounce (`setTimeout` inside `handleAutoSave`) that was stacking with outer debounce
  • - **Adobe save dialog text**: Changed `executeAsModal` `commandName` from "XMPFile Post-Save Patching" to "Noteli — Saving..."
  • - **Script sync**: Original and Adobe `script.js` now identical (null-check guard on `result.id === 'reload'`)
  • ### Files Modified
  • - `script.js` (all versions) — debounce timing, save guard, blur handler, handleAutoSave cleanup
  • - `lib/core/psd-metadata-engine.js` (all versions) — commandName update

Version 1.2.11 Bugfix

2026-03-18
  • ### Changed
  • - **XMP Write Pattern — No Dirty Pixel**
  • - Replaced `injectMetadata` + save interception with direct `performXMPFilePatching` call in `lib/core/noteli-xmp-wrapper.js`
  • - XMP now written directly to disk on blur — no invisible pixel, no JPG re-encode
  • - Removed `setupSaveInterception()` call from wrapper initialisation
  • - Added `comprehensiveLogger` null-safe fallback in `psd-metadata-engine.js`
  • - Removed `ensureDocumentNeedsSave()` call from `injectMetadata`
  • - Removed verification block (500ms delay + re-read) from `performXMPFilePatching`
  • - Added `writeNote(content)` to textarea blur handler in `script.js` for immediate save on focus loss
  • - Added `lib/core/document-watcher.js`
  • ### Fixed
  • - Manifest version corrected from `1.2.8` to `1.2.11` to match `version.js`
  • ### Files Modified
  • - `lib/core/psd-metadata-engine.js` — logger fallback, removed dirty pixel call, removed verification block
  • - `lib/core/noteli-xmp-wrapper.js` — direct `performXMPFilePatching` pattern
  • - `lib/core/document-watcher.js` — added (polling watcher)
  • - `script.js` — blur-save on textarea
  • - `manifest.json` — version bumped to 1.2.11
  • - `lib/core/version.js` — version bumped to 1.2.11

Version 1.2.10 Minor

2026-01-30
  • ### Fixed
  • - **Text Formatting Cursor Position Bug** - Critical fix for formatting controls inserting at wrong location
  • - **Issue**: Bold, italic, link, bullet, and section formatting buttons ignored cursor position
  • - **Root Cause**: All formatting operations used `textarea.value +=` which always appends to end of textarea
  • - **Solution**: Implemented cursor-aware insertion using `selectionStart`/`selectionEnd`
  • - **Impact**: Formatting tags now insert exactly at cursor position instead of randomly at end of text
  • - Affected operations:
  • - Bold button (`[b]`, `[/b]`) - now inserts at cursor
  • - Italic button (`[i]`, `[/i]`) - now inserts at cursor
  • - Link button (`[link=URL]`, `[/link]`) - now inserts at cursor
  • - Bullet button (`\n• `) - now inserts at cursor
  • - Section header button - now inserts at cursor
  • - Auto-close on drawer close - now inserts closing tags at cursor
  • - `closeAllFormats()` API - now inserts closing tags at cursor
  • - File: `lib/ui/noteli-format-drawer.js`
  • ### Technical
  • - Replaced all `textarea.value +=` operations with cursor-position-aware insertion
  • - Implementation pattern:
  • ```javascript
  • const cursorPos = textarea.selectionStart || textarea.value.length;
  • const textBefore = textarea.value.substring(0, cursorPos);
  • const textAfter = textarea.value.substring(textarea.selectionEnd || cursorPos);
  • textarea.value = textBefore + insertText + textAfter;
  • ```
  • - Added `setTimeout()` wrapper for cursor restoration to work around UXP textarea selection bug
  • - Updated 7 formatting functions and 2 auto-close operations

Version 1.2.9 Minor

2026-01-22
  • ### Fixed
  • - **Missing Logger File** - Resolved critical plugin loading error
  • - **Issue**: Plugin failed to start with error "Failed to load script file: lib/core/comprehensive-logger.js"
  • - **Root Cause**: File referenced in `index.html` line 427 but missing from `lib/core/` directory
  • - **Solution**: Copied `comprehensive-logger.js` from sylentID project (13,139 bytes)
  • - **Impact**: Plugin now loads correctly without errors
  • - File location: `lib/core/comprehensive-logger.js`
  • ### Changed
  • - Updated version number from 1.2.8 to 1.2.9 in `lib/core/version.js`

Version 1.2.8 Minor

2026-01-17
  • ### Fixed
  • - **RTF Export Engine** - Complete markup and formatting system overhaul
  • - **Markup Tag Conversion** - `[b]`, `[i]`, `[u]` tags now properly convert to RTF formatting codes (`\b`, `\i`, `\ul`)
  • - **Bullet Point Formatting** - Bullet character (•) now renders as proper RTF bulleted lists with hanging indent
  • - Fixed double-escaping regex issue in `convertBullets()` - now correctly matches `\\u8226?` after escapeRTF processing
  • - Bullets formatted with `\pntext` and `\pn` groups for professional list rendering
  • - **Link Conversion** - `[link=URL]text[/link]` markup now converts to clickable RTF hyperlinks
  • - Uses RTF field syntax: `{\field{\*\fldinst{HYPERLINK "url"}}{\fldrslt{\ul\cf1 text}}}`
  • - Automatically prepends `http://` to URLs without protocol
  • - **Copyright Symbol** - Fixed double-encoding issue causing `©` character
  • - Changed from literal `©` to RTF hex code `\'a9` in footer sections
  • - **Header/Footer Visibility** - Added `\viewkind1` and `\pgncont\titlepg` flags for proper rendering
  • - Location: `lib/export/rtf-engine.js`
  • ### Technical
  • - Fixed escapeRTF function to convert `•` to `\u8226?` and `©` to `\'a9`
  • - Updated convertBullets regex to handle double-escaped backslashes: `/^\\\\u8226[?] /g`
  • - Enhanced transformMarkup to process links before formatting tags
  • - Processing order: escapeRTF → transformMarkup (links, bold, italic, underline) → convertBullets

Version 1.2.7 Minor

2026-01-16
  • ### Fixed
  • - **RTF Export Engine** - Complete overhaul of RTF generation for proper document structure
  • - Added `\sectd` (section definition) command before header/footer blocks - required for headers/footers to render in page layout/print view
  • - Added `\pard\plain` paragraph reset after header/footer definitions to properly initialize body content
  • - Fixed Unicode character handling - all non-ASCII characters (bullets •, copyright ©, etc.) now converted to RTF Unicode format (`\u8226?`)
  • - Added explicit font specifications (`\f0\fs24`) to paragraph output for consistent rendering
  • - Fixed translation key fallback - keys no longer appear literally in exported documents
  • - Headers and footers now render correctly in Microsoft Word, LibreOffice, and compatible RTF viewers
  • - Location: `lib/export/rtf-engine.js` lines 57-61, 66, 82, 144
  • ### Technical
  • - Updated `escapeRtf()` function to include Unicode conversion for all non-ASCII characters
  • - Changed translation handling to use direct string fallbacks instead of i18n.t() calls
  • - Improved RTF document structure compliance with RTF 1.9 specification

Version 1.2.6 Major

2026-01-16
  • ### Added
  • - **Enhanced Utility Integration** - Integrated three utility modules for improved performance and reliability
  • - **DebounceUtils** (`lib/utils/debounce-utils.js`)
  • - Added debounced auto-save (300ms delay) to reduce XMP write operations during rapid typing
  • - Text input updates UI immediately but saves after user stops typing
  • - Improves performance by preventing excessive file operations
  • - **DocumentUtils** (`lib/utils/document-utils.js`)
  • - Implemented document watcher with polling (1000ms) and debouncing (200ms)
  • - Replaced direct `app.activeDocument` calls with safe getters (`getActiveDocument()`)
  • - Added callbacks for document change/open/close events
  • - Runs alongside traditional Photoshop event listeners as backup strategy
  • - Better error handling prevents crashes on null document references
  • - **HashUtils** (`lib/utils/hash-utils.js`)
  • - Added XMP injection protection via string sanitization before writing
  • - Escapes potentially dangerous characters: `<`, `>`, `&`, `"`, `'`
  • - Available utilities: secure hashing, ID generation, device fingerprinting, string normalization
  • ### Changed
  • - **License System** - Switched from basic Gumroad-only engine to universal multi-vendor system
  • - Changed `require('./lib/core/license-engine.js')` to `require('./lib/core/license-engine-universal.js')`
  • - Now supports multiple license providers: Gumroad, LemonSqueezy, No-License (Adobe marketplace)
  • - License adapters (`gumroad-adapter.js`, `lemonsqueezy-adapter.js`, `no-license-adapter.js`) now actively loaded
  • - Provider selection automatic based on `LICENSE_CONFIG.provider`
  • ### Fixed
  • - **Dependency Scanner Path Resolution** - Enhanced scanner to properly detect relative imports
  • - Added `resolvePath()` function to handle `../` patterns in require() statements
  • - Scanner now correctly resolves paths like `../license-providers/gumroad-adapter.js`
  • - Relative paths resolved based on current file's directory
  • - License adapters no longer show as "UNRESOLVED" - correctly identified as REACHABLE
  • ### Technical
  • - Updated `script.js` with utility module integration (lines 24-26, 516-521, 657, 679, 698, 793)
  • - Modified `setupDocumentEventListeners()` to use DocumentUtils watcher (lines 415-472)
  • - Enhanced `/Users/rob/desktop/Web/ue-dependency-cleaner-enhanced.html` with path resolution logic
  • - Cleaner codebase - all three utility modules now properly detected by dependency scanner

Version 1.2.5 Minor

2026-01-15
  • ### Fixed
  • - **XMP Error Handling for Adobe Verification**
  • - Changed "No active document" error from thrown exception to warning notification
  • - Added `showWarning()` function for user-friendly warning messages
  • - Prevents console errors when no document is open (improves Adobe plugin verification compatibility)
  • - Uses existing translation key `notification.no_document`
  • - No longer logs errors in console for expected user behavior (opening plugin without document)
  • - **Clear/Delete Notes Function Not Working**
  • - Root cause: Native JavaScript `confirm()` dialog doesn't work in Adobe UXP environment
  • - Replaced with custom confirmation overlay using existing HTML element (`clearConfirmationOverlay`)
  • - Added event listeners for Yes/No confirmation buttons (script.js:473-498)
  • - Created separate `performClear()` function for actual clearing logic (script.js:727-743)
  • - Modified `handleClear()` to show custom overlay and respect settings (script.js:709-725)
  • - Respects "Confirm Before Clearing" preference from settings panel
  • - Shows proper success/error notifications after clearing
  • - Full UXP compatibility achieved for all clear operations
  • ### Technical
  • - Updated `script.js` with warning notification handler and custom confirmation overlay logic
  • - Added `showWarning()` helper function for warning-level notifications
  • - Refactored clear handling to use UXP-compatible confirmation UI

Version 1.2.4 Patch

2026-01-01
  • ### Fixed
  • - **Language Warning Modal** - UXP-compliant external modal implementation
  • - Fixed modal timing violation - UXP blocks modals shown from async callbacks
  • - Implemented deferred modal pattern using localStorage flag
  • - Modal now shows when settings closes (safe UI moment)
  • - Uses Photoshop's native `app.showAlert()` API for external blocking dialog
  • - Two-button interface (Reload Now / Later) with translated labels
  • - Prevents silent modal blocking and unwanted Photoshop override notifications
  • ### Technical
  • - Updated `script.js` with deferred modal flag in language callback (lines 132-145)
  • - Added global `showLanguageWarningModal()` function using native `app.showAlert()` (lines 1283-1310)
  • - Modified `lib/ui/settings-engine.js` to check flag on modal close (lines 128-157)
  • - 150ms delay ensures settings modal fully closes before showing warning

Version 1.2.3 Major

2025-12-28
  • ### Added
  • - **Complete i18n Implementation** - Full multi-language support across entire application
  • - 9 supported languages: en-GB, en-US, de, fr, es, it, pt, el, ja
  • - Complete JSON translation files in `/locales/` directory for all languages
  • - Dynamic language switching without reload for main UI, tooltips, and character counter
  • - Translation callbacks for settings notifications
  • - `applyUIText()` function for comprehensive UI updates on language change
  • ### Fixed
  • - **Language Switching** - Resolved multiple critical issues preventing proper language changes
  • - Fixed storage key mismatch between settings (`noteli_language`) and i18n (`plugin_language`)
  • - Fixed tooltip caching issue - tooltips now read title attributes dynamically instead of caching at initialization
  • - Fixed initialization order - i18n now loads before splash screen for proper translation
  • - Added `data-i18n` attributes to all HTML elements requiring translation
  • - Settings modal now translates properly when language changes
  • ### Changed
  • - **Storage Keys** - Unified all localStorage keys to use `noteli_` prefix for consistency
  • - Changed `plugin_language` → `noteli_language`
  • - Updated `noteli_show_tooltips` for consistency
  • - **Character Counter** - Now supports translated unit text via `getUnitText` callback
  • - **Notification System** - Tooltips now support language changes by reading title attributes dynamically
  • ### Technical
  • - Updated `lib/ui/i18n.js` with correct localStorage keys
  • - Enhanced `script.js` with i18n initialization and `applyUIText()` function
  • - Modified `lib/core/noteli-settings.js` to include language and translation callbacks
  • - Updated `lib/ui/settings-engine.js` to support translated notification messages
  • - Enhanced `lib/ui/character-counter-engine.js` with `getUnitText` parameter
  • - Fixed `lib/core/noteli-notifications.js` tooltip event listeners to read dynamically

Version 1.2.2 Minor

2025-12-28
  • ### Fixed
  • - **Settings Persistence** - Critical fix for settings not saving correctly on first modal reopen
  • - Eliminated duplicate event listeners causing race conditions
  • - Added 50ms delay before modal close to ensure UXP localStorage writes complete
  • - Implemented aggressive DOM `selected` attribute clearing on settings load
  • - Prevented double-save issue with `save=false` parameter in callbacks
  • - **Settings Engine Integration** - Removed conflicting `noteli-settings-simple.js` implementation
  • - Consolidated to use `lib/ui/settings-engine.js` exclusively
  • - Properly initialized with `createSimpleSettingsEngine()` and callbacks
  • ### Changed
  • - **UK English Localization** - Changed all user-facing text from US to UK English
  • - "License" → "Licence" (200+ instances in UI, EULA, messages)
  • - "Behavior" → "Behaviour" in settings tabs
  • - Code identifiers (variables, functions) preserved with US spellings
  • - Third-party legal text (e.g., "MIT License") unchanged
  • ### Added
  • - **Internationalization System** - Comprehensive translation infrastructure
  • - Created `/locales/translations.csv` with 200+ translatable strings
  • - Organized into 16 logical categories (Splash, Licence, Settings, etc.)
  • - 10 columns: Category, en-GB Value, Translation Key, en-US, de, fr, es, it, pt, el, ja
  • - en-US column populated where spellings differ from en-GB
  • - Ready for translation into 8 additional languages

Version 1.2.1 Minor

2025-12-28
  • ### Fixed
  • - **UXP Context Menu** - Right-click context menu now works reliably
  • - Replaced unreliable `click` events with `pointerdown` for dynamic elements
  • - Implemented capture-phase event handling for proper outside-click detection
  • - Added smart hover behavior with 300ms delay before auto-close
  • - **UXP Clipboard Cursor Positioning** - Fixed cursor-reset bug after paste operations
  • - Delayed selection restoration with `setTimeout(() => { textarea.selectionStart = pos; }, 0)`
  • - Added pre-paste focus + microtask for accurate multi-line selection
  • - Paste now correctly inserts at cursor position instead of always at end
  • ### Changed
  • - **Context Menu Positioning** - Improved placement and styling
  • - Positioned over control panel instead of textarea to avoid z-index conflicts
  • - Reduced padding from `6px 12px` to `4px 8px` for compact professional appearance
  • - Final position: `offsetY: -1, offsetX: 20`
  • ### Technical
  • - Updated `lib/ui/context-menu-engine.js` with UXP-compatible pointerdown events
  • - Updated `lib/utils/clipboard-utils.js` with cursor positioning fix

Version 1.2.0 Major

2025-12-28
  • ### Fixed
  • - **Photoshop 27 Compatibility** - Critical XMP API changes resolved
  • - Adobe changed `require("uxp").xmp` → `require("photoshop").xmp` in PS 27
  • - Implemented automatic version detection and appropriate API selection
  • - Added 200ms delay for PS 27 XMP writes to prevent corruption
  • - Graceful fallback if version detection fails
  • ### Changed
  • - **Universal Library Architecture** - Major refactoring for code reusability
  • - Reduced script-ui.js from 3000 → 300 lines (87% reduction)
  • - Reduced script-xmp.js from 2200 → 430 lines
  • - Extracted universal engines to `/lib/` for reuse across plugins
  • - Implemented factory pattern for configurable engines
  • ### Added
  • - **Universal Engines** created in `/lib/`:
  • - **Core**: `xmp-engine.js`, `license-engine.js`
  • - **UI**: `notification-engine.js`, `settings-engine.js`, `translation-engine.js`, `splash-engine.js`
  • - **Utils**: `debounce-utils.js`, `document-utils.js`, `hash-utils.js`
  • - **Export**: `pdf-engine.js`, `rtf-engine.js`
  • - **Splash Screen** - 4-second loading sequence with realistic progression
  • - **Notepad Lines** - 1000 JavaScript-generated lines with theme color support
  • - **PS Version Detection** - Fixed using `require('uxp').host.version`
  • ### Technical
  • - Converted from ES6 modules to UXP-compatible require/IIFE pattern
  • - Fixed "Cannot use import statement outside a module" error
  • - Maintained all functionality in single-file implementation
  • - Optimized performance with no module loading overhead

Version 1.0.1 Minor

2025-12-28
  • ### Changed
  • - UI polish and terminology improvements
  • - Minor bug fixes and user experience enhancements

Version 1.0.0 Major

2025-12-28
  • ### Added
  • - **Initial Production Release** - Full-featured note-taking plugin for Photoshop
  • - **Core Features**:
  • - XMP metadata storage for permanent note persistence
  • - Real-time document synchronization
  • - Traffic light sync indicator (green/amber/red)
  • - Professional theming system
  • - **License System**:
  • - Complete Gumroad verification
  • - Admin bypass functionality
  • - Grace period handling
  • - **Export System**:
  • - RTF export with formatting
  • - PDF export with customizable options
  • - Print functionality
  • - **User Interface**:
  • - Text formatting (bold, italic, bullets)
  • - Section headers and links
  • - Character counter with warning levels
  • - Customizable character limits
  • - **Settings Management**:
  • - Comprehensive preferences
  • - Theme selection (Black Pearl, Post Note Yellow, Light Parchment)
  • - Line height options
  • - Export format defaults
  • - **Documentation**:
  • - 23-page professional user manual
  • - Complete EULA integration
  • - **Security**:
  • - Input validation and XSS prevention
  • - Secure license verification
  • - Local-only note storage (no external transmission)
  • ### Technical
  • - Adobe UXP 6.1+ compatibility
  • - XMP metadata integration
  • - Gumroad API integration
  • - Native HTML5/CSS3/JavaScript implementation
  • - Photoshop 2022+ (version 23.3.0+) support
Bugs

Noteli - Known Issues

  • ✓ Fixed Bullet Points – The bullet points can sometimes cause an issue on save.
  • ✓ Fixed Delete Note – Delete note causes error and doesn't work.
  • ✓ Fixed Text Styling Issue – When adding text styling to the note the save fails for some reason.
  • ✓ Fixed Export doesn't work – The Export button doesn't do anything.
  • ✓ Fixed Licence screen – The licence screen is not translating
  • ✓ Fixed DC Overwrite – When writing the XMP the DC info text overwrites existing text, instead of checking and appending the text.
  • ✓ Fixed Hamburger Menu not translating – When switching languages the hamburger menu doesn't translate.
  • ✓ Fixed Light Theme Cursor issue – When switching to the light theme the cursor disappears ir is not viewable.
  • ✓ Fixed No Document issue – No document status still allows for clipboard and formatting coding to be inserted.

Noteli - Latest Update

v1.2.13 2026-03-18

Release Notes:

  • ## [1.2.13] - 2026-03-18

Fixed

  • **XMP note restore**: Replaced `noteli-xmp-wrapper.js` with Remind-A's proven pattern — same structure, correct `setupSaveInterception()` call, identical encoding flow
  • **psd-metadata-engine.js**: Replaced with Remind-A's disk-read version — reads XMP via `XMPFile` from disk instead of stale batchPlay in-memory cache
  • **Empty write on close**: `handleAutoSave` now guards against `!app.activeDocument` and `!content` — prevents blur-on-close overwriting good XMP with empty string
  • **Load/save race condition**: `_loadInProgress` flag blocks `writeNote` during `loadCurrentDocument` to prevent empty auto-save firing mid-load

Files Modified

  • `lib/core/noteli-xmp-wrapper.js` (all versions) — full rewrite based on Remind-A pattern
  • `lib/core/psd-metadata-engine.js` (all versions) — replaced with Remind-A disk-read version
  • `script.js` (all versions) — `handleAutoSave` guards, `_loadInProgress` flag, `loadCurrentDocument` finally block

Requires: Adobe Photoshop 23.3.0 or later

Documentation and Tutorials​

Additional Learning Resources

A detailed PDF User Guide is available for download using the link provided below. This document explains all key features and functions of the plugin, helping you become familiar with its tools and workflow so you can make the most of your creative process.

For hands-on demonstrations and walkthroughs, visit our YouTube channel, where a full series of video tutorials cover everything you need to get started with the app. These videos provide visual guidance, practical examples, and helpful tips to ensure a smooth and productive learning experience.

To stay updated with new tutorials, feature overviews, and upcoming releases, subscribe to the channel here: RobArt Illustration

PDF User Manual Link(s) English, English US, Français, Deutsch, Español, Italiano, Português, Ελληνικά and 日本語

Additional Material

As part of the development of the Noteli project, a detailed documentation process was created to guide others in understanding and implementing the intricate relationship between XMP metadata and UXP integration. This resource outlines the challenges, solutions, and best practices discovered during development. You can download the full PDF guide from the following link; here! Hope it helps!

copyright © rob art | illustration 2026. all rights reserved.

You cannot copy content of this page