1.7.71 - 2026-03-12
Fixed
- Fix mixed atom/string key error in
EntityData.maybe_add_position/1when auto-assigning position to string-keyed params - Fix same mixed key error in
EntityData.maybe_add_created_by/1 - Fix
FOR UPDATEwith aggregate function error inEntityData.next_position/1(PostgreSQL0A000 feature_not_supported)
1.7.70 - 2026-03-12
Added
- Add PhoenixKitGlobals component for JavaScript globals injection
- Add metadata JSONB field to comments schema (V82 migration)
- Add reply indicators to admin comments page
- Add test comments seed script for visual verification
- Add admin page generator category index pages with automatic route registration
- Add duplicate validation (ID, URL, label) to admin page generator
- Add compile-time warning for unresolved legacy admin LiveView modules
- Add
phoenix_kit_app_base/0helper to Routes utility
Fixed
- Fix dimension form inputs clearing each other on change
- Fix MarkdownEditor toolbar not working on LiveView navigation
- Fix CommentsComponent crash on post details page (
resource_id→resource_uuid) - Fix credo alias ordering in integration module
- Fix WebP transparency loss in center-crop image processing
- Fix 304 Not Modified support in FileController
Changed
- Update admin page generator to use flat
admin_dashboard_tabsconfig withlive_viewfield - Deprecate legacy
admin_dashboard_categoriesconfig format (warning on use) - Auto-infer LiveView modules from URL paths for legacy admin categories
- Add
attr :rest, :globaltophoenix_kit_globalscomponent
1.7.69 - 2026-03-10
- Add responsive multi-column card grid to
table_defaultcomponent: 1 col on mobile, 2 cols on md, 3 cols on lg breakpoints - Style card view cards with
bg-base-200andshadow-smto visually distinguish them from the page background
1.7.68 - 2026-03-10
- Merge upstream changes: publishing editor rework, AI translation, bulk group actions, V77/V78 migration fixes, scheduled jobs queue, Settings.Queries module, plugin migration callbacks
1.7.67 - 2026-03-10
Breaking Changes (requires manual steps in parent app)
- V79 migration rewritten in-place: drops
phoenix_kit_mailing_*tables, createsphoenix_kit_newsletters_* - Oban queue renamed:
mailing_delivery→newsletters_delivery(updateconfig/config.exs) - Settings keys changed:
mailing_enabled→newsletters_enabled,mailing_default_template→newsletters_default_template,mailing_rate_limit→newsletters_rate_limit - Email template category value changed:
"mailing"→"newsletters"(existing templates need DB update) - URL paths changed:
/admin/mailing/*→/admin/newsletters/*,/mailing/unsubscribe→/newsletters/unsubscribe
Changed
- Rename
PhoenixKit.Modules.Mailing→PhoenixKit.Modules.Newslettersand all submodules - Rename DB tables:
phoenix_kit_mailing_lists/list_members/broadcasts/deliveries→phoenix_kit_newsletters_* - Rename Elixir modules:
Mailing.List,Mailing.Broadcast,Mailing.Delivery,Mailing.ListMember,Mailing.Broadcaster,Mailing.Workers.DeliveryWorker→Newsletters.* - Rename web modules:
Mailing.Web.*→Newsletters.Web.* - Rename route module:
PhoenixKitWeb.Routes.MailingRoutes→NewslettersRoutes - Rename dashboard tabs:
:admin_mailing→:admin_newsletters
1.7.66 - 2026-03-09
- Clean up publishing module: fix UUID routing bugs (slug vs UUID in version creation, PubSub broadcasts, translation status), remove dead code and filesystem path references
- Optimize publishing DB queries: batch loading, ListingCache for dashboard, bulk UPDATE for translation statuses, debounced PubSub updates
- Rework editor to two-column layout with content-first design (title + editor left, metadata right)
- Rework AI translation: integrate AI prompt system, modal UI replacing slidedown, translation progress recovery across page refreshes
- Replace primary language banner with compact tooltip on language switcher
- Add skeleton loading UI for language switching in publishing editor
- Fix collaborative editing: spectator initial sync, lock promotion JS updates, lock expiration timer
- Fix admin sidebar highlighting for publishing group pages
- Fix custom fields card hidden when no field definitions are registered
- Add bulk "Add to Group" action on posts index with dynamic group filter dropdown
1.7.65 - 2026-03-08
- Fix V77 migration crash: role_id column renamed to role_uuid in UUID migration
1.7.64 - 2026-03-08
- Remove legacy filesystem paths from publishing module — strip all
.phkvirtual path references from mapper, editor, listing, and preview - Switch all event handlers and navigation from path-based to UUID-based routing
- Fix timestamp-mode posts returning 404: normalize post_time to zero seconds, with hour:minute-only fallback query for legacy data
- Add collision prevention for same-minute timestamp posts (auto-bump to next minute, max 60 attempts)
- Add unique_constraint on (group_uuid, post_date, post_time) to schema
- Render empty listing page instead of 404 when group exists but has no published posts
- Show Primary Language banner during new post creation
- Add missing PubSub handlers to publishing Index view (version_created, version_live_changed, version_deleted) with catch-all
- Fix primary language migration using removed path field — now uses UUID/slug directly
- Remove cache management UI from listing page (accessible via settings only)
- Add safety guards to URL builders: raise ArgumentError on nil UUID instead of producing broken URLs
1.7.63 - 2026-03-06
- Remove filesystem storage from publishing module — delete Storage, DualWrite, and all storage/* submodules (~7k lines removed)
- Add LanguageHelpers and SlugHelpers as standalone modules, simplify to DB-only throughout
- Fix slug conflict clearing bug:
clear_url_slugs_for_conflictspassed wrong slug to DB cleanup - Fix ngettext interpolation in primary language migration modal (literal
%{count}in UI) - Clean up stale filesystem references in comments, docs, and user-facing strings
- Fix V77/V78 migration crashes when UUID columns are missing (tables created after V56 ran)
- Simplify V77/V78 migrations — remove over-engineered column detection, rely on idempotent patterns
- Fix email tracking bug:
handle_delivery_resultusedget_log!(raises) in a nil-matching branch; addget_log/1non-bang wrapper and remove unused public functions - Add
migration_module/0callback to plugin module system —mix phoenix_kit.updateauto-discovers and runs plugin migrations - Add
Settings.Queriesmodule for database operations - Add dedicated queue and 1-day pruner for scheduled jobs cron worker
- Fix user dashboard navigation links
- Fix ueberauth providers configuration format in installer
1.7.62 - 2026-03-05
- Fix UnicodeConversionError crash in integration plug when response body contains non-UTF8 binary data
- Fix DB browser rendering of raw binary values (e.g. UUID bytes) in table and activity views
- Add V78 migration: backfill missing AI module columns skipped by V41 conditional checks
- Add
reasoning_enabled,reasoning_effort,reasoning_max_tokens,reasoning_excludetophoenix_kit_ai_endpoints - Add
prompt_uuid,prompt_nametophoenix_kit_ai_requestswith index and FK constraint
- Add
1.7.61 - 2026-03-04
- Replace
plug_cowboywithbandit ~> 1.0as HTTP adapter (Phoenix 1.8 default) - Remove stale deps from lock:
cowboy,cowlib,cowboy_telemetry,plug_cowboy,combine,dns_cluster,phoenix_live_dashboard,poolboy,timex,tzdata - Remove deprecated
fetch_live_flashplug - Add audit_log query limits
- Fix atom table exhaustion risk and remove duplicate function
- Update excluded_apps list in route resolver to match current deps
- Update HTML comments to EEx format in templates and components
- Clean up stale dep spec and dead commented-out code
1.7.60 - 2026-03-03
- Remove legacy FS→DB migration modules:
DBImporter,MigrateToDatabaseWorker,ValidateMigrationWorker - Remove
JsIntegrationinstall/update module (JS setup is now manual) - Remove all "Import to DB" / "Migrate to Database" UI buttons from publishing pages
- Remove DB import/migration PubSub broadcast functions and LiveView handlers
- Simplify publishing listing: drop
fs_post_count,needs_import,db_import_in_progressassigns - Move post title field into the editor content column with larger styling
- Simplify editor save button logic (always clickable unless readonly/autosaving)
- Add
enrich_with_db_uuids/2to ListingCache for UUID-based admin links in filesystem mode - Refine Sync module: migrate
connection_idreferences toconnection_uuid - Update publishing README to reflect DB-only storage model
1.7.59 - 2026-03-03
- Fix V75: use CASCADE when dropping
phoenix_kit_id_seq(meta tablephoenix_kit.idDEFAULT depends on it)
1.7.58 - 2026-03-03
- Add V75 migration: fix uuid column defaults and cleanup
- Set
DEFAULT uuid_generate_v7()on 27 tables missing it (Category A tables — V72 rename dropped old sequence DEFAULT) - Fix 4 tables using
gen_random_uuid()(UUIDv4) →uuid_generate_v7()(UUIDv7) - Drop orphaned
phoenix_kit_id_seqsequence
- Set
1.7.57 - 2026-03-03
- Fix V74 migration: skip tables without bigint
id(e.g. publishing tables created with UUID PKs) - Fix V74: use
DROP COLUMN id CASCADEto handle dependent FK constraints in one statement
1.7.56 - 2026-03-03
- Add V74 migration: drop integer
id/_idcolumns, promoteuuidto PK on all tables- Drop all FK constraints referencing integer
idcolumns (dynamic discovery) - Drop ~95 integer FK columns across all tables (sourced from uuid_fk_columns.ex + extras)
- Drop bigint
idPK + promoteuuidto PK on 47 Category B tables - After V74, every PhoenixKit table uses
uuidas its primary key — no integer PKs remain
- Drop all FK constraints referencing integer
- Remove
source: :idfromwebhook_event.exschema (DB column now matches field name)
1.7.55 - 2026-03-03
- Fix scheduled_job.ex
source: :idregression — PR #383 reintroduced mapping to dropped DB column - Add V73 migration: pre-drop prerequisites for Category B UUID migration
- SET NOT NULL on 7 uuid columns (
ai_endpoints,ai_prompts,consent_logs,payment_methods,role_permissions,subscription_types,sync_connections) - CREATE UNIQUE INDEX on 3 tables (
consent_logs,payment_methods,subscription_types) - ALTER INDEX RENAME on 4 indexes to match renamed columns (
post_tag_assignments,post_group_assignments,post_media,file_instances)
- SET NOT NULL on 7 uuid columns (
- Add
RepoHelper.get_pk_column/1— queriespg_indexfor PK column name, falls back to"id" - Fix DB explorer to use dynamic PK column in
fetch_row,table_preview, and notify trigger - Fix Sync API controller to use dynamic PK column in
fetch_filtered_recordsandbuild_where_clause - Fix Sync connection notifier to use dynamic PK column in
insert_recordandbuild_update_clause - Update 4 schema constraint names to match V72 column renames (
post_id→post_uuid,file_id→file_uuid) - Remove dead
:user_idfrom OAuthreplace_all_exceptlist
1.7.54 - 2026-03-03
- Add V72 migration: rename PK column
id→uuidon 30 Category A tables (metadata-only, instant) - Add 4 missing FK constraints:
comments.user_uuid,comments_dislikes.user_uuid,comments_likes.user_uuid,scheduled_jobs.created_by_uuid - Remove
source: :idmapping from 29 Category A Ecto schemas — DB column now matches field name directly
1.7.53 - 2026-03-02
- Add
mix phoenix_kit.doctordiagnostic command — detects migration version vsschema_migrationsdiscrepancies, stale COMMENT tags, and common DB issues - Add
update_modetomix phoenix_kit.update— skips heavy DB components (Oban, cache warmers, settings queries) and caps Ecto pool at 2 during migrations to prevent DB saturation - Run
ecto.migratein-process instead ofSystem.cmdfor better error reporting and reliability - Fix three migration hang root causes: NULL UUIDs causing infinite backfill loop, orphaned FK references blocking constraint creation, varchar uuid columns crashing Ecto schema loader
- Fix migration hang: disable DDL transaction in generated migration wrapper — prevents entire multi-version migration from running in a single transaction holding AccessExclusiveLock
- Fix V50 migration hang: add
lock_timeoutforphoenix_kit_bucketsALTER TABLE and check column existence before ALTER - Fix settings cache race: warm synchronously in
init/1whensync_init: true; fixwarm_critical_datainserting{key, value, nil}3-tuples when TTL is nil - Fix cache
sync_initblocking supervisor for 60s when DB is overloaded - Fix startup DB timeout: defer
Dashboard.Registryinit and reorder supervisor children - Silence cache warmer spam and auto-grant warning when
role_permissionstable doesn't exist yet - Fix
gen.migrationtask: generate UUID primary keys anduser_uuidFK instead of integer-based - Fix broken GDPR anonymization: remove leftover
user_id: nilfromupdate_allcalls - Rename
_id→_uuidacross all remaining application code: billing, shop, storage, entities, sync, emails, tickets, permissions, roles, connections, publishing, and user_notifier - Rename function names:
find_role_by_id→find_role_by_uuid,parse_id→parse_uuid,import_id→import_uuid - Fix Dialyzer warning: remove unreachable pattern match in cache warming
- Fix V56/V63 migration crash:
email_log_uuidbackfill fails withdatatype_mismatchwhenphoenix_kit_email_logs.uuidischaracter varyinginstead of nativeuuidtype - Fix UUIDFKColumns: replace broken Elixir
rescuewith PostgreSQLEXCEPTIONhandler inside DO blocks — prevents outer transaction abort on backfill failure - Add
::uuidexplicit cast in all UUIDFKColumns backfill SQL to handle varchar source columns gracefully - Fix V56: add pre-step to convert varchar
uuidcolumns on all FK source tables to nativeuuidtype beforeUUIDFKColumns.upruns - Fix V63: wrap
matched_email_log_uuidbackfill in DO block with EXCEPTION handler and::uuidcast - Add V70 migration: re-backfills
email_log_uuidandmatched_email_log_uuidfor installs where V56/V63 silently skipped the backfill; resets stale random UUIDs written by the V56 NULL-fill fallback - Add investigation doc:
dev_docs/investigations/2026-03-01-varchar-uuid-migration-bug.md
1.7.52 - 2026-02-28
- Add translatable
titlefield to posts and fix timestamp-mode post handling - Add V69 migration: make role table integer FK columns nullable
- Add
mix precommitalias (compile → format → credo --strict) tomix.exs - Update AGENTS.md with pre-commit instructions, replacing old minimal checklist
- Rename
Scope.user_id→Scope.user_uuidfor consistency - Rename
user_id→user_uuidacross event handlers, templates, and messages - Rename
user_id→user_uuidin emails rate_limiter;log_id→log_uuidin emails interceptor, SQS processor, and sync task - Rename
user_id→aws_user_idin AWS credentials verifier - Rename
resource_id→resource_uuidin scheduled jobs - Rename
_id→_uuidin billing, shop, AI, entities, legal, posts, tickets, storage, scheduled jobs, and permissions - Rename
_id→_uuidacross metadata, forms, helpers, and tests - Replace
DateTime.utc_now()withUtilsDate.utc_now()across codebase - Remove redundant
connection_idparameter from syncconnection_notifier - Fix crash bugs:
.user_idstruct access →.user_uuidin billing events and order_form - Fix UUID field references for webhook_events and post images
- Fix duplicate map keys left from UUID migration in hooks and rate_limiter
- Fix alias ordering Credo violations across 18 files
- Fix timestamp-mode post lookups, migration ordering, and admin UI (PR #376 review follow-up)
- Fix
tab_callback_contextmissing clause; demote double-wrap log to debug - Add dialyzer ignore for unused
tab_callback_contextclause - Update integration guide, making-pages-live guide, dashboard README, and usage-rules to use UUID terminology
1.7.51 - 2026-02-26
- Add V64 migration: fix login crash by replacing
user_idcheck constraint withuser_uuidon user tokens table - Add V65 migration: rename
SubscriptionPlantoSubscriptionType(table, columns, indexes, constraints) - Rename
SubscriptionPlanschema, context functions, events, routes, LiveViews, and workers toSubscriptionType - Add orphaned media file cleanup system
mix phoenix_kit.cleanup_orphaned_filestask with dry-run and--deletemodesDeleteOrphanedFileJobOban worker with 60s delay and orphan re-check before deletion- Orphan filter toggle and "Delete all orphaned" button in Media admin UI
- Add Delete File button with confirmation modal to Media Detail page
- Add secondary language slug uniqueness validation via JSONB query in entity data
- Rename
seed_title_in_datatoseed_translatable_fieldsin entity data form - Unify slug labels to "Slug (URL-friendly identifier)" across entity forms
- Standardize dev_docs file naming convention (
{date}-{kebab-case}-{type}.md) - Fix orphan detection crash: remove references to non-existent
phoenix_kit_shop_variantstable - Fix
String.trim(nil)crash in SQS workers when AWS credentials not configured - Fix default preload
:planto:subscription_typeinlist_subscriptions/1andlist_user_subscriptions/2 - Fix
auth.exstoring integerfile.idinstead offile.uuidfor avatar custom field - Fix
create_subscription/2dead code and key mismatch — now accepts:subscription_type_uuidas preferred key - Fix
change_subscription_type/3reading stalesubscription_type_idinstead ofsubscription_type_uuid - Fix AWS Config returning empty string instead of nil when credentials unconfigured
- Fix email log
Accessbehaviour error when called withEmailLogDatastruct - Fix
Interceptorusing deprecatedlog.idinstead oflog.uuidin header and event - Fix shop billing cascade: check
disable_system()result and log on failure - Replace
defpproxy wrappers withimportin 4 shop LiveViews (cart, catalog, checkout) - Rename
post_idtopost_uuidin 5 private post functions - Remove legacy integer ID function clauses from posts and billing modules
- Remove accidentally committed
.beamfiles, add*.beamto.gitignore - Remove empty legacy
subscription_plan_form.exandsubscription_plans.ex - Add doc notes about performance for
all_admin_tabs/0andget_config/0 - Remove dead
_plugin_session_namevariable from integration routes
1.7.50 - 2026-02-25
- Fix
defp show_dev_notice?CLAUDE.md violation: replace private helper with<.dev_mailbox_notice>Phoenix Component- New component at
lib/phoenix_kit_web/components/core/dev_notice.exwithmessageandclassattrs - Removed from
login.ex,registration.ex,magic_link.ex,forgot_password.ex,dashboard/settings.ex - Updated all corresponding HEEX templates to use
<.dev_mailbox_notice>
- New component at
- Fix duplicate route alias compilation warnings in
phoenix_kit_authenticated_routes/1- Split module-scope routes into
authenticated_live_routes/0andauthenticated_live_locale_routes/0 - Locale variants now use
_localesuffix (e.g.:shop_user_orders_locale)
- Split module-scope routes into
- Fix undeclared
sidebar_after_shopattr inshop_layout/1component - Fix
maybe_redirect_authenticated/1hardcoded"/"redirect — usesigned_in_path(socket)consistently - Fix double
Map.from_structinEmails.Interceptor.create_email_log/2— redundant call removed
1.7.49 - 2026-02-24
- Add V63 migration: UUID companion column safety net round 2
- Add
uuididentity column tophoenix_kit_ai_accounts(missed by V61 due to wrong table name) - Add
account_uuidcompanion tophoenix_kit_ai_requests(backfilled from ai_accounts) - Add
matched_email_log_uuidtophoenix_kit_email_orphaned_events(backfilled from email_logs) - Add
subscription_uuidtophoenix_kit_invoices(backfilled from subscriptions) - Add
variant_uuidtophoenix_kit_shop_cart_items(nullable, no variants table) - Update Invoice, AI Request, and CartItem schemas with new uuid companion fields
- Add
1.7.48 - 2026-02-24
- Add V62 migration: rename 35 UUID-typed FK columns from
_idsuffix to_uuidsuffix- Enforces naming convention:
_id= integer (legacy/deprecated),_uuid= UUID - Groups: Posts module (15 renames), Comments (4), Tickets (6), Storage (3), Publishing (3), Shop (3), Scheduled Jobs (1)
- No data migration — columns already held correct UUID values, pure rename
- All DB operations idempotent (IF EXISTS guards) — safe on installs with optional modules disabled
- Update all Ecto schemas, context files, web files, and tests to use new field names
- Enforces naming convention:
1.7.47 - 2026-02-24
- Fix V13 migration down/0 to use
remove_if_existsinstead ofremovefor idempotency- Fixes "column aws_message_id does not exist" error when rolling back V13
1.7.46 - 2026-02-24
- Add plugin module system with
PhoenixKit.Modulebehaviour,ModuleRegistry, and zero-config auto-discovery- 5 required + 8 optional callbacks with sensible defaults via
use PhoenixKit.Module - Auto-discovers external modules by scanning
.beamfiles for@phoenix_kit_moduleattribute - All 21 internal modules now implement the behaviour, removing 786 lines of hardcoded tab enumeration
- External module admin routes auto-generated at compile time from
admin_tabswithlive_viewfield
- 5 required + 8 optional callbacks with sensible defaults via
- Add live sidebar updates via PubSub when modules are enabled/disabled
- Add server-side authorization on module toggle events (prevents crafted WebSocket bypass)
- Add startup validation: duplicate module keys, permission key mismatches, duplicate tab IDs, missing permission fields
- Add compile-time warnings for route module and LiveView compilation failures
- Standardize AI, Billing, and Shop to use
update_boolean_setting_with_module/3(consistent with all other modules) - Fix billing→shop cascade: shop now disabled after billing toggle succeeds (prevents orphaned state)
- Fix
Tab.permission_granted?/2to handle atom permission keys instead of silently bypassing checks - Fix
static_children/0to catch modulechildren/0failures instead of crashing the supervisor
1.7.45 - 2026-02-23
- Fix auth forms mobile overflow on small screens (px-4 added to all form containers)
- Fix daisyUI v5 compliance: remove deprecated
input-borderedfrom<.input>component and all auth templates - Fix
<.header>hardcodedtext-zinc-*colors replaced with semantictext-base-contentfor dark theme support - Convert forgot_password, reset_password, confirmation, confirmation_instructions to unified card layout
- Add missing
LayoutWrapper.app_layoutwrapper to confirmation form - Fix V40 migration silently skipping V32-V39 tables due to Ecto command buffering
- Root cause:
repo().query()(immediate) couldn't see buffered table creation commands - V31's
flush()was the last flush before V40, creating a clean V31/V32 split - Add
flush()to V40 and V56 to prevent recurrence on new installations
- Root cause:
- Add V61 migration: uuid column safety net for 6 tables missed by V40
- Tables fixed: admin_notes, ai_requests, subscriptions, payment_provider_configs, webhook_events, sync_transfers
- Also adds
created_by_uuidFK column to phoenix_kit_scheduled_jobs
1.7.44 - 2026-02-23
- Add Publishing module: DB storage, public post rendering, and i18n support
- Add unified
admin_page_headercomponent, replace all per-page admin headers - Add try/rescue to all form save handlers to prevent silent data loss on validation errors
- Add skeleton loading placeholders for entity language tab switching
- Add "Update Entity" submit button at top of entity form for quicker saves
- Add responsive card view to entities listing, remove stats/filters
- Memoize
IbanData.all_specs/0with compile-time module attribute for performance - Auto-register built-in comment resource handlers
- Make entity slug translatable and move it into Entity Information section
- Move multilang info alert above language tabs with improved explanation
- Tighten language tab spacing, replace daisyUI tab classes with compact utilities
- Remove hardcoded category column, filter, and bulk action from data navigator
- Fix CommentsComponent crash on post detail page
- Fix Entity update crash from DateTime microseconds in
:utc_datetimefields - Fix
email_templatesschema/migration mismatch breaking fresh installs - Fix locale disappearing from admin URLs on sidebar navigation
- Fix badge component height on mobile devices
- Fix cached plan error spam during migrations with column type changes
- Fix CSS specificity debt and inline styles replaced with Tailwind classes
- Fix mobile responsiveness across admin panel
- Replace remaining
DateTime.utc_now()withUtilsDate.utc_now()in all DB write contexts
1.7.43 - 2026-02-18
- Standardize all schemas to
:utc_datetimeandDateTime.utc_now()across 73 files- Replace
:utc_datetime_usecwith:utc_datetimeandNaiveDateTimewithDateTime - Add V58 migration to convert all timestamp columns across 68 tables from
timestamptotimestamptz - Fix UUID FK backfill to handle NULL UUIDs before applying NOT NULL constraints
- Replace
- Fix DateTime.utc_now() microsecond crashes in 19 files after
:utc_datetimeschema migration- Add
DateTime.truncate(:second)to allDateTime.utc_now()calls in contexts - Affected: settings, billing, shop, emails, referrals, tickets, comments, auth, permissions, roles
- Add
- Fix Language struct Access error on admin modules page and all bracket-access-on-struct bugs
- Add 20 typed structs replacing plain maps across billing, entities, sync, emails, AI, and dashboard
- Billing: CheckoutSession, SetupSession, WebhookEventData, PaymentMethodInfo, ChargeResult, RefundResult, ProviderInfo
- Other: AIModel, FieldType, EmailLogData, LegalFramework, PageType, Group, TableSchema, ColumnInfo, SitemapFile, TimelineEvent, IbanData, SessionFingerprint
- Fix
register_groupsto convert plain maps toGroupstructs, preventing sidebar crashes - Fix CastError in live sessions page by using UUID lookup instead of integer id
- Fix guest checkout flow: relax NOT NULL on legacy integer FK columns, fix transaction error double-wrapping
- Add return_to login redirect support for seamless post-login navigation (e.g., guest checkout)
- Add cart merge on login for guest checkout sessions
- Fix shop module .id to .uuid migration in Storage image lookups and import modules
- Fix hardcoded "PhoenixKit" fallback in admin header project title
- Fix admin sidebar submenu not opening on localized routes
- Fix 2 dialyzer warnings in checkout session and UUID migration
- Add multi-language support for Entities module
- New
Multilangmodule with pure-function helpers for multilang JSONB data - Language tabs in entity form, data form, and data view (adaptive compact mode for >5 languages)
- Override-only storage for secondary languages with ghost-text placeholders
- Lazy re-keying when global primary language changes (recomputes all secondary overrides)
- Translation convenience API:
Entities.set_entity_translation/3,EntityData.set_translation/3,EntityData.set_title_translation/3, and related get/remove functions - Multilang-aware category extraction in data navigator and entity data
- Non-translatable fields (slug, status) separated into their own card
- Required field indicators hidden on secondary language tabs
- Title translations stored as
_titlein JSONB data column (unified with other field translations) - Slug generation disabled on secondary language tabs
- Validation error messages wrapped in gettext for i18n
- 124 pure function tests for Multilang, HtmlSanitizer, FieldTypes, FieldType
- New
- Fix entities multilang review issues
- Unify title storage in JSONB data column, fix rekey logic for primary language changes
- Add
seed_title_in_datafor lazy backwards-compat migration on mount - Replace
String.to_existing_atomwith compile-time@preserve_fieldsmap - Fix 7 remaining issues from PR #341 permissions review
- Add catch-all fallback clauses to Scope functions to prevent FunctionClauseError
- Sort
custom_keys/0explicitly instead of relying on Erlang map ordering
1.7.42 - 2026-02-17
- Use PostgreSQL IF NOT EXISTS / IF EXISTS for UUID column operations
- Replace manual column_exists? checks with native DDL guards in V56 and UUIDFKColumns
- Makes migrations more robust and idempotent
1.7.41 - 2026-02-16
- Fix FK constraint creation crash when UUID target tables lack unique indexes
- Ensure unique indexes on all FK-target uuid columns before adding FK constraints
- Fixes
invalid_foreign_keyerror onphoenix_kit_ai_endpointsand other tables
1.7.40 - 2026-02-16
- Remove redundant mb-4 wrapper div around back buttons in 4 admin pages
- Add V57 migration to repair missing UUID FK columns
- Update language filter to use languages_official instead of languages_spoken
1.7.39 - 2026-02-16
- Complete UUID migration (Pattern 2) across all remaining modules
- Migrate posts, tickets, storage, comments, referrals, and connections schemas to UUID-based user references
- Migrate posts like/dislike/mention functions to accept UUID user identifiers
- Fix stale
.idaccess across posts, storage, tickets, email, connections, and image downloader - Fix ProcessFileJob and media_detail to use user_uuid instead of deprecated user_id
- Replace legacy
.idaccess with.uuidacross mix tasks and admin presence - Remove legacy integer fields from RoleAssignment schema
- Fix 10 Dialyzer warnings across comments, connections, referrals, and shop modules
- Harden permissions system with security and correctness fixes
- Fix security and correctness issues in permissions system
- Add permission edit protection for own role and higher-authority roles
- Add Owner protection to
can_edit_role_permissions/2and standardize UUID usage - Fix edge cases, silent failures, and crash risks in permissions and roles
- Fix dual-write in
set_permissions/3and cross-view PubSub refresh - Fix permissions summary to count only visible keys
- Fix multiple bugs in custom permission keys and admin routing
- Add auto-grant of custom permission keys to Admin role
- Add defensive input validation to custom permission key registration
- Fix
unless/elsetoif/elsefor Credo compliance
- Add gettext i18n to roles and permissions admin UI
- Add Level 1 test suite for permissions, roles, and scope (156 tests)
- Fix responsive header layout across all admin pages
- Add responsive text classes (
text-2xl sm:text-4xl/text-base sm:text-lg) to all page headers - Fix missed responsive text classes in storage, media selector, and publishing pages
- Add responsive text classes (
- Replace dropdown action menus with inline buttons in table rows
- Fix require_module_access plug to check feature_enabled like LiveView on_mount
- Fix admin sidebar wipe when enabling/disabling modules
- Add
get_role_by_uuid/1API and update integration guide - Restore admin edit button in user dropdown and add product links in cart
- Fix selected_ids to use MapSet for O(1) lookups
- Fix Dialyzer CI failure for ExUnit.CaseTemplate test support files
- Fix Credo nesting and Dialyzer MapSet opaque type warnings
- Update Permissions Matrix page title and section labels
1.7.38 - 2026-02-15
- Fix Ecto.ChangeError in entities by using DateTime instead of NaiveDateTime
- Fix infinite recursion risk in category circular reference validation
- Add DateTime inconsistency audit report with phased migration plan
- Add custom permission key auto-registration for admin tabs
- Custom admin tabs with non-built-in permission keys now auto-register with the permission system
- Custom keys appear in the permission matrix and roles popup under "Custom" section
- Owner role automatically gets access to custom permission keys
- Custom LiveView permission enforcement via cached
:persistent_termmapping - New API:
Permissions.register_custom_key/2,unregister_custom_key/1,custom_keys/0,clear_custom_keys/0 - Key validation: format check (
~r/^[a-z][a-z0-9_]*$/),ArgumentErroron built-in key collision
1.7.37 - 2026-02-15
- Fix UUID PR review issues: aliases, dashboard_assigns, and naming issues
- Fix V56 migration: add subscription_plans to uuid column setup lists
- Add admin edit buttons and improve shop catalog UX
- Add registry-driven admin navigation system
- Fix localized field validation in Shop forms
- And bunch of bugs and optimizations
1.7.36 - 2026-02-13
- Add storefront sidebar filters, category grid, and dashboard shop integration
- New
CatalogSidebarcomponent: reusable sidebar with collapsible filter sections and category tree navigation - New
FilterHelpersmodule: filter data loading, URL query string building, price/vendor/metadata filtering - Storefront filter configuration in admin settings: enable/disable filters, edit labels, add metadata option filters
- Auto-discovery of filterable product metadata options (e.g., Size, Color) with one-click filter creation
- Price range filter with min/max inputs and range display
- Vendor and metadata option filters with checkbox selection and active count badges
- Filter state persisted in URL query params for shareable filtered views
- "Show Categories in Shop" setting: displays category card grid above products on main shop page
- Sidebar category navigation always visible in sidebar (decoupled from grid setting)
- Dashboard layout integration: shop filters and categories rendered in dashboard sidebar for authenticated users
sidebar_after_shopslot in dashboard layout for injecting custom sidebar content- Product detail page updated to use shared sidebar and filter context for consistent navigation
- Mobile filter drawer with toggle button and active filter count badge
- Category page filters scoped to category products
- Fix
phx-value-valuecollision on filter checkboxes: renamed tophx-value-valto avoid HTML checkboxvalue="on"overwrite - Known issue: metadata option filters (e.g., Size) may not filter correctly in all cases; needs further investigation
- New
- Add file upload field type to Entities module
- New
filefield type with configurable max entries, file size, and accepted formats FormBuilderrenders file upload UI with drag-and-drop zone (admin entity forms, placeholder)- New
:advancedfield category
- New
- Fix 3 remaining UUID migration bugs in billing forms
- Fix 8 UUID migration bugs found in PR #330 post-merge review
- Add UUIDv7 migration V56 with dual-write support
1.7.35 - 2026-02-12
- Rewrite Sitemap module to sitemapindex architecture with per-module files
/sitemap.xmlnow returns a<sitemapindex>referencing per-module files at/sitemaps/sitemap-{source}.xml- Dual mode support: "Index mode" (per-module files, default) and "Flat mode" (single urlset when Router Discovery enabled)
- New
Sourcebehaviour callbacks:sitemap_filename/0andsub_sitemaps/1for per-group file splitting - New
Generator.generate_all/1andgenerate_module/2with auto-splitting at 50,000 URLs - FileStorage rewrite with
save_module/2,load_module/1,delete_module/1,list_module_files/0 - Cache rewrite supporting
{:module_xml, filename}and{:module_entries, source}keys - Per-module stats stored as JSON in Settings with
get_module_stats/0 - Per-module regeneration via
SchedulerWorker.regenerate_module_now/1(Oban) - Settings UI overhaul: per-module sitemap cards with stats, regeneration buttons, mode indicators
- Publishing source: per-blog sub-sitemaps via
sitemap_publishing_split_by_groupsetting - Entities source: per-entity-type sub-sitemaps
- Static source: login page excluded, registration conditionally included
- Router Discovery default changed to
false(index mode is new default) - Removed "cards" XSL style; added
sitemap-index-minimal.xslandsitemap-index-table.xsl - Sitemap routes no longer go through
:browserpipeline (public XML endpoints)
- Add PDF support for Storage module
- New
PdfProcessormodule usingpoppler-utils(pdftoppm,pdfinfo) - First page rendered to JPEG thumbnail at configurable DPI
- PDF metadata extraction (page count, title, author, creator, creation date)
VariantGeneratorextended for document/PDF MIME types- Media UI: inline PDF viewer on detail page, PDF badges on thumbnails, metadata display
- New system dependency checks for poppler in
Dependenciesmodule
- New
- Fix option price display for options with all-zero modifiers
- New
has_nonzero_modifiers?/1filters out option groups where all price modifiers are zero - Price modifiers displayed as badges on option buttons (e.g., "+$5.00")
- Cart saves all selected specs including non-price-affecting options (e.g., Color)
build_cart_display_name/3includes all selected specs in display name
- New
- Fix category icons fallback to legacy product images
Category.get_image_url/2falls back tofeatured_product.featured_image(legacy URL)- Product detail respects
shop_category_icon_modesetting for category subtab icons - Guard clauses tightened for Storage vs legacy URL handling
- Add ImportConfig filtering at CSV preview stage
- Config filters applied during CSV analysis/preview, not just during import
- Import wizard shows skipped product count with warning badge
- Category creation uses language normalization for consistent JSONB slug keys
- Imported option labels use
_option_slotsmetadata for proper display names
- Fix admin sidebar full-page reload after upstream merge
- Comments and Sync routes merged into main admin
live_session
- Comments and Sync routes merged into main admin
- Add runtime sitemaps directory to gitignore
1.7.34 - 2026-02-11
- Extract Comments into standalone reusable module (V55 migration)
- New
PhoenixKit.Modules.Commentscontext with polymorphicresource_type+resource_idassociations - New tables:
phoenix_kit_comments,phoenix_kit_comments_likes,phoenix_kit_comments_dislikes - Reusable
CommentsComponentLiveComponent that can be embedded in any resource detail page - Threaded comments with configurable max depth and content length
- Like/dislike system with atomic counter cache
- Moderation admin UI at
{prefix}/admin/commentswith filters, search, and bulk actions - Module settings page at
{prefix}/admin/settings/comments - Resource handler callback system for notifying parent modules (e.g., Posts) of comment changes
- "comments" permission key added (25 total permission keys, 20 feature modules)
- Posts module refactored to consume Comments module API instead of inline implementation
- Legacy
phoenix_kit_post_commentstables preserved for backward compatibility
- New
- Add shop enhancements, sitemap sources, and admin navigation fix
- Shop module improvements: product options toggle, import configs, drag-and-drop reordering, catalog language redirects
- Sitemap module: shop source (categories, products, catalog), data source toggles in settings UI
- Admin sidebar seamless navigation (consolidate live_sessions)
- Migration fixes and V54 addition
- Fix preview-to-editor round-trip state and data loss bugs
- Fix 8 bugs in the preview_token handle_params path that had diverged from the other editor entry points as features were added over time
- Merge disk metadata into preview post to prevent silent data loss when saving after a preview round-trip
- Add error logging to enrich_from_disk for observability
- Add module-level permission system for role-based admin access control
- Custom roles can now be granted granular access to specific admin sections and feature modules. Permissions are managed through a new interactive matrix UI, enforced at both route and sidebar level, and update in real-time across all admin tabs via PubSub.
1.7.33 - 2026-02-04
- Add module-level permission system (V53 migration)
phoenix_kit_role_permissionstable with allowlist model (row present = granted)- 24 permission keys: 5 core sections + 19 feature modules
- Owner bypasses all checks; Admin seeded with all 24 keys by default
- Custom roles start with no permissions, assigned via matrix UI or API
PhoenixKit.Users.Permissionscontext for granting, revoking, and querying role permissions- Interactive permission matrix at
{prefix}/admin/users/permissions - Inline permission editor in Roles page with grant/revoke all
- Route-level enforcement via
phoenix_kit_ensure_adminandphoenix_kit_ensure_module_access - Sidebar nav gated per-user based on granted permissions
- Real-time PubSub updates: permission changes reflect across all admin tabs
- Backward compatible: pre-existing Admins retain full access before V53 migration
- Add PubSub events for real-time updates in Tickets and Shop modules
- Tickets.Events module with broadcast for ticket lifecycle (created, updated, status changed, assigned, priority changed)
- Comment and internal note events for ticket discussions
- Shop.Events extension with product, category, inventory events
- LiveViews subscribe to events for real-time UI updates
- Add User Deletion API with GDPR-compliant data handling
- delete_user/2 with cascade delete for related data (tokens, OAuth, billing profiles, carts)
- Anonymization strategy for orders, posts, comments, tickets, email logs, files
- Protection: cannot delete self, cannot delete last Owner
- Admin UI with delete button, confirmation modal, and real-time list updates
- Broadcast :user_deleted event for multi-admin synchronization
- Fix compilation errors in auth.ex (pin operator with dynamic Ecto queries)
- Update core PhoenixKit schemas and Referrals to new UUID standard
- Update Shop module with localized slug support and unified image gallery
- Add PubSub events for Tickets and Shop modules, User Deletion API
- Added support for uuid to referral module
- Add markdown rendering and bucket access types
- Update Sync module to new UUID standard pattern
- Update billing module to use DB-generated UUIDs
- Update entities module to UUID standard matching AI module
1.7.32 - 2026-02-03
Storage Module: Smart file serving with bucket access types (V50 migration)
- Add
access_typefield to buckets: "public", "private", "signed" - Local files are now served directly without temp file copying (performance improvement)
- Public cloud buckets redirect to CDN URL (faster, reduces server load)
- Private cloud buckets proxy files through server (for ACL-protected storage)
- Add retry logic for bucket cache race conditions during file access
⚠️ BREAKING CHANGE: Cloud Bucket Access Type
Cloud buckets (S3, B2, R2) now default to
access_type = "public", which redirects users directly to the bucket's public URL instead of proxying through the server.If you have private/ACL-protected buckets:
- Go to Storage → Buckets → Edit your bucket
- Set "Access Type" to "Private"
- Files will be proxied through the server using credentials (previous behavior)
If you have public buckets (redirect mode):
For redirect to work, your bucket must be publicly accessible:
Enable Public Access in your cloud provider settings:
- AWS S3: Disable "Block all public access" and set bucket policy
- Backblaze B2: Set bucket to "Public"
- Cloudflare R2: Configure public access or use Custom Domain
Configure CORS if serving files cross-origin (required when your site domain differs from bucket domain):
AWS S3 / R2 CORS configuration example:
[ { "AllowedHeaders": ["*"], "AllowedMethods": ["GET", "HEAD"], "AllowedOrigins": ["https://yourdomain.com"], "ExposeHeaders": ["ETag", "Content-Length"], "MaxAgeSeconds": 3600 } ]Replace
https://yourdomain.comwith your actual domain, or use"*"for any origin (less secure but simpler for testing).
See AWS documentation: https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html
- Add
1.7.31 - 2026-01-29
- Refactor publishing module into submodules and improve URL slug handling
- Storage module refactoring:
- Split storage.ex into specialized submodules: Paths, Languages, Slugs, Versions, Deletion, and Helpers for better organization and maintainability
- Move controller logic into submodules: Fallback, Language, Listing, PostFetching, PostRendering, Routing, SlugResolution, Translations
- Move editor logic into submodules: Collaborative, Forms, Helpers, Persistence, Preview, Translation, Versions
- Listing page improvements:
- Show live version's translations and statuses instead of latest version
- Fetch languages from filesystem when version_languages cache is empty
- Fix paths to point to live version files when clicking language buttons
- Add "showing vN" badge that combines with version count display
- Fix public URL to always use post's primary language
- URL slug priority system:
- Directory slugs now have priority over custom url_slugs
- Prevent setting url_slug that conflicts with another post's directory name
- Auto-clear conflicting url_slugs instead of blocking saves
- Show info notice when url_slugs are auto-cleared due to conflicts
- Clear conflicting url_slugs from ALL translations, not just current one
- Clear conflicting custom url_slugs when new post is created
- Storage module refactoring:
1.7.30 - 2026-01-28
- Posts Module
- Add likes and dislikes system for post comments (V48 migration)
- Post body field is no longer required
- User Management
- Add dropdown field type support for user custom fields
- Shop Module (E-commerce)
- Fix JSONB search queries and add defensive guards for robustness
- Fix JSONB localized fields consistency across product/category operations
- Add shop import enhancements with V49 migration
- Fix image migration robustness and catalog display issues
- Add language selection dropdown to CSV import for localized content
- Add variant image mapping support for Shop products
- Add legacy image support for backward-compatible variant mappings
- Bug Fixes
- Fix UUID column error for auth tables during upgrade - Users upgrading from PhoenixKit < 1.7.0 no longer get "column uuid does not exist" error when logging in. Added auth tables (users, tokens, roles, role_assignments) to UUIDRepair module.
1.7.29 - 2026-01-26
- Add primary language improvements and AI translation progress tracking
- Real-time translation progress - Added progress bars to editor and listing pages showing AI translation status
- Primary language improvements - Posts now store their primary language for isolation from global setting changes
- Language handling fixes - Fixed base code to dialect mapping (e.g., en → en-US) across public URLs and editor
- UI polish - Updated language switcher colors, modal text, and added prominent primary language display in editor
- Documentation - Added comprehensive README for the Languages module
1.7.28 - 2026-01-24
- Major improvements to the Publishing module's multi-language workflow: renamed "master" to "primary" terminology, fixed URL routing with locales, added language migration tools, improved cache performance, and fixed several UI/UX issues in settings and admin pages.
- Multi-Language System Improvements
- Rename master to primary terminology - Updated all references from "master language" to "primary language" for consistency and clarity
- Fix language in URL breaking navigation - Resolved issues where locale prefixes in URLs caused routing problems
- Isolate posts from global primary_language changes - Posts now store their own primary language, preventing drift when global settings change
- Add "Translate to This Language" button - Quick translation action for non-primary languages in the editor
- Sort languages in dropdowns - Consistent alphabetical sorting across all language selectors
- Migration Tools
- Add version structure migration UI - Visual indicators and migration buttons throughout the publishing module
- Fix legacy post migration - Resolved "post not found" errors when migrating from legacy to versioned structure
- Handle dual directory structures - Fixed migration when both publishing/ and blogging/ directories exist
- Add primary language migration system - Tools to migrate posts to use isolated primary language settings
- Performance
- Improve listing performance - Read from cache when possible, reducing database/filesystem hits
- Language caching with WebSocket transport - Faster language resolution with proper cache invalidation
- Add Create Group shortcut - Quick access button on publishing overview page
- Settings & Admin UI Fixes
- Fix General settings content language glitch - Resolved weird UI behavior when changing content language
- Fix settings tab highlighting - General and Languages tabs now properly highlight on child pages
- Fix admin header dropdowns - Theme and language dropdowns in admin header now work correctly
- Update Entities module description - Clearer description on the Modules page
- Multi-Language System Improvements
- Updated the languages module added front and backend tabs for languages
- Add localized routes for Shop module
- Add locale-prefixed routes (/:locale/shop/...) for multi-language Shop module support
- Add language validation to only allow enabled languages in URLs
- Add language preview switcher for admin product detail page
1.7.27 - 2026-01-19
- Changed / Added
- Added prefix-aware navigation helpers and dynamic URL prefix support across dashboard, tabs, auth pages, and project home URLs, fixing issues when locale or prefix is nil.
- Introduced comprehensive dashboard branding and theming:
- Configurable branding, title suffix, and logo handling.
- Shared theme controller with daisyUI integration, color scheme guide, and improved theme switcher placement.
- Enhanced dashboard navigation:
- Configurable subtab styling, redirects, highlights, and mobile subtab support.
- Multiple context selectors with dependency support.
- Reserved additional locale path segments for dashboard and users.
- Added context-aware features:
- Context-aware badges with update helpers, guards for nil contexts, and improved preservation during tab refresh.
- Consistent context-aware merge behavior.
- Improved authentication and user setup:
- Added fetch_phoenix_kit_current_user to the auto-setup pipeline.
- Fixed auth pages and titles to use centralized Settings/Config branding.
- Performance and quality improvements:
- Optimized Presence and Config modules to reduce repeated checks and lookups.
- Added dashboard_assigns/1 helper to prevent unnecessary layout re-rendering.
- Fixed hardcoded branding and paths to rely on configuration fallbacks.
- Documentation updates:
- Added guides for dashboard theming, tab path formats, subtab behavior, and context selectors.
- Added prominent built-in features section and reduced overall documentation size.
- Maintenance:
- Fixed Credo/Dialyzer issues, formatting problems, and test failures.
- Cleaned up unused Dialyzer ignores and added ignores for test support files.
1.7.26 - 2026-01-18
- Language switcher fix
1.7.25 - 2026-01-16
- Bug fix - Added check for nil on language_swithcer on log-in page
1.7.24 - 2026-01-15
- Add Shop module with products, categories, cart, and checkout flow
- Add user billing profiles for reusable billing information
- Add payment options selection in checkout (bank transfer, card payment)
- Add user order pages with UUID-based URLs
- Add PubSub broadcasts to Billing module for real-time updates
- Add automatic default currency for orders
- Add Billing and Shop tabs to user dashboard tab system
- Add automatic dashboard tabs refresh when modules are enabled/disabled
- Fix user dashboard layout sidebar height calculation
- Fix OAuth avatar display in admin navigation
1.7.23 - 2026-01-14
- Added user functions, language switcher on login page (also support for Estonian and Russian on login)
- Removed logs spamming about oban jobs
1.7.22 - 2026-01-13
- Add AWS config module with centralized credential management
- Add context selector for multi-tenant dashboard navigation
- Add comprehensive user dashboard tab system with CLI generator
- Consolidate Publishing module into self-contained structure
- Publishing Module: Versioning, AI Translation, Per-Language URLs & Real-time Updates
- Fixed referralcodes to referrals for more universal code
1.7.21 - 2026-01-10
- Publishing Module: Versioning, AI Translation, Per-Language URLs & Real-time Updates
- Fixed referralcodes to referrals for more universal code
- Consolidate OAuth config through Config.UeberAuth abstraction
1.7.20 - 2026-01-09
- Fix user avatar fallback when Gravatar is unavailable
- Fixed issues with phx_kit install
- Add scheduled job cancellation when disabling modules
- Fix race condition in file controller for parallel requests
1.7.19 - 2026-01-07
We are doing code cleanup and refactoring to move forward with more new modules and more features:
- Moved referral_codes module to correct location lib/modules and fixed issue with install not working
- Standardize admin UI styling and add reusable components
- Move Emails module to lib/modules/emails with PhoenixKit.Modules.Emails namespace
- Migrate Entities, AI, and Blogging modules to lib/modules/ with PhoenixKit.Modules namespace
- Updated the javascript usage to not create userspace javascript files
- Move Sitemap and Billing modules to lib/modules/ with consolidated namespace
- Move DB and Sync modules to lib/modules/ with PhoenixKit.Modules namespace
- Moved posts module files to lib/modules folder
- Add DB Explorer module
1.7.18 - 2026-01-03
- Blog Versioning, Caching System, and Complete Programmatic API
- Add Cookie Consent Widget (Legal Module Phase 2)
- Add Legal module improvements and cookie consent enhancements