Install the "assign-offline-profile" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/mobile-apps/skills/assign-offline-profile into .claude/skills/assign-offline-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assign-offline-profile", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "assign-offline-profile" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/mobile-apps/skills/assign-offline-profile into .agents/skills/assign-offline-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assign-offline-profile", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "assign-offline-profile" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/mobile-apps/skills/assign-offline-profile into .cursor/skills/assign-offline-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assign-offline-profile", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "assign-offline-profile" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/mobile-apps/skills/assign-offline-profile into .gemini/skills/assign-offline-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assign-offline-profile", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "assign-offline-profile" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/mobile-apps/skills/assign-offline-profile into .github/skills/assign-offline-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assign-offline-profile", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "assign-offline-profile" agent skill from https://github.com/microsoft/power-platform-skills/tree/main/plugins/mobile-apps/skills/assign-offline-profile into .opencode/skills/assign-offline-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assign-offline-profile", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
assign-offline-profile
GitHub stars
979
Token cost
~2.6k tokens
SKILL.md length
805 words
Files
1
Skills in repo
92
Repo updated
First seen
Licence
MIT
At a glance
A skill your agent uses when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices.
Works in 7 steps: Verify project + locate profile → Pick users/teams → Discover existing memberships → …
The user needs to bind users
SKILL.md covers Workflow, Status code (final line) and Failure recovery
Calls node and just
What it does
Assign Offline Profile is an agent skill from microsoft/power-platform-skills, published by the product's own GitHub organization. Use when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices. Without this, the profile exists in Dataverse but no one's app uses it.
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: A plugin marketplace for GitHub Copilot and other AI agents that provides Power Platform development plugins, including reusable skills, agents, and commands for building and… The licence is MIT.
When your agent uses it
The user needs to bind users
Teams to a Mobile Offline Profile so they actually receive offline sync on their devices
Read from SKILL.md and the folder at commit 8c4b447. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves these tools, so the agent can use them without asking each time:
Read
Edit
Write
Grep
Glob
Bash
AskUserQuestion
From allowed-tools in the SKILL.md frontmatter.
Runs code
Shell commands in SKILL.md call:
node
just
From the folder's file list and the shell code blocks in SKILL.md.
Network
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Assign Offline Profile loads about 2.6k tokens when it runs. Until then it costs about 56 tokens; SKILL.md has 805 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~56
When it runs· the whole SKILL.md, loaded when a task matches
~2.6k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check: notes
The automated check noted patterns worth knowing about, such as sudo or a known installer.
NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
Download SKILL.mdSave it as .claude/skills/assign-offline-profile/SKILL.md (or your agent's skills folder).
name
assign-offline-profile
description
Use when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices. Without this, the profile exists in Dataverse but no one's app uses it.
Bind one or more users and/or teams to an existing Mobile Offline Profile. Without this step, the profile exists in Dataverse but is unbound — no one's app actually uses it for offline sync.
Per the maker portal's UX (the "Assign profile to user" dialog under env settings), this is a separate operation from profile creation. Many users hit "I created the profile but offline still doesn't work" — the missing piece is membership.
Before project reads or commands, apply
app-working-directory.md.
Resolve one absolute working_dir for a direct call or require the child
invocation's owner root. Keep every shell/file operation, referenced recipe,
and retry on that root and the selected environment/tenant; missing or
conflicting context is NEEDS_CONTEXT. File tools use <working_dir>/....
Planning-phase calls may discover and propose the membership diff but must
return before the confirmation gate, POST/DELETE, or artifact updates.
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
environment_id=$(node -p "require('./power.config.json').environmentId || ''") || {
echo "BLOCKED: unreadable power.config.json" >&2; exit 1;
}
if [ -z "$environment_id" ]; then
echo "NEEDS_CONTEXT: selected app has no environmentId" >&2; exit 1;
fi
node "${PLUGIN_ROOT}/scripts/resolve-environment.js" "$environment_id" --no-cache --require-tenant
Capture <envUrl> and <tenantId> and require them to match any supplied owner
identity. Pass --tenant-id "<tenantId>" on every Dataverse request, including
profile lookup, WhoAmI, membership discovery, mutation, readback, and retries.
Profile ID resolution (in order):
Source
Used when
$ARGUMENTS contains --profile-id <guid>
Explicit override
$ARGUMENTS contains --profile-name <name>
Resolve via GET /mobileofflineprofiles?$filter=name eq '<name>'&$select=mobileofflineprofileid
<working_dir>/offline-profile.json
Read top-level profileId field
Otherwise
GET /mobileofflineprofiles and present AskUserQuestion with the list (max 4 options)
STOP if no profile can be resolved. Print: Run /setup-offline-profile first, or pass --profile-id.
power.config.json is intentionally NOT consulted here. That file is owned by pa app init. The profile ID lives in offline-profile.json only.
Step 2 — Pick users/teams
$ARGUMENTS parsing:
Flag
Effect
--user <upn> (repeatable)
Add specific user(s) by UPN (user@domain.com)
--team <name> (repeatable)
Add specific team(s) by name
--me
Add the current Dataverse user from WhoAmI / systemusers(<UserId>) — useful for solo dev demos
--all-app-users
Add every user with System User role in the current env (broad; intended for prod rollout — confirm at gate)
--unassign-user <upn> / --unassign-team <name>
Remove an existing membership rather than add
If no flags passed, present AskUserQuestion:
Question: "Who should receive this offline profile?"
Options (max 4):
Just me (the current user) — equivalent to --me
Pick specific users by UPN — you reply with comma-separated emails in the next message
Pick a team — list env's teams and pick one
All users with System User role — equivalent to --all-app-users; broad scope, confirm at gate
For pick-users flow: after the choice, print:
"Reply with comma-separated UPNs (e.g. rm1@contoso.com, rm2@contoso.com)"
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
# Existing user memberships for this profile
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
"usermobileofflineprofilememberships?\$filter=_mobileofflineprofileid_value eq <profileId>&\$select=usermobileofflineprofilemembershipid,_systemuserid_value&\$expand=systemuserid_systemuser(\$select=domainname)" \
--tenant-id "<tenantId>"
# Existing team memberships for this profile
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
"teammobileofflineprofilememberships?\$filter=_mobileofflineprofileid_value eq <profileId>&\$select=teammobileofflineprofilemembershipid,_teamid_value&\$expand=teamid_team(\$select=name)" \
--tenant-id "<tenantId>"
Build the set of already-bound UPNs and team names.
For each candidate user/team from Step 2, look up their systemuserid / teamid (skip if already in already-bound):
bash
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
"systemusers?\$filter=domainname eq '<upn>'&\$select=systemuserid,fullname,domainname&\$top=1" \
--tenant-id "<tenantId>"
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
"teams?\$filter=name eq '<team-name>' and teamtype eq 0&\$select=teamid,name&\$top=1" --tenant-id "<tenantId>"
(teamtype eq 0 excludes Access Teams and Owner Teams — only Manage Teams get profile assignments.)
Construct three lists:
to_add — resolved IDs to POST
to_remove — resolved IDs to DELETE (from --unassign-* flags)
not_found — UPNs/team-names that didn't resolve (warn)
Profile: <name> (<profileId>)
Will ADD:
- User: rahul@contoso.com (Rahul Bansal)
- User: charanma@... (Charan Mahankali)
- Team: Field Service RMs (12 members)
Will REMOVE:
(none)
Already bound (skipping):
- User: admin@... (no-op)
Could not resolve:
- someone@external.com — not in this env's system users
Proceed?
⚠️ Duplicate handling: POSTing a membership that already exists returns 409 Conflict. The dataverse-request.js wrapper's looksLikeDuplicate rescue treats this as silent success (the Step 3 dedup should catch most cases first). Re-runs are safe.
Re-query memberships from Step 3 and assert the diff applied:
Every to_add now appears in the GET response
Every to_remove no longer appears
If the verification disagrees, return BLOCKED: membership writes did not commit and print the discrepancy.
Step 7 — Summary
Print:
✓ Membership updates applied.
Profile : <name>
Total members: <N users + M teams>
Added : <list>
Removed : <list>
Skipped : <list> (already bound)
Users will receive the profile on their next mobile app sign-in. Existing
sessions need to sign out + sign in to trigger the profile pull.
Update memory-bank.md## Offline profile block:
yaml
membership:
users: [rahul@..., charanma@...]
teams: [Field Service RMs]
lastAssignedAt: 2026-05-19T...
Status code (final line)
DONE — every requested add/remove applied; verify confirmed
DONE_WITH_CONCERNS: <list> — some UPNs/teams could not be resolved, or --all-app-users matched 0 users (env may not have the role granted yet)
NEEDS_CONTEXT: <missing> — couldn't determine profileId (no offline-profile.json, no --profile flags, no profiles in env)
BLOCKED: <reason> — auth failure, profile not found in env, or verification disagreement
Failure recovery
Memberships are individually committed (no transaction). If Step 5 fails mid-loop:
Partially-added memberships remain (visible in env)
Re-running with the same arguments is idempotent (Step 3 dedup catches what's already bound)
Use --unassign-* to undo specific bindings if needed
Assign Offline Profile next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
Assign Offline Profile compared with similar skills
Skill
Stars
Used in
Tokens
Auto-check
Licence
Repo updated
Assign Offline Profile this skillmicrosoft/power-platform-skills
Inspects and configures the security headers a Power Pages site sends to browsers — Content Security Policy, frame and clickjacking protection, cross-origin sharing, cookie behavior, and related…
Creates, edits, and manages Power Pages Server Logic files — server-side JavaScript that runs securely on the Power Pages runtime.
979 GitHub stars~18k tokensUpdated today
Auto-check: notes
Questions about Assign Offline Profile
What does Assign Offline Profile do?
A skill your agent uses when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices. Assign Offline Profile is an agent skill from microsoft/power-platform-skills, published by the product's own GitHub organization. Use when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices.
When should I use Assign Offline Profile?
Assign Offline Profile fits situations like: the user needs to bind users; teams to a Mobile Offline Profile so they actually receive offline sync on their devices.
How do I install Assign Offline Profile in Claude Code?
Run `npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a claude-code`. Or copy the skill folder (plugins/mobile-apps/skills/assign-offline-profile in microsoft/power-platform-skills) into .claude/skills/assign-offline-profile in your project. Claude Code loads it when a task matches its description.
How do I install Assign Offline Profile in Codex?
Run `npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a codex`. Or copy the skill folder (plugins/mobile-apps/skills/assign-offline-profile in microsoft/power-platform-skills) into .agents/skills/assign-offline-profile in your project. Codex loads it when a task matches its description.
Can I use Assign Offline Profile in Cursor, Gemini CLI or GitHub Copilot?
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/assign-offline-profile, .gemini/skills/assign-offline-profile, .github/skills/assign-offline-profile and .opencode/skills/assign-offline-profile in your project.
What does Assign Offline Profile need to run?
Going by SKILL.md and its folder, Assign Offline Profile needs the command-line tools its instructions call (node and just). Its frontmatter pre-approves these tools: Read, Edit, Write, Grep, Glob, Bash, AskUserQuestion.
Does Assign Offline Profile access the network?
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Is Assign Offline Profile safe to install?
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
What licence does Assign Offline Profile use?
Assign Offline Profile is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does Assign Offline Profile use?
About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
What are the alternatives to Assign Offline Profile?
Skills that share tags, products or a category with Assign Offline Profile: Profile (ccusage/ccusage, 19k stars), Cpu Profile (ClickHouse/ClickHouse, 50k stars), Codex Profiles (sickn33/agentic-awesome-skills, 47k stars) and Collectors Snmp Profiles (netdata/netdata, 81k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Assign Offline Profile?
microsoft (a GitHub organization, an official publisher) maintains it in microsoft/power-platform-skills, which has 979 GitHub stars. The repository holds 92 skills in this directory. The repository was last updated on October 9, 2026.