2.6.0
Quilltap v2.6.0 Release Notes
Highlights
New UI Layout - Complete redesign with persistent left sidebar navigation, collapsible character/chat lists, resizable sidebar width, and a simplified home page.
Characters-not-Personas - Unified character system where users can control any character directly. Personas have been converted to user-controlled characters with real-time impersonation switching.
Plugin Development SDK - New npm packages (@quilltap/plugin-types, @quilltap/plugin-utils, @quilltap/theme-storybook, create-quilltap-theme) enable standalone plugin development without access to Quilltap source.
Memory Cascade - Memories auto-extracted from messages now track provenance. Deleting or regenerating messages prompts handling of associated memories.
Major Features
New UI Layout with Left Sidebar Navigation
- Replaced top navbar with persistent left sidebar
- Sidebar includes: Characters, Chats sections with quick access lists
- Footer with Settings, Tools, Themes, Quick Hide buttons and Profile menu
- Collapsible sidebar (desktop) with persistent state in localStorage
- Mobile: overlay drawer from left with hamburger trigger
- Simplified header with centered search bar and full-width toggle
- New home page with welcome message, favorites, and "Start Chat" button
- Resizable sidebar width (256px–512px) with drag handle, persisted to MongoDB
- Message count badges on sidebar chat items (shows "999+" for large chats)
- Brand logo moved to sidebar header (quill icon when collapsed, full logo when expanded)
- Full-width toggle now affects all pages via
--qt-page-max-widthCSS variable - Improved favorite character cards with wrapping titles and "Chat" quick-start button
- Dashboard route deprecated; redirects to home page
Characters-not-Personas Migration
- Personas have been converted to characters with
controlledBy: 'user' - Users can now control any character directly during chat via impersonation
SpeakerSelectordropdown for switching between multiple impersonated charactersAllLLMPauseModalfor all-LLM chats with Continue/Stop/Take Over options- New API endpoints:
/api/chats/[id]/impersonate,/api/chats/[id]/active-speaker - Inter-character memory support with
aboutCharacterIdfield - Chat creation UI now shows "Play As" selector for user-controlled characters
- Character view page: user-controlled toggle, default conversation partner setting
- Personas link removed from navigation; all
/personas/*routes redirect to/characters - Migration in upgrade plugin converts existing personas and updates references
Plugin Development SDK
- @quilltap/plugin-types (v1.1.0): TypeScript types for third-party plugin development
- Exports all types: LLM, tools, provider, manifest, themes, roleplay templates
- Error classes:
PluginError,ApiKeyError,ProviderApiError,RateLimitError - Submodule exports for granular imports (
/llm,/plugins,/common)
- @quilltap/plugin-utils (v1.1.0): Runtime utilities for plugins
- Tool call parsers and format converters
- Logger bridge:
createPluginLogger()routes to Quilltap core logging OpenAICompatibleProviderbase class for custom LLM providers- Roleplay template utilities:
createRoleplayTemplatePlugin(), validation functions
- @quilltap/theme-storybook (v1.0.4): Theme development kit
- Default theme tokens CSS and all qt-* component classes
- Storybook preset and ThemeDecorator for theme/mode switching
- Comprehensive story components for all UI elements
- create-quilltap-theme: CLI scaffolding for new theme plugins
- Interactive prompts for theme name, author, description, primary color
- Optional CSS overrides and Storybook setup
- Includes bundled THEME_PLUGIN_DEVELOPMENT.md guide
Memory Cascade on Message Changes
- Memories auto-extracted from messages now tracked with provenance links
- Deleting a message prompts: delete/keep/regenerate associated memories
- Regenerating a response (swipe) automatically cleans up old memories
- Memory cards show "Source" link navigating to and highlighting source message
- New chat settings section for default memory cascade behavior
- Repository methods:
deleteBySourceMessageId(),countBySourceMessageId() - Message navigation utilities for cross-page scroll-to-message functionality
Search & Replace Tool
- Bulk text replacement across messages and memories
- Scoping: single chat, all chats for a character, or all chats
- Wizard-style UI: scope selection → search/replace input → preview counts → confirmation
- Entry points: chat ToolPalette, character view page
- Automatically regenerates memory embeddings after content changes
Plugin System
npm-based Plugin Installation
- Browse
qtap-plugin-*packages from npm registry in Settings → Plugins - Install/uninstall APIs with manifest validation and version compatibility checking
- Support for scoped npm packages (
@org/qtap-plugin-*) - Site-wide and per-user plugin installation scopes
- Docker volume configuration for persistent plugin storage
- Note: Gab AI provider moved to external plugin at
@quilltap/qtap-plugin-gab-ai
Self-Contained Theme Plugin Architecture
- Theme plugins now support module-based loading (similar to provider plugins)
- Themes can embed tokens, CSS overrides, and fonts directly in the module export
ThemePlugininterface withThemeMetadata,ThemeTokens,FontDefinition- Theme registry tries module-based loading first, with file-based fallback
- All existing themes (Ocean, Earl Grey, Rains) migrated to self-contained format
Plugin-Registered Provider Configuration
- Extended
LLMProviderPlugininterface with runtime configuration:messageFormat,charsPerToken,toolFormat,cheapModels,defaultContextWindow
- Query methods in provider registry eliminate hardcoded provider data
- Core lib files query registry first, with fallback to legacy constants
- Adding/removing providers now only requires adding/removing the plugin
Roleplay Template Plugin Types
- Added
RoleplayTemplatePlugin,RoleplayTemplateConfig,RoleplayTemplateMetadatatypes - New utilities:
createRoleplayTemplatePlugin(),createSingleTemplatePlugin() - Validation utilities:
validateTemplateConfig(),validateRoleplayTemplatePlugin() - Documented in
docs/TEMPLATE_PLUGIN_DEVELOPMENT.md
Theming & Styling
Theme Redesigns
- Ocean Theme (v1.2.5): New quirky, childlike underwater aesthetic
- Coral reef background image visible on all main pages
- Glass-effect panels with backdrop blur
- Color palette: coral pink, teal accent, jellyfish purple, octopus orange, seaweed green
- Nunito font for playful typography
- Fixed participant sidebar contrast issues
- Earl Grey Theme: Modernized with ChatGPT-inspired design
- Rains Theme: Modernized with ChatGPT-inspired design, serif headings
New qt-* Utility Classes
- Avatar utilities:
qt-avatar-name,qt-avatar-titlewith CSS variables - Button utilities:
qt-button-successstandalone class - Page utilities:
qt-page-container,qt-page-toolbar - Sidebar utilities:
qt-left-sidebar-brand, width variables - Card grid variants:
qt-card-grid-2,qt-card-grid-3 - Improved success button contrast with dark text on bright green
Chat Improvements
XML Tool Call Detection
- Detects and executes tool calls from LLMs like DeepSeek that emit XML tool syntax
- Supports formats: DeepSeek (
<function_calls><invoke>), Claude-style, generic (<tool_call>) - XML tool calls stripped from displayed messages; execution status shown separately
- Runs for ALL providers, not just pseudo-tool mode
Timestamp Injection in System Prompts
- Configurable modes: disabled, conversation start only, or every message
- Format options: friendly, ISO 8601, date only, time only, or custom format
- Fictional time support: base timestamp that advances with real elapsed time
- Template variable
{{timestamp}}for custom placement - Global default in Chat Settings, per-chat override available
Scenario Prompt for New Chats
- Add optional scenario text when creating a new chat
- Available in both New Chat page and ChatCreationDialog
- Scenario stored in chat context for character use
Message Re-attribution
- Re-attribute messages to different participants
- Works for both USER and ASSISTANT messages
- Automatically deletes associated memories when re-attributed
- After re-attribution, scrolls to updated message
All-LLM Chat Improvements
- Turn manager auto-continues in all-LLM chats (no more "user's turn")
- Single-character all-LLM chats continue in monologue mode
- Pause logic at intervals (3, 6, 12... turns) prevents runaway API usage
- Resume button properly triggers next speaker
Bug Fixes
- Chat page content no longer cut off by page toolbar
- Strip duplicate character name prefixes from LLM responses (multi-character chats)
- Resolve "Maximum update depth exceeded" errors in React 19/Next.js 16
- Prevent render loop in DevConsoleProvider with batched log updates
- Deduplicate jobs in tasks queue to prevent React key collision
- Memory regeneration respects message participantId in multi-character chats
- After deleting a message, scroll to next message instead of bottom
- Chat creation dialog now responsive with scrollable content
- Improved error logging for undefined error messages
- Fix TypeScript type errors in provider plugins (role types, stopSequences)
Refactoring
Backend Refactoring (6 Phases)
- Phase 1: Migrated 101 API routes to
createAuthenticatedHandlermiddleware (~1,500 lines saved) - Phase 2: Standardized API responses across 76+ route files, centralized utilities
- Phase 3: User-scoped repository refactoring with generic base classes (32% reduction)
- Phase 4: Batch query methods to eliminate N+1 patterns
- Phase 5: Large service decomposition
context-manager.ts(1,266 lines) → 4 focused modulessearch/route.ts(721 lines) → 73 lines with extracted servicechats/import/route.ts(763 lines) → 131 lines
- Phase 6: Plugin registry integration; legacy fallback constants consolidated and deprecated
Frontend Refactoring
- Created shared hooks:
useDialogState,useWizardState,useAutoAssociate,useImageNavigation - Created
BaseModalcomponent consolidating modal structure from 17 components - Created shared
ProfileCardandProfileListcomponents - Extracted wizard step components for export/import dialogs
- Export dialog: 424 → ~250 lines; Import dialog: 565 → ~250 lines
Dead Code Cleanup
- Removed duplicate
components/characters/system-prompts/directory - Removed unused debug components and auth placeholder files
- Removed completed migration scripts
- Removed unused barrel/index files for better tree-shaking
- Removed backwards-compatibility shims
Logging Improvements
LLM API Debug Logging
- All LLM API calls now log request and response details at debug level
- Chat messages, cheap LLM tasks, embeddings, image generation, greeting generation
- Consistent format with
context: 'llm-api'for easy filtering
Reduced Verbose Logging
- Removed ~2,900 debug log entries per typical session
- Eliminated cache hit logs, successful validation logs, entry/exit pairs
- Removed MongoDB connection status checks, repository instantiation logs
- Removed UI lifecycle debug logs (theme, settings, search replace)
- Kept only error logs, warnings, and initialization info logs
Infrastructure
Migrations Consolidated
- All migration files moved from
lib/mongodb/migrations/to upgrade plugin - Post-login migrations now in upgrade plugin as
user-migrations.ts - Upgrade plugin version: 1.0.11
Test Improvements
- 114 new unit tests for characters-not-personas features
- Unit tests for sidebar, memory cascade, and navigation features
- Mock repository fixtures for auth middleware mocking
Documentation
- New
docs/THEME_PLUGIN_DEVELOPMENT.mdwith step-by-step tutorial - New
docs/TEMPLATE_PLUGIN_DEVELOPMENT.mdfor roleplay template plugins - Updated
features/complete/new_ui_layout.mddocumenting sidebar navigation - Updated
features/complete/characters_not_personas.mdfor migration details - Package documentation: plugin-types, plugin-utils, theme-storybook, create-quilltap-theme