Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/meta-quest/agentic-tools/portalnpx skills add meta-quest/agentic-tools --skill portalgit clone --depth 1 https://github.com/meta-quest/agentic-toolsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/meta-quest/agentic-tools/portal)<a href="https://agentmods.dev/skills/meta-quest/agentic-tools/portal"><img src="https://agentmods.dev/badge/skills/meta-quest/agentic-tools/portal.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00131 | $0.03264 |
| Opus 5 | $0.00066 | $0.01632 |
| Sonnet 5 | $0.00026 | $0.00653 |
| Haiku 4.5 | $0.00013 | $0.00326 |
Grade C, and why
portal scanned grade C with 2 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Downloads and executes remote codehighSupply chain
curl | sh runs whatever the server returns today, which is not necessarily what it returned when this was reviewed.
# Any OS: curl -fsSL https://dl.google.com/android/cli/latest/darwin_arm64/install.sh | bash (see § 1 for other OSes) Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
# Any OS: curl -fsSL https://dl.google.com/android/cli/latest/darwin_arm64/install.sh | bash (see § 1 for other OSes) How it starts
The opening of the file, as written. The whole thing — 189 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Portal
This skill is for building Android apps that target Meta's Portal device family. Portal devices are discontinued (sales stopped end of 2022), but ADB is now enabled, so owners can sideload their own apps.
The hardware: Snapdragon-based Android tablets and TV sticks running a modified AOSP without Google Mobile Services. Several models, all touch or TV. minSdkVersion 28 (Android 9) or 29 (Android 10) depending on device.
This skill pairs with metavr (Meta VR CLI) — install it first. Use metavr adb in place of raw adb everywhere. See resources/hzdb.md for the one-line install (via npx), the MCP-into-your-editor setup, and the Portal-relevant command surface. The full metavr-cli skill ships in the same repo and can also be loaded for deeper reference.
Hard constraints — read before writing any code
If you only remember a few things, remember these. Each is a class of bug Portal apps hit constantly.
- No Google Mobile Services. No Play Services, no Firebase, no FCM, no Play Billing, no Google Sign-In, no Google Maps SDK, no AdMob, no ML Kit. Apps with hard GMS deps will crash on launch. Pick non-GMS alternatives — see
resources/app-requirements.md. minSdkVersion ≤ 28is required (Portal hardware tops out at API 29). For new apps,targetSdkVersion 29is the safest default. For porting existing apps,targetSdkVersionhigher than 29 usually works fine — verified empirically withtargetSdk = 36. Don't waste time downgrading the target SDK of an existing app unless you observe a concrete runtime issue.- Launcher intent-filter is required. Touch devices need
MAIN + LAUNCHER; Portal TV needsMAIN + LEANBACK_LAUNCHER. TheDEFAULTcategory is not required (verified empirically on Portal — apps with onlyMAIN + LAUNCHERappear on the home tile grid). Without one of these, the app installs but never appears on the home screen. - App icon must include a PNG in
mipmap-xxxhdpi/as a fallback. Declareandroid:icon(touch) orandroid:banner(TV) on the launcher activity. You can also ship adaptive icons (mipmap-anydpi-v26/) and other density PNGs alongside — Portal's launcher correctly falls back to themipmap-xxxhdpiPNG when the adaptive XML can't be rendered. Apps with only adaptive icons (no PNG fallback) will not have a visible icon on Portal. - No contacts API. No account/credentials API.
READ_CONTACTSis denied. The account provider returns nothing. 5a. Basic mic capture works; the far-field / beamformed mic array does not. StandardRECORD_AUDIOopens anAudioRecordstream and delivers real audio fromhandset-mic(the single-channel mic). The far-field beamformed array used by "Hey Portal" wake-word is gated by a Meta-signed native permission (com.facebook.alohasdk.permission.RECORD_AUDIO_PRIVILEGED) and is not available to sideloaded apps. So basic voice features work; sideloaded wake-word detection and high-quality room-distance pickup do not. Seeresources/app-requirements.md§ Microphone capture for details. - Touch UI for tabletop, not phone form factor. Portal sits on a counter or stand. Users interact from 50–100 cm. Hit targets ≥ 64 dp (96 dp for primary actions), body text ≥ 16 sp (18 sp on Portal+), landscape-first. Full Portal design system (typography, spacing, palette, WCAG ratios, TalkBack rules) is in
resources/design-guidelines.md; for Jetpack Compose apps,resources/compose-theme.mdis a copy-paste theme starter that bakes these rules intoColor.kt/Theme.kt/Type.kt. - Reserve the top ~64 dp (only if your top content sits within 64 dp of the canvas edge). Portal has a persistent system overlay strip at the top: back / home buttons (top-left) and Wi-Fi / status (top-right). It floats above app content with no automatic safe-area inset. Apps whose top UI hugs the edge (edge-to-edge toolbars, sticky headers, full-bleed modals) will tuck under it. Apps whose top content naturally sits ≥80 dp below the canvas edge don't need any change. The overlay pills are white, so apps with a light background in the top region need an additional dark scrim even after inset — see
resources/app-requirements.md§ Top system overlay.
What ships with it
11 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- resources/android-sdk-setup.md 13 KB
- resources/app-requirements.md 16 KB
- resources/compose-theme.md 12 KB
- resources/debugging.md 5.9 KB
- resources/design-guidelines.md 15 KB
- resources/device-setup.md 2.6 KB
- resources/hzdb.md 7.3 KB
- resources/native-toolchain.md 10 KB
- resources/porting-existing-apps.md 14 KB
- resources/sample-prompts.md 3.3 KB
- resources/smart-camera-sdk.md 3.3 KB
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 189 lines · 131 tokens per session scan C fb59bbbd5952
portal is a skill published in the GitHub repository meta-quest/agentic-tools (189 stars, last pushed 14d ago), licensed Apache-2.0. It adds 131 tokens to every session and 3,264 once invoked, about $0.0007 per session on Opus 5. A static security scan graded it C with 2 findings (downloads and executes remote code, makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
android-phone-control
Control an Android phone from a local Termux/Linux host using a deterministic ADB toolkit: device checks, wake/unlock/session mode, screenshots, UI dumps, taps, text input, key events, app launch, and safe app smoke tests.
developer-device-platform-basics
Provides guidance and instructions on managing remote devices on Developer Device Platform (DDP). Use when reserving remote Android devices, establishing connection tunnels, checking session status, or extending/cancelling leases. Don't use for iOS or local device/hardware inquiries.
camerax
Provide technical guidance for Android camera development with CameraX. Use when implementing camera features, handling asynchronous recording lifecycles, wiring low-level hardware interop using CameraX, or integrating ML Kit or Media3 effects.
analyzing-binaries
Reverse engineer compiled binaries, firmware, and mobile app packages using triage, static disassembly, decompilation, and dynamic instrumentation. Use when analyzing an executable, ELF/PE/Mach-O file, firmware image, or stripped binary, recovering an algorithm or protocol, or working a CTF reversing challenge.
android-adb-control
Direct control of Android physical devices and Termux environments via Android Debug Bridge (ADB).
droidlume-control
Operate DroidLume-managed Android devices through the structured DroidLume CLI. Use for creating, starting, stopping, configuring, snapshotting, inspecting, repairing, and screenshotting devices; installing or launching APKs; sending Android input; and collecting diagnostics.