Operations

The terminal dock and jobs, the activity log, reports, archives, fleet users, your profile and settings.

This page covers the screens you use to run work across the fleet and to keep the Manager itself configured.

The terminal dock

The dock is the console. Open it with ⌃`, the terminal button in the top bar (title="Terminal · ⌃“`), the jobs pill, Open terminal in the command palette, or Open terminal in a site’s right-click menu.

It is a panel in the bottom right corner headed Activity with a running count.

Picking targets

The chip above the input (title="Select target environments") reads Select target when nothing is chosen, the environment name when one is, or 12 environments selected. Clicking it opens a picker with a Search targets… box, a count line and a Clear link, listing every fleet environment with its home URL.

Several screens preselect targets for you:

  • The Sites screen’s Console · N chip targets every filtered site’s production environment.
  • The bulk actions bar’s Open in console targets your hand-checked selection.
  • An account’s Open all in terminal targets every environment on every site in that account.
  • A security threat’s Open in terminal (targets prefilled) targets every affected environment.

With nothing explicitly selected and a site open, the command runs against that site’s current environment.

Cookbook recipes

A recipe is a stored bash or WP-CLI script. The Cookbook button (title="Cookbook recipes") opens a searchable list, each row labelled either “public recipe” or “private”.

Picking a private recipe inserts its content into the terminal input so you can read it before running. Picking a public or system recipe never shows the code: it opens a Run recipe confirm asking “Run on <targets>?” with the note that it runs as stored and its output streams to the console. That is deliberate, since non-administrators are never sent the content of public recipes.</p> <p>Recipes are created and edited on the Settings screen’s Cookbook tab.</p> <h3 id="running-and-streaming">Running and streaming</h3> <p>The input is a multi-line textarea reading <strong>Run a command across the fleet…</strong>. Enter adds a newline and <code>⌘⏎</code> runs. The hint line reads “⌘⏎ run · ⌃` toggle”.</p> <p>Running dispatches one job across every selected environment and streams its output back live. Console lines are colour-coded, and hovering any line reveals a copy button. Right-click a job row for <strong>Copy output</strong> and, while it is running, <strong>Cancel job</strong>.</p> <p>The dock keeps one activity row per target set. Running again against the same set appends to that session; a different set starts a new row. Clicking a session row also adopts its target set, so you can pick up where you left off.</p> <p>A <strong>Schedule</strong> button appears beside <strong>Run</strong> once you have typed something. It opens a dialog with a date and time in your own timezone and queues the command to run once on each selected target. Those land on each site’s Activity → Scheduled tab.</p> <h3 id="jobs">Jobs</h3> <p>Background work becomes a job. Each dock row shows a status dot, the job label, its target and either a percentage or “just now”. The strip caps at a few rows with a <strong>+ N more</strong> expander.</p> <p>The top bar shows a pulsing pill while anything runs, reading “1 job running” or “6 jobs running”. If the only thing running is a single fleet bulk run, the pill reads its live progress instead, for example <code>update · 47.1%</code>.</p> <h3 id="fleet-processes">Fleet processes</h3> <p>Bulk runs started from the CaptainCore CLI on the fleet server appear as their own strip inside the dock, above the jobs. Each row shows the command, the site count, a progress bar and a readout of <code>545/1157 · 47.1% · ETA 27m</code>. A run that has stopped gets a <strong>Stale</strong> chip and a dismiss control.</p> <p>Clicking a row opens the process detail dialog: the command, the completed and total counts, a progress bar, and stats for <strong>Elapsed</strong>, <strong>ETA</strong>, <strong>Parallel</strong>, <strong>Failed</strong>, <strong>PID</strong> and <strong>Target</strong>, plus the run’s arguments. Tabs below read <strong>Pending</strong>, <strong>Completed</strong> and, when there are failures, <strong>Failed</strong>, each listing the sites. The footer offers <strong>Kill process</strong> while it is running or <strong>Dismiss</strong> when it is stale. When a run finishes, a toast says so.</p> <h2 id="activity">Activity</h2> <p>The Activity screen is the fleet-wide event log, headed <strong>Fleet activity</strong> with an event count in the top bar.</p> <p>It is a feed rather than a table. Each row shows a relative time, the actor’s avatar (a gear glyph for automated rows), the description, the actor’s name, and a type chip mapping the entity to DNS, Site, Domain, Account, Deploy, Email, File or Security.</p> <p>Paging is 100 at a time with <strong>← Newer</strong> and <strong>Older →</strong>.</p> <p>The actions tracked are:</p> <div class="table-scroll"><table> <thead> <tr> <th>Action</th> <th>Entity</th> <th>Trigger</th> </tr> </thead> <tbody> <tr> <td><code>created</code></td> <td>site</td> <td>New site created or provisioned via a provider</td> </tr> <tr> <td><code>updated</code></td> <td>site</td> <td>Site settings updated</td> </tr> <tr> <td><code>deleted</code></td> <td>site</td> <td>Site marked inactive</td> </tr> <tr> <td><code>shared</code> / <code>unshared</code></td> <td>site</td> <td>Site shared with or removed from an account</td> </tr> <tr> <td><code>requested_removal</code> / <code>cancelled_removal</code></td> <td>site</td> <td>Removal requested or cancelled</td> </tr> <tr> <td><code>locked</code> / <code>unlocked</code></td> <td>domain</td> <td>Domain transfer lock changed</td> </tr> <tr> <td><code>updated</code></td> <td>domain</td> <td>Nameservers changed</td> </tr> <tr> <td><code>transferred</code></td> <td>domain</td> <td>Transfer initiated</td> </tr> <tr> <td><code>deleted</code></td> <td>domain</td> <td>Domain deleted</td> </tr> <tr> <td><code>created</code></td> <td>email_forward</td> <td>Email forwarding activated</td> </tr> <tr> <td><code>created</code> / <code>updated</code> / <code>deleted</code></td> <td>dns_record</td> <td>DNS record changed</td> </tr> <tr> <td><code>toggled</code></td> <td>environment</td> <td>Environment setting toggled</td> </tr> <tr> <td><code>deployed</code></td> <td>environment</td> <td>Deploy to production or staging</td> </tr> <tr> <td><code>invited</code></td> <td>account</td> <td>User invited to an account</td> </tr> </tbody> </table></div> <p>Each entry records the user, IP address, account context, entity type and id, a name snapshot that survives the resource being deleted, a description and a JSON context with old and new values. Administrators see everything; other users are scoped to their own accounts.</p> <p>Account-scoped activity also appears on each account’s Activity tab.</p> <h2 id="reports">Reports</h2> <p>The Reports screen sends maintenance reports and schedules recurring ones.</p> <p>The toolbar at the top builds an ad-hoc report. Choose <strong>Site</strong> or <strong>Account</strong>, pick the target, pick a date range from <strong>Last month</strong>, <strong>Last quarter</strong> or <strong>This year</strong>, and set the recipient. <strong>Preview</strong> renders the report in a dialog so you can read it before sending; <strong>Send report</strong> asks to confirm, then sends.</p> <p>Below that, the <strong>Scheduled reports</strong> card lists recurring reports. Each row shows the target, an interval chip, the next run date and the recipient, with <strong>Edit</strong> and <strong>Delete</strong>.</p> <p>To create one, set up the toolbar the way you want it, choose an interval, and click <strong>+ Schedule current selection</strong>. Intervals are <strong>Monthly</strong>, <strong>Quarterly</strong> and <strong>Yearly</strong>.</p> <p>A scheduled report covers the previous period: last calendar month, last quarter or last year. Reports run early morning on the first day of the new period. They cover updates, backups, visits and process logs.</p> <p>Sending is driven from cron with <code>wp captaincore scheduled-reports send</code> rather than WordPress cron, which times out on the work involved.</p> <h2 id="archives">Archives</h2> <p>Archives is an operator screen listing the <code>.zip</code> archives stored in long-term Backblaze B2 storage.</p> <p>The toolbar has a <strong>Filter archives…</strong> box that matches the filename or a <code>yyyy-mm-dd</code> date, and a count line reading something like <code>5035 archives · 6.6 TB on Backblaze B2</code>. Very large result sets render the first 500 rows and tell you to filter further.</p> <p>Each row shows the filename, the size, the modified date and one action: <strong>Share link (7d)</strong>, which mints a signed seven-day link and copies it to your clipboard, flipping to <strong>Copied ✓</strong>. That link is also how you download an archive.</p> <p>A store bar takes a <code>.zip</code> URL and a <strong>Store archive</strong> button, which fetches the archive into storage and reports progress inline.</p> <p>A footer note reads “Share links are valid for 7 days (Backblaze B2).”</p> <h2 id="users">Users</h2> <p>The Users screen is operator-only and lives at <code>/account/users</code>, so it can be bookmarked and reached directly. It lists the WordPress users of the Manager install, not the users on managed sites.</p> <p>The search box is labelled <strong>Filter users…</strong> and matches name, username and email. Columns are <strong>Name</strong> (display name over username), <strong>Email</strong>, <strong>Accounts</strong> (clickable chips) and <strong>Role</strong>. Rows show the person’s Gravatar when they have one, falling back to an initials monogram.</p> <p>At the end of each row is a button titled <strong>Access as this user</strong>, which signs you in as them. The same action is in the row’s right-click menu as <strong>Access as <name></strong>. While you are switched, a <strong>Switch back</strong> pill sits above the user card in the sidebar.</p> <p><strong>+ Add user</strong> in the top bar opens a dialog with First name, Last name, Email, Username and an <strong>Accounts</strong> typeahead. New users are created as subscribers with a generated password and get a welcome email. Right-click a row and choose <strong>Edit user</strong> to change a person’s details or account membership.</p> <h2 id="profile">Profile</h2> <p>Profile is self-service and available to every role.</p> <p>The details card takes your <strong>Name</strong>, <strong>Display name</strong>, <strong>Email</strong> and an optional <strong>New password</strong> (leave blank to keep the current one), saved with <strong>Save profile</strong>. A <strong>Change photo on Gravatar ↗</strong> link handles avatars.</p> <h3 id="two-factor-authentication">Two-factor authentication</h3> <p>The <strong>Two-factor authentication</strong> card carries an <strong>On</strong> or <strong>Off</strong> chip. Click <strong>Enable</strong> to start setup. The panel shows the secret for manual entry with the instruction “Add this secret to your authenticator, then enter the 6-digit code.” Enter the code and click <strong>Activate</strong>. To turn it off, click <strong>Deactivate</strong>.</p> <h3 id="application-passwords">Application passwords</h3> <p><strong>Application passwords</strong> are revocable credentials for the API and CLI, used over HTTP Basic auth. Each row shows its name, when it was created and when it was last used, with a <strong>Revoke</strong> button.</p> <p>To create one, name it in the field reading “Name — e.g. CaptainCore CLI, coding agent” and click <strong>+ New password</strong>. The password appears once, with a <strong>Copy</strong> control and the warning “Shown once — copy it now.”</p> <h3 id="api-documentation">API documentation</h3> <p>An <strong>API documentation</strong> card offers a <strong>View</strong> link that opens the full Markdown reference in a viewer with a generated table of contents, and a <strong>Download</strong> button that saves it as a Markdown file. The whole platform is scriptable with <code>curl</code> using an application password, so this is the reference for that.</p> <h3 id="legacy-dashboard">Legacy dashboard</h3> <p>A toggle switches you to the previous interface. Turning it on reloads into the legacy dashboard, and you switch back from its Profile screen.</p> <h3 id="active-sessions">Active sessions</h3> <p><strong>Active sessions</strong> lists where you are signed in, showing the location, operating system, browser and last activity. Your current session is chipped <strong>This device</strong> and cannot be signed out; others get a <strong>Sign out</strong> link. <strong>Sign out all others</strong> ends every other session at once. Beyond five sessions, a <strong>View all N sessions →</strong> link opens the full list.</p> <p>SSH keys are not on Profile. They are on the Settings screen.</p> <h2 id="settings">Settings</h2> <p>Settings has six tabs. Customers see only Cookbook; the other five are operator-only in the interface and on the server.</p> <h3 id="branding">Branding</h3> <p><strong>Portal name</strong> sets the name shown across the dashboard and in transactional email. <strong>Theme colors</strong> exposes colour swatches for the primary, success, warning, error and accent tokens. Save with <strong>Save branding</strong>.</p> <p>White-label portals themselves are configured in data rather than on this screen. When the Manager is served on a custom domain, a matching portal record overrides the name, colours, logo, DNS introduction, nameserver text and even the transactional SMTP identity, so an agency’s customers see the agency’s brand throughout.</p> <h3 id="providers">Providers</h3> <p>Providers are the connections to third-party services. Each row shows the provider name, whether it is connected, and <strong>Verify</strong> and <strong>Edit</strong> links. <strong>Verify</strong> calls the provider’s API and reports back.</p> <p><strong>+ Add provider</strong> opens a dialog with a <strong>Name</strong>, a <strong>Type</strong> and a free-form list of credential key and value pairs. The available types are:</p> <ul> <li>Hosting: Kinsta, WP Engine, Rocket.net, GridPane</li> <li>DNS: Constellix</li> <li>Domain: Hover.com, Spaceship</li> <li>Email: Mailgun, Forward Email</li> <li>Analytics: Fathom</li> <li>Live chat: Intercom</li> <li>Marketplace: Envato</li> </ul> <h3 id="site-defaults">Site defaults</h3> <p>The global defaults applied to newly created sites: <strong>Default email</strong>, <strong>Timezone</strong>, <strong>Recipes on new site</strong> and <strong>Default users</strong>. <strong>Edit</strong> on any row opens the shared Site defaults dialog described in <a href="/docs/manager/accounts-and-billing/">Accounts and billing</a>; the same dialog serves the per-account version.</p> <h3 id="ssh-keys">SSH keys</h3> <p><strong>Your public keys</strong> lists the SSH keys the fleet uses, each with its title, a fingerprint and a <strong>Delete</strong> link. The primary key is chipped <strong>Primary</strong>.</p> <h3 id="cookbook">Cookbook</h3> <p>The Cookbook is the recipe library. Sub-tabs split it into <strong>Mine</strong> and <strong>System</strong>; operators default to System, customers to Mine.</p> <p>Each row shows the recipe title, a <strong>Public</strong> or <strong>Private</strong> chip, a <strong>Run…</strong> link that sends it to the terminal, and <strong>Edit</strong> where you own it. Customers only manage their own recipes.</p> <p><strong>+ New recipe</strong> opens an editor with a <strong>Title</strong>, a script body reading <code># bash / wp-cli script</code>, and, for administrators, a <strong>Public — usable by all users</strong> toggle. Save with <strong>Save recipe</strong>.</p> <h3 id="handbook">Handbook</h3> <p>The Handbook is the operator documentation: stored procedures with a name, a time estimate, a repeat interval and quantity, and a Markdown description.</p> <p>Each row shows the process name and when it was last updated, with <strong>Edit</strong> and <strong>View</strong>. <strong>View</strong> renders the procedure with a meta line carrying the time estimate, the repeat interval and the roles it applies to. <strong>Edit</strong> opens a dialog with Name, Time estimate, Repeat, Quantity and Description. The repeat vocabulary is As needed, Daily, Weekly, Monthly and Yearly.</p> <h2 id="related">Related</h2> <ul> <li><a href="/docs/manager/dashboard-tour/">Dashboard tour</a></li> <li><a href="/docs/manager/wp-cli-commands/">WP-CLI commands</a></li> <li>Source: <a href="https://github.com/CaptainCore/captaincore-manager" target="_blank" rel="noopener">CaptainCore/captaincore-manager</a></li> </ul> </div> <footer class="docs-page__foot"> <span class="docs-page__updated"> Updated September 4, 2026 </span> <a class="docs-page__edit" href="https://github.com/CaptainCore" target="_blank" rel="noopener">Source on GitHub</a> </footer> <nav class="post-nav post-nav--docs" aria-label="Docs navigation"> <a class="card post-nav__link" href="https://captaincore.io/docs/manager/security/"> <span class="post-nav__dir">← Previous</span> <span class="post-nav__title">Security</span> </a> <a class="card post-nav__link post-nav__link--next" href="https://captaincore.io/docs/manager/wp-cli-commands/"> <span class="post-nav__dir">Next →</span> <span class="post-nav__title">WP-CLI Commands</span> </a> </nav> </article> <aside class="docs-toc" data-docs-toc hidden aria-label="On this page"> <div class="docs-toc__title">On this page</div> <nav class="docs-toc__list" data-docs-toc-list></nav> </aside> </div> </main><!-- .site-main --> <footer class="site-footer"> <div class="site-footer__inner"> <div class="footer-brand"> <a class="footer-brand__row brand brand--footer" href="https://captaincore.io/" rel="home"> <span class="brand__mark" style="width:30px;height:30px"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M19.68 13.34 L21.67 14.56 L20.65 17.02 L18.38 16.49 L16.49 18.38 L17.02 20.65 L14.56 21.67 L13.34 19.68 L10.66 19.68 L9.44 21.67 L6.98 20.65 L7.51 18.38 L5.62 16.49 L3.35 17.02 L2.33 14.56 L4.32 13.34 L4.32 10.66 L2.33 9.44 L3.35 6.98 L5.62 7.51 L7.51 5.62 L6.98 3.35 L9.44 2.33 L10.66 4.32 L13.34 4.32 L14.56 2.33 L17.02 3.35 L16.49 5.62 L18.38 7.51 L20.65 6.98 L21.67 9.44 L19.68 10.66 Z"></path><circle cx="12" cy="12" r="3.4"></circle></svg></span><span class="brand__name">CaptainCore</span> </a> <p class="footer-brand__address">WordPress management toolkit for geeky maintenance professionals.</p> <p class="footer-brand__note"> Built to run <a href="https://anchor.host">Anchor Hosting</a>. Made with ❤️ by <a href="https://austinginder.com">Austin Ginder</a>. </p> </div> <div class="footer-col"><div class="footer-col__title">Toolkit</div><ul><li><a href="https://captaincore.io/manager/">Manager</a></li><li><a href="https://captaincore.io/cli/">CLI</a></li><li><a href="https://captaincore.io/cookbook/">Cookbook<span class="footer-col__badge">29</span></a></li><li><a href="https://captaincore.io/_do/">_do</a></li><li><a href="https://captaincore.io/analytics/">Analytics</a></li></ul></div><div class="footer-col"><div class="footer-col__title">Learn</div><ul><li><a href="https://captaincore.io/docs/">Documentation</a></li><li><a href="https://captaincore.io/blog/">Blog<span class="footer-col__badge">14</span></a></li><li><a href="https://captaincore.io/development-updates/">Development updates</a></li><li><a href="https://captaincore.io/email-signup/">Email signup</a></li><li><a href="https://captaincore.io/feed/">RSS</a></li></ul></div><div class="footer-col"><div class="footer-col__title">Community</div><ul><li><a href="https://github.com/CaptainCore" target="_blank" rel="noopener" aria-label="GitHub (opens in a new tab)">GitHub<span class="footer-col__external" aria-hidden="true"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></span></a></li><li><a href="https://github.com/CaptainCore/captaincore-manager/blob/master/LICENSE.txt" target="_blank" rel="noopener" aria-label="MIT license (opens in a new tab)">MIT license<span class="footer-col__external" aria-hidden="true"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></span></a></li></ul></div> </div> </footer> </div><!-- .site --> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/captaincore-theme/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script id="coblocks-animation-js" src="https://captaincore.io/wp-content/plugins/coblocks/dist/js/coblocks-animation.js?ver=3.1.17"></script> <script id="captaincore-theme-js-extra"> var ccTheme = {"searchRest":"https://captaincore.io/wp-json/captaincore-theme/v1/palette","nonce":"43db69c906","commands":[{"group":"Go to","label":"Home","kind":"page","keys":"home start","url":"https://captaincore.io/"},{"group":"Go to","label":"Documentation","kind":"page","keys":"docs manual reference guide","url":"https://captaincore.io/docs/"},{"group":"Go to","label":"Manager","kind":"page","keys":"manager plugin dashboard control plane rest api","url":"https://captaincore.io/manager/"},{"group":"Go to","label":"CLI","kind":"page","keys":"cli command line go binary commands","url":"https://captaincore.io/cli/"},{"group":"Go to","label":"Cookbook","kind":"page","keys":"cookbook recipes wp-cli scripts","url":"https://captaincore.io/cookbook/"},{"group":"Go to","label":"_do","kind":"page","keys":"do bash utilities alias","url":"https://captaincore.io/_do/"},{"group":"Go to","label":"Analytics","kind":"page","keys":"analytics fathom stats","url":"https://captaincore.io/analytics/"},{"group":"Go to","label":"Blog","kind":"page","keys":"blog posts writing","url":"https://captaincore.io/blog/"},{"group":"Go to","label":"Development updates","kind":"page","keys":"updates newsletter emails history","url":"https://captaincore.io/development-updates/"},{"group":"Go to","label":"Email signup","kind":"page","keys":"subscribe newsletter email","url":"https://captaincore.io/email-signup/"},{"group":"Go to","label":"FAQ","kind":"page","keys":"faq questions","url":"https://captaincore.io/#faq"},{"label":"Manager on GitHub","keys":"source code repo plugin","url":"https://github.com/CaptainCore/captaincore-manager","group":"Links","kind":"link"},{"label":"CLI on GitHub","keys":"source code repo go","url":"https://github.com/CaptainCore/captaincore","group":"Links","kind":"link"},{"label":"Anchor Hosting","keys":"anchor host example customer","url":"https://anchor.host","group":"Links","kind":"link"},{"label":"Open the Anchor dashboard","keys":"account login dashboard demo","url":"https://anchor.host/account","group":"Links","kind":"link"},{"group":"Copy","label":"Install the Manager with WP-CLI","kind":"copy","keys":"install copy command manager","text":"wp plugin install https://github.com/CaptainCore/captaincore-manager/releases/latest/download/captaincore-manager.zip --activate"},{"group":"Copy","label":"Install the CLI (Linux and macOS)","kind":"copy","keys":"install copy command cli","text":"curl -fsSL https://raw.githubusercontent.com/CaptainCore/captaincore/master/install.sh | bash"},{"group":"Copy","label":"Use _do","kind":"copy","keys":"install copy command do","text":"alias _do='curl -sL https://captaincore.io/do | bash -s'"},{"group":"Actions","label":"Toggle light / dark","kind":"action","keys":"theme mode appearance dark light","action":"toggle-theme"}],"i18n":{"noResults":"Nothing matched. Try","copied":"Copied","posts":"Search results"}}; //# sourceURL=captaincore-theme-js-extra </script> <script id="captaincore-theme-js" src="https://captaincore.io/wp-content/themes/captaincore-theme/assets/js/app.js?ver=1.0.0"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://captaincore.io/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}} </script> <script type="module"> /*! This file is auto-generated */ var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); //# sourceURL=https://captaincore.io/wp-includes/js/wp-emoji-loader.min.js </script> </body> </html>