<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>CycleOps Changelog</title>
        <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog</link>
        <description>Keep up with the latest updates and improvements to CycleOps</description>
        <lastBuildDate>Mon, 10 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 CycleOps</copyright>
        <item>
            <title><![CDATA[Get critical canister alerts pushed to your phone with CycleOps]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications</guid>
            <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[CycleOps can now send alerts straight to your phone or favorite browser!]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/web-push-internal-56f5812e68e8a0724b136ed1b927891f.jpg" width="2400" height="1350" class="img_ev3q"></a></p>
<p>CycleOps can now send alerts straight to your phone or favorite browser!</p>
<p>Push notifications work great alongside email alerts, so you can now add an additional, more familiar notification channel for top-up alerts, low balance warnings, memory threshold alerts, and other important updates without changing your current alert setup.</p>
<p><em>Note: The CycleOps team recommends setting up push notifications <strong>in addition to</strong> (not as a replacement for) email alerts</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-enable-push-notifications">How to enable push notifications<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications#how-to-enable-push-notifications" class="hash-link" aria-label="Direct link to How to enable push notifications" title="Direct link to How to enable push notifications">​</a></h2>
<ol>
<li><a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">Sign in to CycleOps</a>.</li>
<li>In the sidebar, open <strong>Settings</strong>, then select <strong>Alerts</strong>.</li>
<li>Find <strong>Push Notifications</strong> and turn on <strong>Enable push notifications on this device</strong>.</li>
<li>When your browser asks for permission, choose <strong>Allow</strong>.</li>
<li>Click <strong>Send test notification</strong> to confirm everything is working. Test notifications can take up to five minutes to arrive.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="The Push Notifications card on the CycleOps Alerts page, with the per-device enable switch." src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-enable-push-0543569a03af6cf889b4288244e4c47e.jpg" width="1920" height="1050" class="img_ev3q"></p>
<p>Push is enabled per device. Repeat these steps on each browser, phone, or tablet where you want to receive CycleOps alerts.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="set-up-push-notifications-on-iphone-or-ipad">Set up push notifications on iPhone or iPad<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications#set-up-push-notifications-on-iphone-or-ipad" class="hash-link" aria-label="Direct link to Set up push notifications on iPhone or iPad" title="Direct link to Set up push notifications on iPhone or iPad">​</a></h2>
<p>Apple supports web push for Home Screen web apps on iOS and iPadOS 16.4 or later. To enable it:</p>
<ol>
<li>Open <a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">CycleOps</a> in Safari.</li>
<li>Tap the <strong>Share</strong> button.</li>
<li>Choose <strong>Add to Home Screen</strong>.</li>
<li>Open CycleOps from its new Home Screen icon.</li>
<li>Open <strong>Settings → Alerts</strong> and enable push notifications for the device.</li>
</ol>
<p><em>Tip: You can similarly enable push notifications on any smart phones (Samsung/Pixel/etc.) that allow for push notifications through home screen installed webapps.</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="open-an-alert-and-take-action">Open an alert and take action<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications#open-an-alert-and-take-action" class="hash-link" aria-label="Direct link to Open an alert and take action" title="Direct link to Open an alert and take action">​</a></h2>
<p>Tapping a CycleOps notification takes you directly to the relevant account or canister. The alert opens with current data and a clear next step, so you can understand what happened and act immediately.</p>
<div style="display:flex;justify-content:center"><img src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-push-alert-baf2d9b166b7bf17d42df27256cb980d.jpg" alt="A CycleOps top-up failure alert opened from a push notification." style="width:380px;max-width:100%"></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="manage-your-connected-devices">Manage your connected devices<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications#manage-your-connected-devices" class="hash-link" aria-label="Direct link to Manage your connected devices" title="Direct link to Manage your connected devices">​</a></h2>
<p>You can give each push device a recognizable name or remove devices you no longer use. Turning push off on one device does not interrupt alerts on your other connected devices.</p>
<p><img decoding="async" loading="lazy" alt="The Push Notifications card showing two connected devices." src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-connected-devices-940c06ed1b7d9770f9b3b671df732d6c.jpg" width="1920" height="1300" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="add-push-notifications-to-your-own-app">Add push notifications to your own app<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/push-notifications#add-push-notifications-to-your-own-app" class="hash-link" aria-label="Direct link to Add push notifications to your own app" title="Direct link to Add push notifications to your own app">​</a></h2>
<p>CycleOps' push notifications feature is powered by <a href="https://github.com/research-ag/notification-service" target="_blank" rel="noopener noreferrer">research-ag's notification service</a>, an open-source web push stack for Internet Computer apps. It includes a notification canister, a relayer for delivering browser notifications, a frontend SDK, and examples you can adapt for your own project.</p>
<p>If you want to bring push notifications to your app, visit the <a href="https://github.com/research-ag/notification-service" target="_blank" rel="noopener noreferrer">research-ag/notification-service repository</a> for the integration and local development guide.</p>
<p>Ready to try it? <a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">Sign in to CycleOps</a>, open <strong>Settings → Alerts</strong>, and connect your first device.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New CycleOps Metrics For All Your Protocol Memory Cost Change Questions]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/memory-price-changes</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/memory-price-changes</guid>
            <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Memory costs on ICP are changing, and you might be thinking "what does this mean for my cycle bill"?]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/memory-price-changes"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/memory-price-changes-internal-c79b8290969b4dd1b0d22f3376ea4aa7.png" width="1536" height="1024" class="img_ev3q"></a></p>
<p>Memory costs on ICP are changing, and you might be thinking "what does this mean for my cycle bill"?</p>
<p>We were wondering the same thing, so we built a dedicated <strong>Memory Price Change</strong> view into CycleOps that teams can use to quickly understand the impact of the upcoming <a href="https://nns.ic0.app/proposal/?u=qoctq-giaaa-aaaaa-aaaea-cai&amp;proposal=140538" target="_blank" rel="noopener noreferrer">ICP protocol memory pricing</a> update.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-this-affect-my-canisters">How does this affect my canisters?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/memory-price-changes#how-does-this-affect-my-canisters" class="hash-link" aria-label="Direct link to How does this affect my canisters?" title="Direct link to How does this affect my canisters?">​</a></h2>
<p><a href="https://nns.ic0.app/proposal/?u=qoctq-giaaa-aaaaa-aaaea-cai&amp;proposal=140538" target="_blank" rel="noopener noreferrer">NNS Proposal #140538</a> proposes to increase canister memory costs on ICP by 2.5× (from $5 to $12.50 per GB/year).</p>
<p>While no implementation date has been set, we've provided a tool in CycleOps that you can use to better understand how this will affect your monthly canister costs.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-view-your-projected-memory-cost-increase">How to view your projected memory cost increase<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/memory-price-changes#how-to-view-your-projected-memory-cost-increase" class="hash-link" aria-label="Direct link to How to view your projected memory cost increase" title="Direct link to How to view your projected memory cost increase">​</a></h2>
<p>Upon logging in, you should see a notification on the left-hand side of the app about your account's monthly memory cost changes.</p>
<p><img decoding="async" loading="lazy" alt="side-panel-cost-notification.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/side-panel-cost-notification-4efa949befe14a692df5d62330895dd7.png" width="468" height="314" class="img_ev3q"></p>
<p>Click on <strong>"View details"</strong> to see an account-wide and per-canister breakdown of your projected memory costs before and after the protocol changes take effect.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="account-wide--per-canister-memory-cost-metrics">Account Wide &amp; Per Canister Memory Cost Metrics<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/memory-price-changes#account-wide--per-canister-memory-cost-metrics" class="hash-link" aria-label="Direct link to Account Wide &amp; Per Canister Memory Cost Metrics" title="Direct link to Account Wide &amp; Per Canister Memory Cost Metrics">​</a></h3>
<p><strong>Important: Data on this page is estimated. Protocol memory cost increases have been proposed but are not currently in effect.</strong></p>
<p>The new memory cost page displays estimates on an account-wide and per-canister basis before and after the protocol change.
Keep in mind that these estimates will change as new canisters are added and as existing canisters use more memory.</p>
<p>At the top, you'll find aggregated, <strong>account-wide</strong> monthly estimates for:</p>
<ul>
<li>Before/After memory cost</li>
<li>Memory cost increase amount</li>
<li><strong>Total cycle costs (memory + compute)</strong>, and the percent change in those monthly totals after memory costs increase</li>
</ul>
<p><img decoding="async" loading="lazy" alt="cost-increases-overview.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/cost-increases-overview-e4a0f528158294693a0ec390823e649e.png" width="3020" height="660" class="img_ev3q"></p>
<p>Additionally, you'll find a <strong>per-canister cost impact table</strong> sorted by canisters with the largest memory-related cost increase.</p>
<p><img decoding="async" loading="lazy" alt="per-canister-cost-table.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/per-canister-cost-table-eaa35ee6539b81f4354d016fee13e249.png" width="2628" height="1176" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="closing-thoughts">Closing thoughts<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/memory-price-changes#closing-thoughts" class="hash-link" aria-label="Direct link to Closing thoughts" title="Direct link to Closing thoughts">​</a></h2>
<p>While a 2.5× change sounds large in isolation, every application and canister has a different cost breakdown.
Understanding projected costs can help you identify your most impacted services and realize future cost savings.</p>
<hr>
<p>Have feedback or questions about the new memory cost tool? Reach out on <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">X</a> or in <a href="https://oc.app/community/tw3lb-zqaaa-aaaar-ar3aa-cai/?ref=xeivw-sqaaa-aaaaf-adr7a-cai" target="_blank" rel="noopener noreferrer">OpenChat</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[We Gave Our Bug Backlog to Agents]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents</guid>
            <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We operate CycleOps and ICPTopup as a tiny distributed team (two founders and some contractors). Like most small teams, we've always had more product improvements queued up than we could get to. UI papercuts, customer-reported bugs, and small polish work can be the difference between a product that feels good and one that feels neglected.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/kaizen-internal-b7fd15f7412da39269218b356d94eb76.jpg" width="1204" height="675" class="img_ev3q"></a></p>
<p>We operate <a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">CycleOps</a> and <a href="https://icptopup.com/" target="_blank" rel="noopener noreferrer">ICPTopup</a> as a tiny distributed team (two founders and some contractors). Like most small teams, we've always had more product improvements queued up than we could get to. UI papercuts, customer-reported bugs, and small polish work can be the difference between a product that feels good and one that feels neglected.</p>
<p>Since February, we've been shipping 5-10 of these incremental fixes every week, with most of the work done by AI agents. We took a continuous improvement process we've been running for years and adapted it so that agents handle the heavy lifting while humans stay in charge of the decisions that require taste, product context, and long term engineering perspective.</p>
<p>This article is a walkthrough of how we moved this process to agents, what is working, and what we want to do next.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="it-started-with-a-process-we-already-had">It Started With a Process We Already Had<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents#it-started-with-a-process-we-already-had" class="hash-link" aria-label="Direct link to It Started With a Process We Already Had" title="Direct link to It Started With a Process We Already Had">​</a></h2>
<p>For a few years now, we've run an internal process we call "kaizen", borrowed from Toyota's philosophy of continuous, compounding improvement. The idea is simple: observe the product → spot issues → prioritize them → fix them → ship → repeat. We had it fully documented with four defined roles and a clear lifecycle that every issue followed.</p>
<p>When we started looking at what agents could take over, we didn't design a new system. We looked at our existing process and asked which of the four roles could be done by an agent. The answer was two: the project management work and the coding work. The other two (spotting issues and deciding what's worth fixing) stayed with humans, for now.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-works">How It Works<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works">​</a></h2>
<!-- -->
<p><strong>The Owner</strong> is anyone on the team who notices something off. You report it in Discord — a sentence or two is enough — and the system picks it up.</p>
<p><img decoding="async" loading="lazy" src="https://pub-ea4ccfac12e54156a970c35043fb7702.r2.dev/changelog/kaizen-agents/Pasted-image-20260302104059.png" alt="A customer reports a UI inconsistency in Discord. The Assistant bot deduplicates and creates a GitHub issue automatically." class="img_ev3q">
<em>A customer reports a UI inconsistency in Discord. The Assistant bot deduplicates and creates a GitHub issue automatically.</em></p>
<p><strong>The Assistant</strong> is an AI agent (his name is Canny) that acts as project manager. He lives in our Discord and watches for new reports. When one comes in, he creates a GitHub issue, checks for duplicates, and then goes and does the research a human PM would do: he pulls session recordings from PostHog, tries to reproduce the bug in a real browser, reads the relevant source code, and writes up acceptance criteria. Once he has a clear picture, he sends the Director a brief with a recommendation.</p>
<p><img decoding="async" loading="lazy" src="https://pub-ea4ccfac12e54156a970c35043fb7702.r2.dev/changelog/kaizen-agents/Pasted-image-20260302161347.png" alt="The Assistant presents an issue brief to the Director for review." class="img_ev3q">
<em>The Assistant presents an issue brief to the Director for review. A quick 👍 or 👎 keeps the pipeline moving.</em></p>
<p><strong>The Director</strong> is human. They look at the Assistant's brief and decide: is this worth doing? This is where product judgment lives. Some issues are clear cut improvements, but some issues require additional design thinking.</p>
<p><strong>The Contributor</strong> is another AI agent, this one focused entirely on writing code. It picks up issues that the Director has approved, reads the codebase, writes a fix, tests it in a browser, takes screenshots showing the fix works, and opens a PR. If the PR gets rejected, the issue goes back through the loop with feedback.</p>
<p><img decoding="async" loading="lazy" src="https://pub-ea4ccfac12e54156a970c35043fb7702.r2.dev/changelog/kaizen-agents/Pasted-image-20260302161553.png" alt="The Owner gets pinged when a fix is ready." class="img_ev3q">
<em>The Owner gets pinged when a fix is ready. Review the PR, merge, ship.</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-tools">The Tools<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents#the-tools" class="hash-link" aria-label="Direct link to The Tools" title="Direct link to The Tools">​</a></h2>
<p>The Contributor runs on <a href="https://github.github.io/gh-aw/" target="_blank" rel="noopener noreferrer">GitHub Agentic Workflows (gh-aw)</a>, GitHub's framework for running AI agents inside Actions. Everything is configured in markdown, agents run in sandboxed containers, and write operations go through approved outputs. We use Claude Code as the underlying model, which has given us the best results for well-scoped coding tasks.</p>
<p>The Assistant runs on <a href="https://docs.openclaw.ai/" target="_blank" rel="noopener noreferrer">OpenClaw</a>, a self-hosted gateway that gives an AI agent its own computer. We need this for the Assistant because its job is broad—it browses PostHog, tests things in a real browser, manages GitHub issues, and messages people on Discord and Telegram. The nice thing about an agent with its own computer is that updating the process is as easy as sending it a message. Want weekly shipping reports? Tell it on Telegram. Want to change how issues get prioritized? Same thing. It updates its own protocols.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-weve-learned">What We've Learned<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents#what-weve-learned" class="hash-link" aria-label="Direct link to What We've Learned" title="Direct link to What We've Learned">​</a></h2>
<p><strong>The process documentation was the hard part, and we'd already done it.</strong> Our written kaizen process (roles, lifecycle stages, decision criteria) essentially became the system prompt for the whole pipeline. If we hadn't documented this years ago for our own human team, setting this up with agents would have been dramatically harder. If you're thinking about doing something similar, start there.</p>
<p><strong>Issue refinement is arguably where agents add the most value.</strong> Converting a one-line Discord message into a well-researched GitHub issue with reproduction steps, root cause analysis, and clear acceptance criteria used to cost us anywhere from five minutes to an hour per issue, depending on complexity. Canny handles all of that now. And the better the issue is written, the better the Contributor's code turns out, so this step compounds.</p>
<p><strong>Humans currently need to stay on prioritization.</strong> Agents will cheerfully ship issues that lack fundamental product thinking. The Director role exists specifically to prevent that. Every issue gets a human review before any code gets written. As models improve and as our team more clearly understands the fundamental context problem, there should be less and less work for the humans to do at this step.</p>
<p><strong>It doesn't need to work perfectly.</strong> The Contributor writes broken code sometimes. The Assistant loses track of issues occasionally. That's fine... the process has review cycles and human checkpoints that catch failures. Even at imperfect reliability, the throughput gain is massive.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-it-falls-short">Where It Falls Short<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/kaizen-agents#where-it-falls-short" class="hash-link" aria-label="Direct link to Where It Falls Short" title="Direct link to Where It Falls Short">​</a></h2>
<p>Canny the OpenClaw agent in particular can be inconsistent, and we're experimenting with moving some of its responsibilities into more deterministic, purpose-built components.</p>
<p>The process is handling frontend fixes well, but we've intentionally restricted agents from touching our backend systems so far.</p>
<p>That said, for what it does cover, it's been worth it many times over. We're delivering a level of product polish that we genuinely could not achieve without this, not at our team size.</p>
<hr>
<p><em>If you use <a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">CycleOps</a> or <a href="https://icptopup.com/" target="_blank" rel="noopener noreferrer">ICPTopup</a> and notice something that could be better, hit the feedback button. It goes straight into this pipeline, and you'll typically see your improvement shipped within a week (if it's actionable).</em></p>
<p><em>If you want to build something like this for your own team, we're happy to go deeper on the technical details. Feel free to <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">reach out</a>!</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CycleOps now works great on your phone]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/mobile</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/mobile</guid>
            <pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We’ve shipped a broad set of mobile UX improvements, and CycleOps is now genuinely easy to use on your phone.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/mobile"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/mobile-internal-bc949a509c7357f7d34ea5e897e32c3f.png" width="1204" height="675" class="img_ev3q"></a></p>
<p>We’ve shipped a broad set of mobile UX improvements, and CycleOps is now genuinely easy to use on your phone.</p>
<p>Whether you’re checking cycles balances, responding to an alert, or doing a quick top-up, you can now do it comfortably on the go.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-shipped">What we shipped<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/mobile#what-we-shipped" class="hash-link" aria-label="Direct link to What we shipped" title="Direct link to What we shipped">​</a></h2>
<p>A sweep of mobile-focused fixes across the CycleOps web app, including:</p>
<ul>
<li>Cleaner navigation and page layouts on small screens</li>
<li>More usable tables, charts, and dashboards on mobile</li>
<li>Improved forms and action flows (top-ups, canister actions, etc.)</li>
<li>Better tap targets, spacing, and readability across the app</li>
</ul>
<p>So often when you want to do “real work” in a mobile browser, you find unoptimized UIs are forced to bounce. We want to make sure this doesn't happen when managing your canisters on CycleOps.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-it-matters">Why it matters<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/mobile#why-it-matters" class="hash-link" aria-label="Direct link to Why it matters" title="Direct link to Why it matters">​</a></h2>
<p>CycleOps is operational tooling. And operational tooling is most valuable when you’re <em>not at your desk</em>.</p>
<p>This update turns a bunch of “I’ll deal with it later” moments into “handled in 20 seconds” success stories:</p>
<ul>
<li>You notice something looks off → you can check it immediately.</li>
<li>You’re mid-day, mid-errand, mid-anything → you can still take action.</li>
<li>You want confidence that everything’s healthy → you can get it from your pocket.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-you-can-use-it">How you can use it<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/mobile#how-you-can-use-it" class="hash-link" aria-label="Direct link to How you can use it" title="Direct link to How you can use it">​</a></h2>
<p>Open CycleOps on your phone and try the “real” workflows:</p>
<ul>
<li>Check cycles balances while you’re out at lunch</li>
<li>Do a quick top-up during a walk or workout</li>
<li>Deploy or manage a canister when you’re away from your laptop</li>
<li>Keep building on ICP (and keep your canisters healthy) wherever you are</li>
</ul>
<p>If you’ve never used CycleOps before: it’s a proactive canister management layer for the Internet Computer (monitoring, alerts, and top-ups) designed to reduce operational overhead and prevent surprise outages.</p>
<p><strong>Try CycleOps:</strong><br>
<a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">https://cycleops.dev</a><br>
<a href="https://icptopup.com/" target="_blank" rel="noopener noreferrer">https://icptopup.com</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automate Your Canister Deployments with CycleOps and ic-deploy-actions]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments</guid>
            <pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[CI/CD pipelines just got a lot easier on the Internet Computer.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/poster-a806862410165468d7a47cb63cccf324.png" width="958" height="456" class="img_ev3q"></a></p>
<p>CI/CD pipelines just got a lot easier on the Internet Computer.</p>
<p>In this post, I'm going to show you how you can easily automate your deployments using <code>CycleOps</code> and <code>IC Deploy Actions</code></p>
<p>No need to manually run dfx deploy command on your terminal, or spend hours configuring your custom github actions. Just plug in and use.</p>
<hr>
<p>Hi there, I'm Steve Kimoi, an ICP developer behind tools like <a href="https://crates.io/crates/generate-did" target="_blank" rel="noopener noreferrer">generate-did</a>, <a href="https://canisterdns.stevekimoi.me/" target="_blank" rel="noopener noreferrer">DNS Config Generator</a>, <a href="https://github.com/Stephen-Kimoi/cketh-tutorial" target="_blank" rel="noopener noreferrer">ckTokens Minter</a> and other <a href="https://stevekimoi.me/icp-projects" target="_blank" rel="noopener noreferrer">ICP developer toolkits</a>.</p>
<p>Today I'm walking through how CycleOps pairs with the <a href="https://github.com/Stephen-Kimoi/ic-deploy-action" target="_blank" rel="noopener noreferrer"><code>ic-deploy-actions</code></a> GitHub Action to make Internet Computer deployments hands-off.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-shipped">What We Shipped<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments#what-we-shipped" class="hash-link" aria-label="Direct link to What We Shipped" title="Direct link to What We Shipped">​</a></h2>
<p>You can now easily automate your deployments to Internet Computer with these simple steps using <a href="https://github.com/Stephen-Kimoi/ic-deploy-action" target="_blank" rel="noopener noreferrer">ic-deploy-actions</a></p>
<ul>
<li>With just simple steps automation, you're sorted for life: combination of <code>CycleOps</code> with <code>ic-deploy-actions</code> helps you build &amp; automatically deploy your canisters on every push.</li>
<li>Secure auth: PEM keys are stored in GitHub Secrets, keeping credentials out of source control.</li>
<li>Flexible workflows: you get to ship a single canister or multiple canisters within the same pipeline.</li>
<li>Repeatable delivery: every merge to the default branch automatically updates your production code, thus making you stay consistent.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-it-matters">Why It Matters<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters">​</a></h2>
<p>Manual deployments get messy when your project or team grows. This workflow keeps every step in GitHub, removes copy-paste scripts, and uses familiar GitHub Actions. What you merge is what goes live on mainnet.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-you-can-use-it">How You Can Use It<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments#how-you-can-use-it" class="hash-link" aria-label="Direct link to How You Can Use It" title="Direct link to How You Can Use It">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-create-or-add-a-canister-in-cycleops">1. Create or Add a Canister in CycleOps<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments#1-create-or-add-a-canister-in-cycleops" class="hash-link" aria-label="Direct link to 1. Create or Add a Canister in CycleOps" title="Direct link to 1. Create or Add a Canister in CycleOps">​</a></h3>
<ul>
<li>Spin up the canister from your CycleOps dashboard - full docs live <a href="https://docs.cycleops.dev/changelog/canister-creation" target="_blank" rel="noopener noreferrer">here</a>.</li>
<li>Run a one-time deploy from your workstation so the canister has initial code on mainnet.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-wire-up-ic-deploy-actions">2. Wire Up <code>ic-deploy-actions</code><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments#2-wire-up-ic-deploy-actions" class="hash-link" aria-label="Direct link to 2-wire-up-ic-deploy-actions" title="Direct link to 2-wire-up-ic-deploy-actions">​</a></h3>
<p>Create <code>.github/workflows/deploy.yml</code> in your repo and paste in this workflow:</p>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Deploy to IC</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">main</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">workflow_dispatch</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">deploy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@v3</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Deploy to IC</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Stephen</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">Kimoi/ic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">deploy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">action/action@v0.1.1</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">pem_key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> secrets.IC_PEM_KEY </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">network</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ic</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">canister_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> your_backend_canister_name</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">deploy_frontend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">deploy_backend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">frontend_dir</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> src/your_frontend_dir/dist</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">backend_package</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> your_backend_package</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">frontend_package</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> your_frontend_package</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">          </span><span class="token key atrule">frontend_src_dir</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> src/your_frontend_dir</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Generate a <strong>PEM key</strong> and add it to your <strong>GitHub secrets</strong>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">dfx identity new cicd-identity --storage-mode=plaintext</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">dfx identity export cicd-identity &gt; cicd-identity.pem</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">base64 -i cicd-identity.pem &gt; cicd-identity.pem.base64</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Copy the <strong>Base64 output</strong> into a <strong>IC_PEM_KEY</strong> repository secret and you're done.</p>
<p>That's it - every push to <code>main</code> now ships straight to the Internet Computer. CycleOps handles monitoring and top-ups, while <code>ic-deploy-actions</code> keeps builds and deployments flowing.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-ready-to-try-it">✅ Ready to try it?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/automate-canister-deployments#-ready-to-try-it" class="hash-link" aria-label="Direct link to ✅ Ready to try it?" title="Direct link to ✅ Ready to try it?">​</a></h3>
<ol>
<li><a href="https://docs.cycleops.dev/changelog/canister-creation" target="_blank" rel="noopener noreferrer">Create a canister in CycleOps</a></li>
<li>Add <a href="https://github.com/Stephen-Kimoi/ic-deploy-action" target="_blank" rel="noopener noreferrer"><code>ic-deploy-actions</code></a> to your repo</li>
<li>Push to <code>main</code> and watch your deployment go live</li>
</ol>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Keep Your Canister Memory in Check with CycleOps Analytics]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/advanced-memory-metrics</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/advanced-memory-metrics</guid>
            <pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Heap overflow anxiety — gone. The new CycleOps V3 Blackhole adds 8 new in-depth memory metrics, with heap and stable memory alerts that keep your canister's data healthy and cost‑efficient.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/advanced-memory-metrics"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/protocol-metrics-internal-5e3e673a7b0f18775f877aae4c864586.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Heap overflow anxiety — gone. The new CycleOps V3 Blackhole adds 8 new in-depth memory metrics, with heap and stable memory alerts that keep your canister's data healthy and cost‑efficient.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-memory-metrics">New Memory Metrics<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/advanced-memory-metrics#new-memory-metrics" class="hash-link" aria-label="Direct link to New Memory Metrics" title="Direct link to New Memory Metrics">​</a></h3>
<p>Every canister <a href="https://docs-egk6u2ynu-cycleops.vercel.app/docs/blackhole-upgrade">with monitoring upgraded to the V3&nbsp;Blackhole</a> now reports <strong>eight new memory fields</strong>, in addition to an aggregate total</p>
<p><img decoding="async" loading="lazy" alt="screenshot-memory-chart.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-memory-chart-36ae0409549e4b5e08c3a7109f98ab09.png" width="1460" height="352" class="img_ev3q"></p>
<p>The new memory fields tracked include</p>
<ul>
<li><code>wasm_memory_size</code> - Tracks memory used by the WebAssembly module.</li>
<li><code>stable_memory_size</code> - Captures memory stored persistently across upgrades.</li>
<li><code>global_memory_size</code> - Monitors memory allocated for global variables.</li>
<li><code>wasm_binary_size</code> - Shows the size of the deployed WebAssembly binary.</li>
<li><code>custom_sections_size</code> - Reports the size of custom sections in the Wasm binary.</li>
<li><code>canister_history_size</code> - Tracks memory used by the canister's historical data.</li>
<li><code>wasm_chunk_store_size</code> - Measures storage used by Wasm chunking mechanisms.</li>
<li><code>snapshots_size</code> - Monitors memory usage by stored snapshots.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-these-metrics-help-me">How Do these metrics help me?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/advanced-memory-metrics#how-do-these-metrics-help-me" class="hash-link" aria-label="Direct link to How Do these metrics help me?" title="Direct link to How Do these metrics help me?">​</a></h3>
<p>Different components of canister memory have different protocol limits. For example,</p>
<ul>
<li>Wasm (heap) memory size - 4GB (or 6GB for wasm64 canisters)</li>
<li>Wasm binary size - 100MB</li>
<li>Stable memory size - 500GB (can up to as large as the single canister limit)</li>
</ul>
<p>Understanding these memory limits and using CycleOps to monitor and set appropriate alert thresholds allows you to:</p>
<ul>
<li><strong>Catch leaks early:</strong> Get alerted immediately when heap or stable memory usage spikes.</li>
<li><strong>Save money:</strong> Track and optimize memory growth over time, saving on storage cycle costs.</li>
<li><strong>Avoid memory cliffs:</strong> Set proactive heap alerts to avoid hitting unfixable overflow errors and ensure smooth canister migrations.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-about-email-alerts">What about email alerts?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/advanced-memory-metrics#what-about-email-alerts" class="hash-link" aria-label="Direct link to What about email alerts?" title="Direct link to What about email alerts?">​</a></h3>
<p>Quickly set up memory email alerts for individual canisters by clicking on the canister -&gt; settings -&gt; alerts.</p>
<p><img decoding="async" loading="lazy" alt="screenshot-memory-alert-settings.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-memory-alert-settings-b68d70db9e6ba00378d8939386654dec.png" width="1200" height="785" class="img_ev3q"></p>
<p>Or for multiple canisters at a time by selecting a few canisters and pulling up the batch actions menu with (⌘ + K) or right click.</p>
<p><img decoding="async" loading="lazy" alt="screenshot-batch-actions-memory-alert.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-batch-actions-memory-alert-b71a83c1415a94a162f0e0a40d9207f3.png" width="582" height="469" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-can-i-upgrade">How can I upgrade?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/advanced-memory-metrics#how-can-i-upgrade" class="hash-link" aria-label="Direct link to How can I upgrade?" title="Direct link to How can I upgrade?">​</a></h3>
<p>Each of these metrics provides deeper insight into memory distribution, helping teams optimize their canister deployments.</p>
<p>If you have any canisters that are eligible for a monitoring upgrade, you will be prompted to go through the upgrade wizard when you sign in. You can alternatively upgrade monitoring metrics with the batch actions menu or on the individual canister metrics page.</p>
<p>Continue reading <a href="https://docs-egk6u2ynu-cycleops.vercel.app/docs/blackhole-upgrade">here to learn more blackhole upgrades</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ship Canisters in 5 Minutes with ICP Ninja & CycleOps]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icp-ninja</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icp-ninja</guid>
            <pubDate>Mon, 23 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're very excited to announce a new integration with icp.ninja, the web based integrated development environment (IDE) that is the best place to kick start your Internet Computer development journey. We built a new protocol and API that enables icp.ninja users to create, deploy, and manage real canisters, right from the IDE.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icp-ninja"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/internal-b2d0ac56a1dc1c1f7d212288a4542f12.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Today we're very excited to announce a new integration with icp.ninja, the web based integrated development environment (IDE) that is the best place to kick start your Internet Computer development journey. We built a new protocol and API that enables icp.ninja users to create, deploy, and manage real canisters, right from the IDE.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-icp-ninja">Introducing ICP Ninja<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icp-ninja#introducing-icp-ninja" class="hash-link" aria-label="Direct link to Introducing ICP Ninja" title="Direct link to Introducing ICP Ninja">​</a></h2>
<p>We’re big believers in removing friction from the developer experience on ICP. You shouldn't need to think about token balances or manual top-ups just to launch your first app. When we connected with Georgi and the ICP Ninja team at DFINITY, it was clear we shared that same vision.</p>
<p>ICP Ninja gets it right. It lowers the barrier to entry, gives you the familiar IDE feel, and lets you start building fast. There was one limitation that it had, however. Until now, each deployment was temporary, only lasting a few minutes. While you could build, you weren’t really deploying on infrastructure you could keep.</p>
<p>That changes today.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="own-your-canisters">Own Your Canisters<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icp-ninja#own-your-canisters" class="hash-link" aria-label="Direct link to Own Your Canisters" title="Direct link to Own Your Canisters">​</a></h2>
<p>With this integration, developers can now deploy canisters they actually own and control, directly from ICP Ninja. These are real, persistent canisters owned and controlled by you, ready to run production code.</p>
<p>Even better, they come with smart defaults. Every canister deployed through this flow is automatically monitored and configured with a top-up rule in CycleOps. If something goes wrong or cycles start running low, you’ll get a heads-up before anything breaks.</p>
<p>This matters. Canisters are the core building block for shipping software on ICP, and the fundamentals of how to maintain them should be easy and clear from the start. New developers shouldn’t have to learn the hard way. Best practices such as top-up rules should be built in, and that’s exactly what this release delivers.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="account-linking-protocol--canister-management-api">Account Linking Protocol &amp; Canister Management API<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icp-ninja#account-linking-protocol--canister-management-api" class="hash-link" aria-label="Direct link to Account Linking Protocol &amp; Canister Management API" title="Direct link to Account Linking Protocol &amp; Canister Management API">​</a></h2>
<p>To make this possible, we built an account linking protocol that securely links your ICP Ninja and CycleOps accounts with a one-time handshake. After that, all canisters published through ICP Ninja are automatically managed and monitored by CycleOps.</p>
<p>We also developed a new canister management API for 3rd party integrations. It provides read and write methods, so ICP Ninja can display live canister health, estimated runtime, and perform key actions like paying for new canisters or updating settings. Of course, for the full-on canister management experience, users will be directed to cycleops.dev.</p>
<p>If you’re building tools or dev experiences and want to tap into this API, reach out. We’d be happy to collaborate.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="go-ship-canisters">Go Ship Canisters!<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icp-ninja#go-ship-canisters" class="hash-link" aria-label="Direct link to Go Ship Canisters!" title="Direct link to Go Ship Canisters!">​</a></h2>
<p>If you haven’t already, head over to icp.ninja and try it out. Create a project, link your account, write some code, and publish real canisters. You’ll get automation, monitoring, and best practices baked in from the very first deploy.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Trace Every Change with Built‑In Canister History]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-history</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-history</guid>
            <pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Spot the metric anomaly, trace it to a code update, and uncover the bug—your CycleOps dashboard just got x‑ray vision.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-history"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/canister-history-internal-c6d56f69fed3ad89f61a34e3e00bf788.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Spot the metric anomaly, trace it to a code update, and uncover the bug—your CycleOps dashboard just got x‑ray vision.</p>
<p>Today, we’re excited to announce a direct integration with <strong>Research‑AG’s canister <a href="https://history.ic0.info/" target="_blank" rel="noopener noreferrer">History Tracker</a></strong>, allowing developers to connect memory spikes and cycle burn surges back to the exact deployments that triggered them.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-shipped">What We Shipped<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-history#what-we-shipped" class="hash-link" aria-label="Direct link to What We Shipped" title="Direct link to What We Shipped">​</a></h2>
<p>CycleOps now integrates <strong>Research‑AG’s History Tracker</strong> for every canister in your account. 0 extra setup—just richer insights:</p>
<ul>
<li><strong>Code revisions</strong>: view each WASM hash and its deploy timestamp</li>
<li><strong>Controller events</strong>: view additions &amp; removals, with the actor who made the change</li>
<li><strong>Metric overlays</strong>: code change events are layered directly onto your cycle balance chart,&nbsp;making it easy to correlate metrics with code updates.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="screenshot-cycles-with-changes.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-cycles-with-changes-e740b36c0b6ec34acc46ca24dfea4396.png" width="705" height="332" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-it-matters">Why It Matters<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-history#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters">​</a></h2>
<p>Correlate <em>what changed</em> with <em>what broke (or improved)</em>:</p>
<ul>
<li>Memory spikes, cycle burn surges, latency drops—see the exact deployment that triggered them.</li>
<li>Shared canister? Third‑party logs provide an immutable audit trail for controller changes, perfect for multi‑dev team ops or post‑mortems.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-you-can-use-it">How You Can Use It<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-history#how-you-can-use-it" class="hash-link" aria-label="Direct link to How You Can Use It" title="Direct link to How You Can Use It">​</a></h2>
<ol>
<li><strong>Open any canister</strong> in your CycleOps dashboard.</li>
<li>Scroll to the <strong>Cycle Balance time series chart—history markers are auto‑overlaid.</strong></li>
<li>Click <strong>History</strong> (top‑right) for a full chronological view, complete with diffable WASM hashes and controller metadata.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="screenshot-change-history.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-change-history-8b726c83c7088a87f566c6ac6b226fe6.png" width="713" height="697" class="img_ev3q"></p>
<p>That’s it. New accounts get history tracking out of the box, and existing accounts already have it enabled—just refresh and explore.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="kudos">Kudos<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-history#kudos" class="hash-link" aria-label="Direct link to Kudos" title="Direct link to Kudos">​</a></h2>
<p>Huge thanks to Timo Hanke and the <a href="https://x.com/mr_research_ag" target="_blank" rel="noopener noreferrer">Research‑AG</a> team for building the History Tracker service, and for their support during the integration.</p>
<hr>
<p>Ready to level‑up your observability? <a href="https://docs.cycleops.dev/docs/getting-started" target="_blank" rel="noopener noreferrer">Get started</a> with CycleOps today.</p>
<p>Have feedback? Join the conversation on <strong><a href="https://oc.app/community/tw3lb-zqaaa-aaaar-ar3aa-cai/?ref=xeivw-sqaaa-aaaaf-adr7a-cai" target="_blank" rel="noopener noreferrer">OpenChat</a></strong> or tag us on <strong><a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">X</a></strong>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Canister Creation Made Easy]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-creation</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-creation</guid>
            <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're releasing the ability to create new canister smart contracts in seconds, and to manage them directly from your CycleOps dashboard.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-creation"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/canister-creation-internal-9af6ba30abe3d777dcf0353f1d18a3e2.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Today we're releasing the ability to create new canister smart contracts in seconds, and to manage them directly from your CycleOps dashboard.</p>
<p>No terminal. No <code>dfx canister create ...&lt;what args next?&gt;</code>. Just a few clicks.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-shipped">What we shipped<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-creation#what-we-shipped" class="hash-link" aria-label="Direct link to What we shipped" title="Direct link to What we shipped">​</a></h2>
<p>CycleOps now lets you create and manage Internet Computer canisters without ever leaving your browser. Add a canister and click “Create New” to:</p>
<ul>
<li>Create a canister on any subnet—including low‑latency, high‑storage, or fiduciary subnets.</li>
<li>Pre‑load it with the exact number of cycles you choose.</li>
<li>Add one or more controllers (your dfx principal, teammates, or service canisters).</li>
<li>Manage lifecycle actions: start, stop, and delete.</li>
<li>Tweak settings on the fly: controllers, freezing threshold, reserved cycles.</li>
<li>Snapshot, restore, and stream live logs—straight from the UI.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-we-built-it">Why we built it<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-creation#why-we-built-it" class="hash-link" aria-label="Direct link to Why we built it" title="Direct link to Why we built it">​</a></h2>
<p>Creating canisters has typically meant juggling <code>dfx</code>, ledger transfers, and guessing which subnet will serve you best. That process costs time and invites mistakes:</p>
<ul>
<li><strong>Speed:</strong> Spin up a production‑ready canister in seconds.</li>
<li><strong>Safety:</strong> Clear UI prevents accidental under‑funding or wrong‑subnet deploys.</li>
<li><strong>Scale:</strong> Fleet owners can keep all canisters—old and new—visible and actionable in one place.</li>
</ul>
<p>CycleOps already monitors and tops‑up thousands of canisters; now it can create and manage them, too</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-you-can-use-it">How you can use it<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-creation#how-you-can-use-it" class="hash-link" aria-label="Direct link to How you can use it" title="Direct link to How you can use it">​</a></h2>
<video controls="" width="600"><source src="/create-canister.mp4" type="video/mp4"><p>Your browser does not support the video tag.</p></video>
<ol>
<li>Open <strong>Canisters → New Canister</strong> in your CycleOps dashboard.</li>
<li>Pick the subnet that suits your use case. Need low latency? Choose one of our fast‑lane subnets. Want high node count for fiduciary workloads? That option’s there too.</li>
<li>Enter an initial cycles balance—CycleOps will transfer the cycles and confirm allocation.</li>
<li>Add controllers (paste principal IDs or pick from your org’s members).</li>
<li>Click <strong>Create</strong>. In a few seconds your new canister appears in the dashboard.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="managing-created-canisters">Managing Created Canisters<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-creation#managing-created-canisters" class="hash-link" aria-label="Direct link to Managing Created Canisters" title="Direct link to Managing Created Canisters">​</a></h2>
<p>After creating a canister, you can manage it by clicking on a canister and then navigating to its “Manage” tab. From here, you can:</p>
<ul>
<li>Start/stop the canister as needed.</li>
<li>Adjust settings and controllers anytime.</li>
<li>Snapshots: create a point‑in‑time state backup and roll back with one click.</li>
<li>Watch live logs while you iterate.</li>
</ul>
<video controls="" width="600"><source src="/live-logs.mp4" type="video/mp4"><p>Your browser does not support the video tag.</p></video>
<br>
<br>
<p>Ready to try it? <a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">Log in</a> and deploy your first canister today.</p>
<hr>
<p>Have questions or feedback about CycleOps? Jump into our <a href="https://oc.app/community/tw3lb-zqaaa-aaaar-ar3aa-cai/?ref=xeivw-sqaaa-aaaaf-adr7a-cai" target="_blank" rel="noopener noreferrer"><strong>OpenChat</strong></a> or tag us on <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer"><strong>X</strong></a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ICRC Deposits]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits</guid>
            <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we're rolling out ICRC deposits for CycleOps, meaning you can fund topups directly from your SNS with a single Transfer SNS Treasury Funds proposal 🎉]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/icrc-internal-d42cb446532a49b0fb78ddcd09ffed5d.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Today, we're rolling out ICRC deposits for CycleOps, meaning you can fund topups directly from your SNS with a single Transfer SNS Treasury Funds proposal 🎉</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-we-built-it">Why we built it<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits#why-we-built-it" class="hash-link" aria-label="Direct link to Why we built it" title="Direct link to Why we built it">​</a></h2>
<p>Some newer Internet Computer apps don't support the old "account ID" format for transfering ICP, prefering instead to use addresses in the newer ICRC format. Until now CycleOps payments only used the account ID format, which was a pain when using backwards incompatible APIs for ICP transfers (including the default SNS treasury management proposals).</p>
<p>CycleOps now provides your payment address in either format, so SNS's can fund more easily fund their CycleOps accounts directly from their treasury.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-i-find-my-cycleops-icrc-account">How do I find my CycleOps ICRC account?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits#how-do-i-find-my-cycleops-icrc-account" class="hash-link" aria-label="Direct link to How do I find my CycleOps ICRC account?" title="Direct link to How do I find my CycleOps ICRC account?">​</a></h2>
<ol>
<li>Navigate to the Billing -&gt; Payment tab</li>
<li>Under "ICP Top-Up Account", click on Deposit</li>
<li>Select "ICRC Format", and copy your ICRC account</li>
</ol>
<p><img decoding="async" loading="lazy" alt="screenshot-icrc-format" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot_icrc_format-606c868ae702e28410d310d36e918a09.png" width="509" height="189" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-i-send-funds-to-my-cycleops-icrc-account">How do I send funds to my CycleOps ICRC account?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits#how-do-i-send-funds-to-my-cycleops-icrc-account" class="hash-link" aria-label="Direct link to How do I send funds to my CycleOps ICRC account?" title="Direct link to How do I send funds to my CycleOps ICRC account?">​</a></h2>
<ol>
<li><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits#how-do-i-find-my-cycleops-icrc-account">Find and copy your accountl</a></li>
<li>Send funds to this account (Having trouble? See note below)</li>
</ol>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>CycleOps ICRC accounts use subaccounts, which are supported by several applications, including the NNS and applications like SNS toolkit. At this point in time, not all wallets support ICRC accounts that include subaccounts.</p><p>If your wallet does not support sending to ICRC accounts with subaccounts, you can alternatively send funds to your CycleOps account by clicking on "Address Format" and copying the account identifier</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ready-to-set-up-funding-straight-from-your-sns-treasury">Ready to set up funding straight from your SNS treasury?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits#ready-to-set-up-funding-straight-from-your-sns-treasury" class="hash-link" aria-label="Direct link to Ready to set up funding straight from your SNS treasury?" title="Direct link to Ready to set up funding straight from your SNS treasury?">​</a></h2>
<ol>
<li>Head over to your <a href="https://cycleops.dev/app/" target="_blank" rel="noopener noreferrer">CycleOps dashboard</a> to set up ICRC deposits for your SNS canisters.</li>
<li><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits#how-do-i-find-my-cycleops-icrc-account">Locate your your ICRC account</a></li>
<li>If using an application like SNS toolkit, directly copy in the full ICRC account.</li>
</ol>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If creating a treasury proposal manually, you can copy in the principal and subaccount, which are separated by <code>-&lt;crc_checksum&gt;.</code> characters.</p><p>For example, if my:</p><p>ICRC account = <code>v6hxe-jaaaa-aaaap-aawpq-cai-y5q7dpq.4366f227dbc2711a59886f7b4d21c1e47a5b98195fa20ad3b359e06c57b46ab7</code></p><p>then the individual parts are</p><p>principal = <code>v6hxe-jaaaa-aaaap-aawpq-cai</code> <br>
checksum = <code>y5q7dpq</code> <br>
subaccount = <code>4366f227dbc2711a59886f7b4d21c1e47a5b98195fa20ad3b359e06c57b46ab7</code></p></div></div>
<p>Need help getting started? Find us <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">@CycleOps on X</a> and we'll guide you through the process.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="further-reading">Further reading<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icrc-deposits#further-reading" class="hash-link" aria-label="Direct link to Further reading" title="Direct link to Further reading">​</a></h2>
<p>Want to learn more about ICRC account formats? Check out the <a href="https://internetcomputer.org/docs/references/icrc1-standard#non-default-accounts" target="_blank" rel="noopener noreferrer">documentation on the ICRC-1 standard</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reserved Cycle Alerts]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts</guid>
            <pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Did you know that your canister can suddenly stop saving new data if it’s on a busy subnet and you haven’t set it up to reserve enough cycles for new memory allocations?]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/reserved-cycles-internal-2ab7494d745ca0f7af08ee611c028680.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Did you know that your canister can suddenly stop saving new data if it’s on a busy subnet and you haven’t set it up to reserve enough cycles for new memory allocations?</p>
<p>CycleOps now has monitoring and alerting features to help you stay on top of the important but lesser-known "reserved cycles" canister configuration. Here's everything you need to know about reserved cycles, and how you can set up alerts for them in just a few minutes!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-reserved-cycles">What are reserved cycles?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts#what-are-reserved-cycles" class="hash-link" aria-label="Direct link to What are reserved cycles?" title="Direct link to What are reserved cycles?">​</a></h2>
<p>Released in late 2023, the reserved cycles mechanism was designed to prevent a few canisters from easily consuming all the storage on a subnet. When a subnet is nearing capacity, canisters on that subnet must begin paying in advance for any additional storage and do so by automatically transferring some of their cycles into a dedicated “reserved cycles” pool.</p>
<p>Each canister can be configured to set a maximum size for its reserved cycles pool, which is known as a canister's <code>reserved_cycles_limit</code> configuration. All canisters have a reserved cycles limit of 5 trillion cycles (TC) by default.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-happens-if-i-run-out-of-reserved-cycles">What happens if I run out of reserved cycles?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts#what-happens-if-i-run-out-of-reserved-cycles" class="hash-link" aria-label="Direct link to What happens if I run out of reserved cycles?" title="Direct link to What happens if I run out of reserved cycles?">​</a></h2>
<p>A canister which hits its reserved cycles limit will no longer be able to commit new state. This means that write endpoints will begin to fail, which can cause all sorts of production errors. You can see the types of execution errors that would occur in these instances in the official documentation:</p>
<ul>
<li><a href="https://internetcomputer.org/docs/references/execution-errors#reserved-cycles-limit-exceeded-in-memory-grow" target="_blank" rel="noopener noreferrer">"Reserved cycles limit exceeded in memory grow"</a></li>
<li><a href="https://internetcomputer.org/docs/references/execution-errors#reserved-cycles-limit-exceeded-in-memory-allocation" target="_blank" rel="noopener noreferrer">"Reserved cycles limit exceeded in memory allocation"</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-reserved-cycles-monitoring-and-alerting">Introducing reserved cycles monitoring and alerting<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts#introducing-reserved-cycles-monitoring-and-alerting" class="hash-link" aria-label="Direct link to Introducing reserved cycles monitoring and alerting" title="Direct link to Introducing reserved cycles monitoring and alerting">​</a></h2>
<p>Our new features are designed to keep these reserved cycles errors from happening. Reserved cycles monitoring insights are available for all canisters monitored via the <a href="https://github.com/cycleoperators/balanceCheckerVerification/" target="_blank" rel="noopener noreferrer">CycleOps blackhole version &gt;= V2</a>, the SNS, or the NNS and allow you to easily see if any of your canisters are approaching their limit.</p>
<p>Check out the <a href="https://docs-egk6u2ynu-cycleops.vercel.app/docs/alerting/reserved-cycles-alerting">Reserved Cycles Alerting documentation</a> to configure reserved cycle alerts for your canisters.</p>
<p>By enabling these alerts, CycleOps will make sure that you receive ample notification before this type of production error hits your canisters. Don't wait for subnet load to break your canisters, set up your alerts now! It will only take a few minutes.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="further-reading">Further Reading<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts#further-reading" class="hash-link" aria-label="Direct link to Further Reading" title="Direct link to Further Reading">​</a></h2>
<p><a href="https://forum.dfinity.org/t/increasing-subnet-storage-capacity-and-introducing-resource-reservation-mechanism/23447" target="_blank" rel="noopener noreferrer">This original forum post</a> remains the best place for documentation on this feature if you want to dive deeper into the details. Have questions about reserved cycles? Ask a question on this thread, or ping us on X!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="connect-with-us">Connect with us<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/reserved-cycle-alerts#connect-with-us" class="hash-link" aria-label="Direct link to Connect with us" title="Direct link to Connect with us">​</a></h2>
<p>Find us <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">@CycleOps on X</a> and let us know what metrics and alerts you'd like to see us build next!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Batch Actions]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/batch-actions</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/batch-actions</guid>
            <pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we’re releasing even more tools to make it easier to manage your canisters. Batch actions have been live for a few weeks now, but with this release you can now change top-up rules, setup memory alerting, finalize canister setup, or perform a one-time top-up for hundreds of canisters at a time.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/batch-actions"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/batch-actions-internal-2b7e138759e692cf959587aca26ce765.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Today we’re releasing even more tools to make it easier to manage your canisters. Batch actions have been live for a few weeks now, but with this release you can now change top-up rules, setup memory alerting, finalize canister setup, or perform a one-time top-up for hundreds of canisters at a time.</p>
<p>All you need to do is select a bunch of canisters, open the command prompt (⌘ + K) or right click, and choose which action you want to perform. Just one more thing we’re doing to make CycleOps the best possible home for your canisters.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-built">What we built<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/batch-actions#what-we-built" class="hash-link" aria-label="Direct link to What we built" title="Direct link to What we built">​</a></h3>
<p>Did you know that you can right click your canisters to perform quick actions? The new CycleOps UI is built to be as intuitive as possible for canister newbies, and to provide flexible and fast tooling for power users. Today we are expanding these quick action menus with even more commands.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="new-actions">New Actions<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/batch-actions#new-actions" class="hash-link" aria-label="Direct link to New Actions" title="Direct link to New Actions">​</a></h4>
<ul>
<li><strong>Top-up now:</strong> Perform an immediate one-time top-up on a batch of selected canisters.</li>
<li><strong>Set top-up rule:</strong> Configure the automatic top-up rule for a batch of selected canisters.</li>
<li><strong>Add memory alert:</strong> Configure an email alert to be sent when a memory threshold is crossed for any of the selected canisters.</li>
</ul>
<div style="display:flex;justify-content:center"><video width="100%" style="max-width:768px;margin:0 auto" autoplay="" loop="" muted=""><source src="/batch-actions.mp4" type="video/mp4"><p>Your browser does not support the video tag.</p></video></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-home-for-your-canisters">A home for your canisters<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/batch-actions#a-home-for-your-canisters" class="hash-link" aria-label="Direct link to A home for your canisters" title="Direct link to A home for your canisters">​</a></h3>
<p>Our goal is to make <a href="https://cycleops.dev/" target="_blank" rel="noopener noreferrer">cycleops.dev</a> the ideal hub for all your canister needs, from management to monitoring. These new batch actions are just one way we're making it easier for you to maintain and optimize your projects.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="connect-with-us">Connect with us<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/batch-actions#connect-with-us" class="hash-link" aria-label="Direct link to Connect with us" title="Direct link to Connect with us">​</a></h3>
<p>Find us <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">@CycleOps on X</a> and let us know how these new tools are helping you streamline your operations!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Enhancing Canister Monitoring with Detailed Memory Metrics]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/ic-memory-metrics</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/ic-memory-metrics</guid>
            <pubDate>Tue, 04 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're announcing a core protocol update that will provide all canisters with more detailed memory metrics. This update equips developers with a clearer understanding of how their canisters utilize memory, allowing for better debugging, resource allocation, and monitoring.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/ic-memory-metrics"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/protocol-metrics-internal-5e3e673a7b0f18775f877aae4c864586.png" width="2408" height="1350" class="img_ev3q"></a></p>
<p>Today we're announcing a core protocol update that will provide all canisters with more detailed memory metrics. This update equips developers with a clearer understanding of how their canisters utilize memory, allowing for better debugging, resource allocation, and monitoring.</p>
<p>This is our first contribution to the core protocol as a team, making CycleOps one of the first teams to contribute to the protocol outside of Dfinity, and aligns with our mission to help build a world class developer experience on ICP.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new">What's New?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/ic-memory-metrics#whats-new" class="hash-link" aria-label="Direct link to What's New?" title="Direct link to What's New?">​</a></h3>
<p>We've introduced new memory usage fields in CanisterStatus, giving developers a more granular view of memory consumption. These fields include:</p>
<ul>
<li><code>wasm_memory_size</code> - Tracks memory used by the WebAssembly module.</li>
<li><code>stable_memory_size</code> - Captures memory stored persistently across upgrades.</li>
<li><code>global_memory_size</code> - Monitors memory allocated for global variables.</li>
<li><code>wasm_binary_size</code> - Shows the size of the deployed WebAssembly binary.</li>
<li><code>custom_sections_size</code> - Reports the size of custom sections in the Wasm binary.</li>
<li><code>canister_history_size</code> - Tracks memory used by the canister's historical data.</li>
<li><code>wasm_chunk_store_size</code> - Measures storage used by Wasm chunking mechanisms.</li>
<li><code>snapshots_size</code> - Monitors memory usage by stored snapshots.</li>
</ul>
<p>Each of these metrics provides deeper insight into memory distribution, helping teams optimize their canister deployments.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-does-this-matter">Why Does This Matter?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/ic-memory-metrics#why-does-this-matter" class="hash-link" aria-label="Direct link to Why Does This Matter?" title="Direct link to Why Does This Matter?">​</a></h3>
<p>Gain a new level of transparency into canister memory usage.</p>
<p>Understanding canister memory usage is crucial for:</p>
<p>✅ <strong>Better Debugging</strong> - Identify memory-intensive operations and optimize them. <br>
<!-- -->✅ <strong>Improved Resource Management</strong> - Allocate cycles more efficiently based on memory consumption. <br>
<!-- -->✅ <strong>Enhanced Monitoring</strong> - Provide more granular insights into canister behavior.</p>
<p>For teams using our monitoring solutions, these updates complement our existing cycle tracking and performance analytics, making it easier than ever to track and optimize memory usage.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-collaborative-effort">A Collaborative Effort<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/ic-memory-metrics#a-collaborative-effort" class="hash-link" aria-label="Direct link to A Collaborative Effort" title="Direct link to A Collaborative Effort">​</a></h3>
<p>This improvement was the result of a fantastic collaboration with the teams at Dfinity, and we're grateful for the opportunity to contribute to the IC ecosystem. Open-source progress thrives on shared efforts, and we're excited to continue pushing the platform forward.</p>
<p>Got thoughts or feedback? We'd love to hear how these new metrics help you optimize your canisters! 🚀 Connect with us and share your experience <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">@CycleOps on X</a></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/ic-memory-metrics#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://github.com/dfinity/portal/pull/5240" target="_blank" rel="noopener noreferrer">Interface Spec PR</a></li>
<li><a href="https://github.com/dfinity/ic/commit/a944a8b331f1562508a5dde68f6eafcfbb54fe44" target="_blank" rel="noopener noreferrer">Commit <code>a944a8b</code></a></li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[icptopup-ts release]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts</guid>
            <pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we're releasing icptopup-ts, a TypeScript package that makes it easy to programmatically 👨‍💻 facilitate large amounts of decentralized compute, sending cycles to up to 100 canisters at at time.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/icptopup-ts-internal-0a3d7da7697c817afd004593737a6f6e.png" width="2400" height="1350" class="img_ev3q"></a></p>
<p>Today we're releasing <a href="https://github.com/CycleOperators/icptopup-ts" target="_blank" rel="noopener noreferrer">icptopup-ts</a>, a TypeScript package that makes it easy to programmatically 👨‍💻 facilitate large amounts of decentralized compute, sending cycles to up to 100 canisters at at time.</p>
<p>With <code>npm install icptopup-ts</code>, you can integrate atomic, ICRC compatible cycle topups into your application in just a few minutes!</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-can-i-use-icptopup-ts">How can I use icptopup-ts?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts#how-can-i-use-icptopup-ts" class="hash-link" aria-label="Direct link to How can I use icptopup-ts?" title="Direct link to How can I use icptopup-ts?">​</a></h3>
<p>👉 To get started, head to the icptopup-ts <a href="https://github.com/CycleOperators/icptopup-ts" target="_blank" rel="noopener noreferrer">installation instructions</a> ✍️</p>
<p>The package comes with both synchronous and <em>asynchronous</em> primitives for sending cycles depending on your desired UX, and <strong>slots in easily to both Frontend and NodeJS contexts</strong> 🎉</p>
<p>Over the past few weeks, developers have already used icptopup-ts to mint and send over 30,000T cycles across more than 21,000 individual canister topup events.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-did-we-build-icptopup-ts">Why did we build icptopup-ts?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts#why-did-we-build-icptopup-ts" class="hash-link" aria-label="Direct link to Why did we build icptopup-ts?" title="Direct link to Why did we build icptopup-ts?">​</a></h3>
<p>Before icptopup-ts, converting ICP to cycles had the following issues:</p>
<ol>
<li>
<p>Minting cycles from ICP is not atomic and requires both an ICP transfer request, followed by a request to burn that ICP in order to mint cycles. Therefore, a topup attempted by a frontend integrated with the CMC could leave a user initiated topup in a half-finished, or inconsistent state, such as having sent funds but not received a topup if something goes wrong in the middle of this process.</p>
</li>
<li>
<p>The Cycles Minting Canister (CMC) was not ICRC compatible. By not supporting ICRC transfers, funds held in ICRC accounts required two transfers (one to a non-ICRC account, and then another to the CMC) in order to facilitate an ICRC topup, creating non-atomic asynchronous complexities, and introducing additional potential points of failure to a topup.</p>
</li>
<li>
<p>The CMC does not have a batch cycles minting API, meaning that the developer needs to handle all complexity associated with batching cycles, incurring additional, unnecessary fees for each individual cycles minting transaction.</p>
</li>
</ol>
<p>icptopup-ts <strong>solves these issues</strong> by providing a simple, atomic, ICRC compatible API for topping up multiple canisters in parallel.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="using-icrc-2-approvals-to-simplify-the-dx-">Using ICRC-2 Approvals to simplify the DX 💪<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts#using-icrc-2-approvals-to-simplify-the-dx-" class="hash-link" aria-label="Direct link to Using ICRC-2 Approvals to simplify the DX 💪" title="Direct link to Using ICRC-2 Approvals to simplify the DX 💪">​</a></h3>
<p>The package leverages <a href="https://github.com/dfinity/ICRC-1/tree/main/standards/ICRC-2#icrc2_approve" target="_blank" rel="noopener noreferrer">ICRC-2 approvals</a>, allowing the icptopup API to handle both ICP transfer and cycles topups, as well as handling any potential intermediate error states that could occur. This results in a simplified, decoupled two step experience:</p>
<ol>
<li>
<p>First, the developer <a href="https://github.com/CycleOperators/icptopup-ts?tab=readme-ov-file#2-approve-icptopup-to-mint-cycles-from-icp-on-your-behalf" target="_blank" rel="noopener noreferrer">approves icptopup-ts to mint cycles</a>. This step is a simple approval for funds to be transferred, and does not transfer any ICP.</p>
</li>
<li>
<p>Then, the developer makes a single API call to <a href="https://github.com/CycleOperators/icptopup-ts?tab=readme-ov-file#4-call-icptopups-synchronous-batchtopupsync-api-or-its-asynchronous-topup-api" target="_blank" rel="noopener noreferrer">execute the multi-canister topup</a>. This single API call executes both the ICRC-2 ICP transfer and well as the cycles minting action.</p>
</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-it-work">How does it work?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?">​</a></h3>
<p>Under the hood, icptopup-ts is built on top of the <a href="https://forum.dfinity.org/t/icptopup-com-the-easiest-way-to-top-up-canisters-with-cycles/36434" target="_blank" rel="noopener noreferrer">ICPTopup Service</a>, integrating with fixed APIs on the backend ICPTopup canister. The ICPTopup canister provides unified, atomic topup APIs that handling ICRC ICP transfer, cycle minting, and parallel batch cycles distribution to canisters.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/icptopup-ts#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?">​</a></h3>
<p>We're looking forward to seeing what you build with icptopup-ts! If you have any questions, requests, or feedback, <a href="https://github.com/CycleOperators/icptopup-ts/issues/new" target="_blank" rel="noopener noreferrer">file an issue</a> or reach out to us <a href="https://x.com/CycleOps" target="_blank" rel="noopener noreferrer">@CycleOps on X</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Canister Fleets Release]]></title>
            <link>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-fleets</link>
            <guid>https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-fleets</guid>
            <pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Starting today it's easier than ever to manage a large fleet of canister smart contracts on ICP. We're releasing a new UI for cycleops.dev that can handle hundreds (or even thousands) of canisters, and we've raised our per account canister monitoring limit from 30 to 1,000. Already, teams have integrated fleets of up to 800 canisters for monitoring, alerting, and automated top-ups.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-fleets"><img decoding="async" loading="lazy" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/canister-fleets-internal-73ef6508def14d9b465cf9895914dd3d.png" width="2912" height="1632" class="img_ev3q"></a></p>
<p>Starting today it's easier than ever to manage a large fleet of canister smart contracts on ICP. We're releasing a new UI for <a href="http://cycleops.dev/" target="_blank" rel="noopener noreferrer">cycleops.dev</a> that can handle hundreds (or even thousands) of canisters, and we've raised our per account canister monitoring limit from 30 to 1,000. Already, teams have integrated fleets of up to 800 canisters for monitoring, alerting, and automated top-ups.</p>
<p>Our mission at CycleOps is to bring ICP's decentralized compute to market by providing a world class developer experience, and managed solutions for the biggest pain points of builders large and small that want to build on the future of the decentralized web. Making it easy to control large fleets of canisters is a big step in that vision, so let's take a closer look.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="adding-your-fleet">Adding Your Fleet<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-fleets#adding-your-fleet" class="hash-link" aria-label="Direct link to Adding Your Fleet" title="Direct link to Adding Your Fleet">​</a></h3>
<p>So you've got a fleet of canisters. How can you connect to CycleOps to get monitoring, alerting, and automated top-ups? I have good news for you: it will only take 5 or 10 minutes, plus a few minutes of running an automated script.</p>
<p>Our CSV upload feature has you covered. All you need to do is create a spreadsheet that lists all your canisters and how you want them to be configured. Don't worry about strictly formatting it, the upload feature will map it into the expected format and allow you to proofread and fix the mapping if necessary. <a href="https://docs-egk6u2ynu-cycleops.vercel.app/docs/csv-upload">Read the docs</a> for more detail about what columns you can use to customize your CycleOps configuration when adding the CSV upload feature.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="monitoring-your-fleet">Monitoring Your Fleet<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-fleets#monitoring-your-fleet" class="hash-link" aria-label="Direct link to Monitoring Your Fleet" title="Direct link to Monitoring Your Fleet">​</a></h3>
<p>So you've successfully added your fleet, what can you do now? After adding your canisters, you'll have be able to see basic information. CycleOps monitors canisters on a six hour interval, so within a day you'll start to see valuable time series data accumulate for your canisters.</p>
<p>For each canister, CycleOps provides a deep dive view that includes time series metric charts from query calls to your canister, to cycles balance, cycles burn, amount spent on top-ups, and memory usage. You'll also see metrics like current canister health &amp; controllers, as well as estimated time until freeze, next estimated topup, etc.</p>
<p><img decoding="async" loading="lazy" alt="screenshot-canister-monitoring.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-canister-monitoring-acfad0dd2cdabe4b7e003d4388b8e0ec.png" width="1512" height="828" class="img_ev3q"></p>
<p>Your dashboard displays aggregate metrics for all of your canisters, so you can easily see if all your canisters are healthy, how many cycles they're burning and how much you're spending on top-ups.</p>
<p><img decoding="async" loading="lazy" alt="screenshot-canister-list.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-canister-list-6fe86864b4678fd8a4e22e507b4a68e1.png" width="1512" height="828" class="img_ev3q"></p>
<p>You can personalize the display of data that's displayed for each of your canisters on the dashboard. By default your dashboard will display burn rate, cycles balance and memory size, estimated freeze date, and more. Perhaps you want to show an estimated next top up for each canister, or the subnet that the canister is deployed on. By clicking on "Display" and choosing a configuration, you're in control.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bulk-canister-actions">Bulk Canister Actions<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-fleets#bulk-canister-actions" class="hash-link" aria-label="Direct link to Bulk Canister Actions" title="Direct link to Bulk Canister Actions">​</a></h3>
<p>Working with large fleets of canisters means being able to manipulate them in large batches, and the new CycleOps dashboard UI makes that very easy. You can right click on any canister to edit it, or select a group of canisters to perform an action on the entire set.</p>
<p><img decoding="async" loading="lazy" alt="screenshot-canister-selection.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/screenshot-canister-selection-d0275c25f2478896ed7bd12531838696.png" width="1090" height="307" class="img_ev3q"></p>
<p>As of this release we support batch actions for editing tags and projects. More actions are planned and in development for changing top-up rules, setting memory alert thresholds, sending one-time top-ups, and many other things that you can do on a single canister in CycleOps.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="keyboard-navigation">Keyboard Navigation<a href="https://docs-egk6u2ynu-cycleops.vercel.app/changelog/canister-fleets#keyboard-navigation" class="hash-link" aria-label="Direct link to Keyboard Navigation" title="Direct link to Keyboard Navigation">​</a></h3>
<p>The dashboard also supports native-like keybinds for selecting canisters, and action specific keybinds.</p>
<p><img decoding="async" loading="lazy" alt="canister-list-keybinds.png" src="https://docs-egk6u2ynu-cycleops.vercel.app/assets/images/canister-list-keybinds-e2ac741c5961ed2fa5e48af27acee076.png" width="1000" height="1000" class="img_ev3q"></p>]]></content:encoded>
        </item>
    </channel>
</rss>