extension-data-viewer
caffeinelabs/skills
Admin-only paginated viewer for stable canister state in Caffeine apps.
What is extension-data-viewer?
Auto-generates controller-only queries to inspect stable data structures like Maps, Sets, and Lists in your Caffeine backend. Use this when you need to browse users, items, orders, logs, or any other backend data for debugging and admin dashboards.
- Auto-generates `__<var>` queries for every stable variable of supported types (Map, Set, Array, List, Stack, Queue)
- Provides paginated access with optional cursor and count parameters for efficient data browsing
- Restricts access to controllers only—queries trap for non-admin callers
- Integrates seamlessly via `include MixinViews()` in your actor with no additional setup required
- Includes lintoko rule to enforce the mixin include and prevent accidental removal
How to install extension-data-viewer
npx skills add https://github.com/caffeinelabs/skills --skill extension-data-viewer- Caffeine app with `caffeineai-data-viewer` mops package (pre-installed in templates)
- Actor must include `include MixinViews();` in its body
- Motoko backend using supported stable collection types
How to use extension-data-viewer
- 1.Declare a stable variable using a supported type (Map, Set, Array, List, Stack, or Queue)
- 2.Ensure `include MixinViews();` is present in your actor body
- 3.The compiler automatically generates a `__<varname>` query for that variable
- 4.Call the generated query with optional cursor (?K or ?Nat) and count (?Nat) parameters from an admin/controller context
- 5.Use pagination by passing a cursor to fetch subsequent pages of results
Use cases
- Browse all users or accounts stored in a stable Map during development and debugging
- Inspect order history, logs, or event queues with pagination for large datasets
- Create admin dashboards that display backend state without writing custom list endpoints
- Debug data integrity issues by viewing the exact contents of stable collections
- Monitor queue or stack contents in real-time during testing
- Backend developers building Caffeine apps
- Admin dashboard builders needing data inspection tools
- Developers debugging stable state and data integrity issues
extension-data-viewer FAQ
No. The `caffeineai-data-viewer` mops package and `--generate-view-queries` flag are pre-installed in every Caffeine app template. Just include `MixinViews()` in your actor.
No. All generated queries trap if called by a non-controller caller. They are admin-only by design and should never be used as public endpoints.
Map.Map, Set.Set, arrays ([V] and [var V]), List.List, Stack.Stack, and Queue.Queue. Pure (immutable) collections are not supported.
The lintoko rule `include-mixin-views` will error, and all auto-generated viewer queries will be disabled. Keep the include in place.
Pass a cursor (the last key or index from the previous result) and a count parameter to the generated query. A null cursor starts at the beginning; null count returns everything from the cursor.
Full instructions (SKILL.md)
Source of truth, from caffeinelabs/skills.
name: extension-data-viewer
description: Admin-only paginated viewer for stable canister state. Use whenever the user asks for a viewer, dashboard, debug panel, or admin browse over backend data — users, items, orders, logs, or any stable Map/Set/Array/VarArray/List/Stack/Queue. Pre-installed in every Caffeine app via the caffeineai-data-viewer mops package; this skill explains what it does and how to keep using it correctly.
version: 0.1.0
compatibility:
mops:
caffeineai-data-viewer: "~0.1.0"
caffeineai-subscription: [none]
Data Viewer
Admin-only data inspection extension for Caffeine AI.
Overview
Every Caffeine app ships with the caffeineai-data-viewer mops package and the moc --generate-view-queries flag enabled. Together with include MixinViews() in the actor, the compiler auto-exposes a controller-only __<var> query for every stable variable of a supported type:
Map.Map<K, V>—(?K, ?Nat) -> [(K, V)]Set.Set<K>—(?K, ?Nat) -> [K][V],[var V],List.List<V>,Stack.Stack<V>,Queue.Queue<V>—(?Nat, ?Nat) -> [V]
A null cursor starts at the beginning; a null count returns everything from the cursor. Each generated query traps on any non-controller caller — they exist for admin dashboards and debug viewers, not user-facing endpoints.
Backend
The package and include are already wired into the template. You don't need to add or edit anything for the viewer to work — declare a stable variable of a supported type and the __<var> query appears automatically.
import Map "mo:core/Map";
import Principal "mo:core/Principal";
import MixinViews "mo:caffeineai-data-viewer/MixinViews";
actor {
include MixinViews();
let users = Map.empty<Principal, Text>();
// Generated automatically: __users : (ko : ?Principal, count : ?Nat) -> [(Principal, Text)] query
};
Lintoko rule include-mixin-views (shipped with the package) errors if the actor body is missing include MixinViews();. Keep the include — removing it disables every auto-generated viewer.
Rules
- NEVER use the generated
__<var>queries as a substitute for user-facing endpoints — they trap for any non-controller caller. Public list/feed/search methods still need to be written normally withpublic query func listX(...). - NEVER declare an actor member whose name starts with
__— it either collides with an auto-generated query or hits a reserved prefix. - Pure (immutable) collections (
pure/Map,pure/Set,pure/List,pure/Queue) are not supported. The viewer is mutable-only by design; pure collection field access is a deprecated pattern in Caffeine projects anyway.
Related skills
More from caffeinelabs/skills and the wider catalog.

extension-email
Send service and transactional emails from your backend canister.

extension-email-calendar-events
Create, manage, and email calendar event invitations with iCalendar support.

extension-email-marketing
Send personalized marketing emails to verified subscribers with automatic unsubscribe management.

extension-email-raw
Send emails to multiple to, cc, and bcc recipients with a single call.

extension-email-verification
Send click-to-verify email links to confirm user email ownership.

extension-http-outcalls
Make HTTP GET and POST requests from your backend canister to external APIs.