- Document push notification setup in CLAUDE.md (detailed) and README (feature lists, marked paid-clients only) (#76)
- Add test coverage for
google/FCM device registration and rejection of unsupportedplatformvalues (#75) - Connect to the APNs sandbox server in development (
connect_to_development_server: Rails.env.development?). A Xcode debug build registers a sandbox token; pushing it to the production APNs host returned400 BadDeviceToken, which the gem treats asTokenErrorand destroys the device row. Development now matches the sandbox; staging/production keep production (#74) - Add
Noticed::EventandNoticed::Notificationto the madmin dashboard, with cross-linkable associations (#73) - Add
ApplicationPushDeviceto the madmin dashboard (#72) - Fix push delivery crashing with
TypeError (no implicit conversion of nil into Hash):ItemTagNotifiernow sets thewith_apple/with_google/with_dataoptions (Action Push Native does{}.merge(option)and rejectsnil). Also fix the notificationurlto the shallowapi_v1_shopkeeper_item_tag_pathroute (item_tagsis declaredshallow: true) (#71) - Fix
is_adminserializing asnullfor non-admin members:Rolifiedrole predicates now coerce to a real boolean instead of returningnilwhen the role key is absent from therolesJSON (#70) - Upgrade
noticedfrom 2.9.3 to 3.0.0 (#69) - Bump gems within Gemfile constraints (bootsnap, faraday, httpx, jwt, marcel, pagy, rubocop, rubocop-rails, selenium-webdriver, tailwindcss-ruby, zeitwerk) (#68)
- Ignore
CVE-2026-40295(devise Timeoutable open redirect) in bundler-audit —:timeoutableisn't enabled anddevise_token_auth ~> 1.2pinsdevise < 5(#67) - Populate APNs/FCM credentials for development, staging, and production so
config/push.ymlresolves Action Push Native config at runtime (#66) - Update Ruby from 4.0.2 to 4.0.3
- Update gems within Gemfile constraints (action_text-trix, bootsnap, json, mailbin, multi_xml, rubocop-rails, rubyzip)
- Wire
ItemTagNotifierto theItemTagAASMcompleteevent viaafter_commit. On state transitionidled → completed, the notifier fires to all shopkeepers in the shop's account except the completer (completed_by). Only the AASM trigger — APNs/FCM provider credentials still pending (bin/rails credentials:editonce the keys are provisioned). - Drop the standalone
Devicemodel and consolidate push-token registration ontoApplicationPushDevice(subclass ofActionPushNative::Device) sodeliver_by :action_push_nativeactually fires for tokens registered viaPOST /api/v1/shopkeeper/devices. The customdevicestable is dropped;action_push_native_devicesis rebuilt with UUID primary key + UUID polymorphic owner +bundle_id/last_active_atcolumns + unique(platform, token)index. - API contract change (still pre-mobile-client):
device.platformenum is now[apple, google](matches Action Push Native's APNs/FCM service convention) instead of[ios, android]. Mobile substrate clients (PRs #3-5) will register withappleorgoogle. - Renames:
Device→ApplicationPushDevice,Api::Shopkeeper::DevicePolicy→Api::Shopkeeper::ApplicationPushDevicePolicy,DeviceSerializer→ApplicationPushDeviceSerializer(JSONAPItypestaysdevice);Shopkeeper has_many :devices→has_many :application_push_devices, as: :owner.
- Add push notifications scaffolding via
noticedv2 (#58) - New
Devicemodel + migration (UUID primary key, unique on[platform, token],last_active_atfor staleness scope) - New
Api::V1::Shopkeeper::DevicesController— POST/devicesis idempotent upsert (rebinds token to current shopkeeper); DELETE/devices/:idunregisters - Add
ApplicationNotifierbase class + exampleItemTagNotifierwithdeliver_by :action_push_nativewiring (Apple + Google push via Rails-nativeaction_push_native0.3.x) - Generate
ApplicationPushNotification/ApplicationPushDevice/ApplicationPushNotificationJobandconfig/push.yml(APNs/FCM credentials still placeholders — provision viabin/rails credentials:editbefore enabling delivery; ItemTag AASM trigger lands in a follow-up) - Note: the existing
Deviceregistration API (POST /api/v1/shopkeeper/devices) writes to the customDevicemodel, notApplicationPushDevice— bridging the two (so registered tokens flow into Action Push Native delivery) is a follow-up Shopkeeper has_many :devices, :notifications; new locale entries undernotifiers.item_tag— title/body deliberately kept generic (%{name}/%{shop}only, no state-verbs like "completed" or "ready") so the agent's domain-adapt step can rewrite richer per-domain copy without fighting baked-in queue semantics- 21 new test runs (Device model + DevicesController + notifier); full suite still 0 failures
- Phase 1: Rails API substrate v2 refactor (#45) — turn queue-specific template into generic single-resource CRUD substrate (Shop → ItemTag)
- Rename
ItemTag.queue_number→name; adddescription,position, composite(shop_id, position)index; dropscan_state,customer_read_at,already_completedand the(shop_id, queue_number)unique index - Drop NFC/QR scan flows: remove
POST /scan,GET /scan_customer, the entiredisplay/namespace,DELETE /shops/:id/reset, app root + static controller - Rename
PATCH /item_tags/:id/reset→/idle(matches AASM event name) - Auto-create one "Sample" ItemTag on Shop creation (was 10 A001–A010 queue numbers); drop
lib/tasks/shop.rake - Collapse
AccountsShopkeeper::ROLESfrom 7 tiers (admin/senior_manager/junior_manager/senior_member/junior_member/guest) to 2 (admin/member);ItemTagPolicyresolves to Shop permissions - Inline state transitions and
completed_by/completed_atwrites in controller actions; dropscan_tag!/complete_tag!/reset!model methods - Regenerate
docs/openapi.yaml; refresh brakeman.ignore fingerprint; update locales and Madmin resources - Update gems within Gemfile constraints (bigdecimal, bootsnap, erb, ffi, irb, json, minitest, net-imap, nokogiri, pagy, parallel, parser, propshaft, puma, regexp_parser, rubocop, rubocop-ast, tailwindcss-ruby)
- Update Rails from 7.1.5.1 to 8.1
- Update Brakeman from 7.0.2 to 7.1.2
- Add brakeman.ignore for mass assignment false positive
- Add comprehensive test coverage for models, policies, serializers, and controllers (205 tests)
- Update app icons with transparent backgrounds
- Add Active Storage migrations and Rails 7.2 framework defaults
- Add static error pages (404, 406, 500)
- Fix RuboCop offenses in Active Storage migrations
- Add CLAUDE.md for Claude Code guidance
- Update Brakeman gem
- Fix item_tag uniqueness error
- Add item_tags table
- Remove BundleAssets
- Migrate from Sprockets to Propshaft
- Update Madmin
- Update Ruby and gems
- Update Brakeman gem
- Fix fail updating shopkeeper
- First commit