<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Magnus Opera – Blog</title><link>https://magnusopera.io/blog/</link><description>Recent content in Blog on Magnus Opera</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>contact@magnusopera.io (Magnus Opera)</managingEditor><webMaster>contact@magnusopera.io (Magnus Opera)</webMaster><atom:link href="https://magnusopera.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Release Candidate 1</title><link>https://magnusopera.io/blog/rc1/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><author>contact@magnusopera.io (Magnus Opera)</author><guid>https://magnusopera.io/blog/rc1/</guid><description>
&lt;h1&gt;Terrabuild RC1: Security, Artifacts, and a New Execution Core&lt;/h1&gt;&lt;p&gt;The last Terrabuild beta was released on &lt;strong&gt;September 30th, 2024&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Since then, a lot has changed.&lt;/p&gt;
&lt;p&gt;What started as incremental improvements eventually turned into a deeper evolution of Terrabuild’s architecture: stronger security guarantees, a redesigned execution model, a more powerful scripting system, and a new embedded console experience.&lt;/p&gt;
&lt;p&gt;Over the past months, Terrabuild has evolved far beyond incremental fixes. Large parts of the execution engine, scripting system, and artifact model were redesigned to improve security, performance, and extensibility.&lt;/p&gt;
&lt;p&gt;Today I’m happy to introduce &lt;strong&gt;Terrabuild RC1&lt;/strong&gt; (release &lt;code&gt;0.189.22&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This release focuses on five areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artifacts and caching&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch execution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Graph execution engine&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scripting and language evolution&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;Security First&lt;/h1&gt;&lt;p&gt;One of the most important changes in this cycle is a stronger security model.&lt;/p&gt;
&lt;p&gt;Terrabuild now supports &lt;strong&gt;client-side encryption of artifacts before they are stored on the server&lt;/strong&gt;. This means that build artifacts can be uploaded to remote storage &lt;strong&gt;without the server ever being able to read them&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The encryption key never leaves the client environment.&lt;/p&gt;
&lt;p&gt;This approach significantly reduces the trust surface: storage infrastructure can remain simple while sensitive artifacts stay protected.&lt;/p&gt;
&lt;p&gt;Other security improvements include:&lt;/p&gt;
&lt;h3&gt;Scripting hardening&lt;span class="hx-absolute -hx-mt-20" id="scripting-hardening"&gt;&lt;/span&gt;
&lt;a href="#scripting-hardening" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Workspaces can define &lt;strong&gt;deny glob patterns&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Combined with FScript (see below), extension execution is now safer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Operational safety improvements&lt;span class="hx-absolute -hx-mt-20" id="operational-safety-improvements"&gt;&lt;/span&gt;
&lt;a href="#operational-safety-improvements" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Stronger error propagation&lt;/li&gt;
&lt;li&gt;Automatic tracking and termination of spawned processes&lt;/li&gt;
&lt;li&gt;Stricter failure handling during graph execution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These changes aim to make Terrabuild safer both in &lt;strong&gt;local development environments and CI systems&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;From Cache to Artifacts&lt;/h1&gt;&lt;p&gt;Terrabuild originally relied on a classic &lt;em&gt;build cache&lt;/em&gt; model.&lt;/p&gt;
&lt;p&gt;During this cycle, that model evolved toward something more explicit: &lt;strong&gt;artifacts&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Artifacts represent &lt;strong&gt;materialized build outputs with clear ownership and lifecycle&lt;/strong&gt;. They can exist locally or remotely, and Terrabuild now manages them at multiple levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Target-level artifacts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extension-level artifacts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workspace artifact caches&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The system also introduces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Managed artifacts&lt;/li&gt;
&lt;li&gt;External cache policies&lt;/li&gt;
&lt;li&gt;Better remote cache upload/download behavior&lt;/li&gt;
&lt;li&gt;Improved restore vs rebuild correctness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This shift clarifies an important distinction: Terrabuild does not simply cache results — it &lt;strong&gt;manages build artifacts as first-class entities&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;Batching Revisited&lt;/h1&gt;&lt;p&gt;Batching returned in this cycle, but it did not come back unchanged.&lt;/p&gt;
&lt;p&gt;The implementation was &lt;strong&gt;reintroduced and then completely redesigned&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Terrabuild now supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proper &lt;strong&gt;batch computation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Atomic &lt;strong&gt;batch progress tracking&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Consistent batch logs and reporting&lt;/li&gt;
&lt;li&gt;Improved CI and local execution parity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Batching is also now &lt;strong&gt;dynamic for scripting commands&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Instead of declaring batching capabilities statically, Terrabuild can infer them &lt;strong&gt;from command results&lt;/strong&gt;, allowing scripts to participate naturally in batched builds.&lt;/p&gt;
&lt;p&gt;This significantly improves performance when building large dependency graphs.&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;A New Graph Execution Core&lt;/h1&gt;&lt;p&gt;Perhaps the biggest internal change is the &lt;strong&gt;execution engine rewrite&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Terrabuild’s graph builder and scheduler were significantly refactored around a &lt;strong&gt;continuation-based execution model&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This enabled several improvements.&lt;/p&gt;
&lt;h2&gt;Smarter dependency evaluation&lt;span class="hx-absolute -hx-mt-20" id="smarter-dependency-evaluation"&gt;&lt;/span&gt;
&lt;a href="#smarter-dependency-evaluation" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The engine now performs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cascade and cluster computation&lt;/li&gt;
&lt;li&gt;Required-node fast paths&lt;/li&gt;
&lt;li&gt;Skipping of non-required nodes&lt;/li&gt;
&lt;li&gt;Delegated restore logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This reduces unnecessary work in large graphs.&lt;/p&gt;
&lt;h2&gt;Better scheduling&lt;span class="hx-absolute -hx-mt-20" id="better-scheduling"&gt;&lt;/span&gt;
&lt;a href="#better-scheduling" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The runtime now supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prioritized scheduling&lt;/li&gt;
&lt;li&gt;Background continuations for IO&lt;/li&gt;
&lt;li&gt;Immediate scheduling stop on first error&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Stronger concurrency guarantees&lt;span class="hx-absolute -hx-mt-20" id="stronger-concurrency-guarantees"&gt;&lt;/span&gt;
&lt;a href="#stronger-concurrency-guarantees" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Several reliability improvements were made to the hub/pubsub system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lock improvements&lt;/li&gt;
&lt;li&gt;Deadlock fixes&lt;/li&gt;
&lt;li&gt;Safer node status handling&lt;/li&gt;
&lt;li&gt;Stricter failure propagation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, these changes make the engine &lt;strong&gt;more predictable under load&lt;/strong&gt; while also improving performance on complex builds.&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;The Web Console&lt;/h1&gt;&lt;p&gt;Terrabuild now includes an &lt;strong&gt;embedded web console directly inside the executable&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;graph visualization&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;terminal interface&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Build parameters and metadata panels&lt;/li&gt;
&lt;li&gt;Cache inspection tools&lt;/li&gt;
&lt;li&gt;Notifications and live progress updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The console aims to provide better &lt;strong&gt;runtime visibility&lt;/strong&gt; without requiring external tooling.&lt;/p&gt;
&lt;p&gt;Other improvements include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Human-readable durations&lt;/li&gt;
&lt;li&gt;Clearer progress rendering&lt;/li&gt;
&lt;li&gt;Richer batch output&lt;/li&gt;
&lt;li&gt;Interactive graph nodes and edges&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;The Rise of FScript&lt;/h1&gt;&lt;p&gt;Another major change is the migration toward &lt;strong&gt;FScript-based scripting and extensions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Legacy extension projects have progressively been replaced by scripts, which allows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faster iteration&lt;/li&gt;
&lt;li&gt;Easier extension development&lt;/li&gt;
&lt;li&gt;Safer execution boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FScript is an interpreted language, allowing safe sandboxed execution of extensions.&lt;/p&gt;
&lt;p&gt;Scripts are of course available if you want to implement your own extensions for custom behavior or integrations.&lt;/p&gt;
&lt;p&gt;More information about FScript can be found at: &lt;a href="https://magnusopera.github.io/FScript/" target="_blank" rel="noopener"&gt;https://magnusopera.github.io/FScript/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;Toward Release&lt;/h1&gt;&lt;p&gt;This release candidate represents more than a set of improvements.&lt;/p&gt;
&lt;p&gt;It reflects a gradual shift in Terrabuild’s philosophy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Artifacts instead of cache&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scripts instead of extension projects&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuation-based execution instead of simple task scheduling&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client-side security instead of server trust&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Terrabuild remains focused on the same goal:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Making build systems powerful without making them complex to maintain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you have been using Terrabuild since the beta, this release should feel &lt;strong&gt;more robust, safer, and significantly more capable&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;RC1 marks the point where these architectural changes stabilize and move toward a final release.&lt;/p&gt;</description></item><item><title>Beta 2</title><link>https://magnusopera.io/blog/beta2/</link><pubDate>Mon, 30 Sep 2024 00:00:00 +0000</pubDate><author>contact@magnusopera.io (Magnus Opera)</author><guid>https://magnusopera.io/blog/beta2/</guid><description>
&lt;p&gt;&lt;strong&gt;Terrabuild&lt;/strong&gt; is getting a beta2 ! Here are new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extensions in containers&lt;/li&gt;
&lt;li&gt;Notarization for macOS&lt;/li&gt;
&lt;li&gt;links&lt;/li&gt;
&lt;li&gt;Storage tracking&lt;/li&gt;
&lt;li&gt;New property&lt;/li&gt;
&lt;li&gt;Optimizer removal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Latest release are available on &lt;a href="https://github.com/MagnusOpera/Terrabuild/releases" target="_blank" rel="noopener"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Extensions in containers&lt;span class="hx-absolute -hx-mt-20" id="extensions-in-containers"&gt;&lt;/span&gt;
&lt;a href="#extensions-in-containers" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Extensions can run in a container, this is great because this means zero deployments on dev environment but Terrabuild and Docker. Unfortunately, they used to be unreliable: build systems are not designed to be isolated this way. Investigations have led to shared memory usage. By enabling &lt;code&gt;--pid=host&lt;/code&gt; and &lt;code&gt;--ipc=host&lt;/code&gt; on containers, builds are now much more reliable now. Still not perfect but it&amp;rsquo;s getting close!&lt;/p&gt;
&lt;h2&gt;Notarization for macOS&lt;span class="hx-absolute -hx-mt-20" id="notarization-for-macos"&gt;&lt;/span&gt;
&lt;a href="#notarization-for-macos" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Terrabuild&lt;/code&gt; is now notarized for macOS and compiled to universal binary. Still, if you want to create your own extension (using F# fsx), you still need to install .net SDK alongside.&lt;/p&gt;
&lt;p&gt;Releases starting from 0.88 are notarized and universal binaries for macOS.&lt;/p&gt;
&lt;h2&gt;Links support&lt;span class="hx-absolute -hx-mt-20" id="links-support"&gt;&lt;/span&gt;
&lt;a href="#links-support" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Links are a new addition to projects. The goal is to set a dependency between two projects but build order is not enforced. This is usefull when you know your CI is acting as a build barrier and you do not want to enforce a build order. A link allows you to use &lt;code&gt;version&lt;/code&gt; function for example but without requiring target outputs to be downloaded.&lt;/p&gt;
&lt;h2&gt;Storage tracking&lt;span class="hx-absolute -hx-mt-20" id="storage-tracking"&gt;&lt;/span&gt;
&lt;a href="#storage-tracking" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Storage consumption is now tracked and enforced. NOTE: API incompatibilities has been introduced so please, upgrade to 0.90 before. For evaluation, max storage is 1 Gb and is enforced for free accounts. Contact us if you need more for evaluation.&lt;/p&gt;
&lt;h1&gt;New property&lt;/h1&gt;&lt;p&gt;&lt;code&gt;terrabuild_ci&lt;/code&gt; nows tells if build is running is CI. Note a of now only GitHub is supported.&lt;/p&gt;
&lt;h2&gt;Optimizer removal&lt;span class="hx-absolute -hx-mt-20" id="optimizer-removal"&gt;&lt;/span&gt;
&lt;a href="#optimizer-removal" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Sad news but the optimizer had to go away. Feature was hard to maintain and had too many ramifications across the board. The implication is build can be slower for .net projects (that was the only kind of project supporting optimizer). Not a big deal as only part of monorepo is built normally.&lt;/p&gt;
&lt;p&gt;Removal of this feature will allow us to implement new ones. Stay tuned !&lt;/p&gt;</description></item><item><title>Beta !</title><link>https://magnusopera.io/blog/beta/</link><pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><author>contact@magnusopera.io (Magnus Opera)</author><guid>https://magnusopera.io/blog/beta/</guid><description>
&lt;p&gt;Time for beta release! &lt;strong&gt;Terrabuild&lt;/strong&gt; has gone several changes, and for good 🎉&lt;/p&gt;
&lt;p&gt;Past months have been used to dogfood Terrabuild with Magnus Opera&amp;rsquo;s infrastructure (.net backend, React front-end, Kubernetes and other things deployed via Terraform). Dogfooding has helped a lot to squash several embarassing bugs, implement several really useful features and improve performance.&lt;/p&gt;
&lt;h2&gt;Stability&lt;span class="hx-absolute -hx-mt-20" id="stability"&gt;&lt;/span&gt;
&lt;a href="#stability" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Terrabuild reached a really good level of stability:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parser has been enhanced to report better errors and grammar has reached the required level of maturity&lt;/li&gt;
&lt;li&gt;Performance of containers has improved a lot: home folder is now shared for same container architecture&lt;/li&gt;
&lt;li&gt;Fix bug on reproducibility of the build (hash computation was incomplete)&lt;/li&gt;
&lt;li&gt;Idempotency for local/remote build has been solved as well (hash was computed on different set of commands)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;New optimizer&lt;span class="hx-absolute -hx-mt-20" id="new-optimizer"&gt;&lt;/span&gt;
&lt;a href="#new-optimizer" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The new optimizer has much more power than previous one: it can now track multiple clusters of the same type on different causalities. Old optimizer was only able to optimize one cluster type for the whole build (for example, a single .net build was supported).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here is a sample workspace&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="mermaid hx-mt-6"&gt;flowchart LR
classDef forced stroke:red,stroke-width:3px
classDef required stroke:orange,stroke-width:3px
classDef selected stroke:black,stroke-width:3px
4552B308ABC99A5E15C4BC807E52FD1BE7BB41798F711F18488044AAF41DCD67([build A])
BD9B2D7DDFFD4DE9A3BA601FD465DADCBF186E513AC316F68A2214B851895403([build B])
502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647([build D])
A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093([build E])
class 4552B308ABC99A5E15C4BC807E52FD1BE7BB41798F711F18488044AAF41DCD67 forced
class BD9B2D7DDFFD4DE9A3BA601FD465DADCBF186E513AC316F68A2214B851895403 forced
502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647 --&gt; 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2
class 502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647 forced
A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093 --&gt; 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2
class A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093 forced
546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2([build C])
4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84([build F])
0F888689FC6FCB936DA67EB38668998BF57500CD23F4B3141151645BCF7157F3([build G])
546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2 --&gt; 4552B308ABC99A5E15C4BC807E52FD1BE7BB41798F711F18488044AAF41DCD67
546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2 --&gt; BD9B2D7DDFFD4DE9A3BA601FD465DADCBF186E513AC316F68A2214B851895403
class 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2 forced
4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84 --&gt; 502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647
4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84 --&gt; A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093
class 4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84 forced
0F888689FC6FCB936DA67EB38668998BF57500CD23F4B3141151645BCF7157F3 --&gt; 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2
class 0F888689FC6FCB936DA67EB38668998BF57500CD23F4B3141151645BCF7157F3 forced&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Terrabuild is now able to optimize this way&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="mermaid hx-mt-6"&gt;flowchart LR
classDef forced stroke:red,stroke-width:3px
classDef required stroke:orange,stroke-width:3px
classDef selected stroke:black,stroke-width:3px
subgraph 6599FE5F147C6FFBA859A08E916C64105B3AE95ECF0FBACFD9AFB14EC55BB544[batch build]
502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647([build D])
A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093([build E])
end
classDef cluster-6599FE5F147C6FFBA859A08E916C64105B3AE95ECF0FBACFD9AFB14EC55BB544 stroke:#832,stroke-width:3px,fill:white,rx:10,ry:10
class 6599FE5F147C6FFBA859A08E916C64105B3AE95ECF0FBACFD9AFB14EC55BB544 cluster-6599FE5F147C6FFBA859A08E916C64105B3AE95ECF0FBACFD9AFB14EC55BB544
502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647 --&gt; 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2
class 502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647 forced
A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093 --&gt; 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2
class A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093 forced
0F888689FC6FCB936DA67EB38668998BF57500CD23F4B3141151645BCF7157F3([build G])
0F888689FC6FCB936DA67EB38668998BF57500CD23F4B3141151645BCF7157F3 --&gt; 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2
class 0F888689FC6FCB936DA67EB38668998BF57500CD23F4B3141151645BCF7157F3 forced
subgraph CD2042D8089B53EF5E02DD6900C27FAF5048364C3D95883B9849DB83FEC65361[batch build]
4552B308ABC99A5E15C4BC807E52FD1BE7BB41798F711F18488044AAF41DCD67([build A])
BD9B2D7DDFFD4DE9A3BA601FD465DADCBF186E513AC316F68A2214B851895403([build B])
end
classDef cluster-CD2042D8089B53EF5E02DD6900C27FAF5048364C3D95883B9849DB83FEC65361 stroke:#65D,stroke-width:3px,fill:white,rx:10,ry:10
class CD2042D8089B53EF5E02DD6900C27FAF5048364C3D95883B9849DB83FEC65361 cluster-CD2042D8089B53EF5E02DD6900C27FAF5048364C3D95883B9849DB83FEC65361
class 4552B308ABC99A5E15C4BC807E52FD1BE7BB41798F711F18488044AAF41DCD67 forced
class BD9B2D7DDFFD4DE9A3BA601FD465DADCBF186E513AC316F68A2214B851895403 forced
546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2([build C])
546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2 --&gt; 4552B308ABC99A5E15C4BC807E52FD1BE7BB41798F711F18488044AAF41DCD67
546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2 --&gt; BD9B2D7DDFFD4DE9A3BA601FD465DADCBF186E513AC316F68A2214B851895403
class 546C2C114D3364163EDA8DB8FF0F3E800CC79ACC0F84973BA17866B5C03F05F2 forced
4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84([build F])
4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84 --&gt; 502D99A08930613A8950A209AB659DBD70BC9CD6766F53FE8C2545028CD07647
4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84 --&gt; A10064A7C5CAD13878FDFBE58C4D7D209D299DBE7FFBC12B6D63F5ABE0693093
class 4D3EF35601A8F0370B32F652B92C4A823C4ABD2BBC01A609278B95B976C13D84 forced&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Real life optimizations applied on Terrabuild itself&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="mermaid hx-mt-6"&gt;flowchart LR
classDef forced stroke:red,stroke-width:3px
classDef required stroke:orange,stroke-width:3px
classDef selected stroke:black,stroke-width:3px
subgraph 5E3C39817550AEDCC02326DA195DE0B1C25EFC83FAF8842732E01CD3D31682BA[batch build]
193BB912F9478BB40DC4DAC7CB9EC33DE04F7DE26CAD23565A900D07BBE8DA74([build Terrabuild.Common.Tests])
909DA059580F0EDCA6DAE2334C64D08C75F6A96057FA06104A1327B2CCFA3F83([build Terrabuild.Common])
9F37838D2ADF858B4CD2A52C377183901582CA3314B43728EACB6689FA690188([build Terrabuild.Configuration.Tests])
47DB938158C5366C2CDC7BBCE8355DB20D53DF36515534E6ACB7B4A57031B4A0([build Terrabuild.Configuration])
0AED0132AC24F24C994C67DD3698DADD5E46F865ABA82430402A88D5F449F678([build Terrabuild.Expressions.Tests])
613DAFF6BC5AB6C79E840CF3AA76A2485A3295CB8B2BD8B6E6E67A464FFC3EBB([build Terrabuild.Expressions])
A58F713A400B91776C9D762B12E2653B8DB47976340A792D6010F77CEF50E1CC([build Terrabuild.Extensibility])
91217077982CBB79F69B7F6CE7374672B2062CFE37583FF17CAE1F0EE7A7DBED([build Terrabuild.Extensions])
ABEDF9B0E1CA557EF935860B83FC1031B2FDEA30FB2027C2F760A43489B092FB([build Terrabuild.PubSub.Tests])
BF4ED535EE4F857F3DEA45A493B6690E74EE8DF9A31208E0A46333833BF1D62E([build Terrabuild.PubSub])
882A0E463A098C4A6FB89C39D5E1F7247B3E85A81505617FC08CE5605EDC6E4F([build Terrabuild.Scripting.Tests])
22266CC1A217703C5F9C97F3AFA3333A50CBF41A8DDAA1A985A6A43CAF8BCF83([build Terrabuild.Scripting])
985B9164950C731321520F9802800D86EE0301153C8DAC268A66168B258745C8([build Terrabuild.Tests])
9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4([build Terrabuild])
end
classDef cluster-5E3C39817550AEDCC02326DA195DE0B1C25EFC83FAF8842732E01CD3D31682BA stroke:#FBC,stroke-width:3px,fill:white,rx:10,ry:10
class 5E3C39817550AEDCC02326DA195DE0B1C25EFC83FAF8842732E01CD3D31682BA cluster-5E3C39817550AEDCC02326DA195DE0B1C25EFC83FAF8842732E01CD3D31682BA
193BB912F9478BB40DC4DAC7CB9EC33DE04F7DE26CAD23565A900D07BBE8DA74 --&gt; 909DA059580F0EDCA6DAE2334C64D08C75F6A96057FA06104A1327B2CCFA3F83
class 193BB912F9478BB40DC4DAC7CB9EC33DE04F7DE26CAD23565A900D07BBE8DA74 required
class 909DA059580F0EDCA6DAE2334C64D08C75F6A96057FA06104A1327B2CCFA3F83 required
9F37838D2ADF858B4CD2A52C377183901582CA3314B43728EACB6689FA690188 --&gt; 47DB938158C5366C2CDC7BBCE8355DB20D53DF36515534E6ACB7B4A57031B4A0
class 9F37838D2ADF858B4CD2A52C377183901582CA3314B43728EACB6689FA690188 required
47DB938158C5366C2CDC7BBCE8355DB20D53DF36515534E6ACB7B4A57031B4A0 --&gt; 613DAFF6BC5AB6C79E840CF3AA76A2485A3295CB8B2BD8B6E6E67A464FFC3EBB
class 47DB938158C5366C2CDC7BBCE8355DB20D53DF36515534E6ACB7B4A57031B4A0 required
0AED0132AC24F24C994C67DD3698DADD5E46F865ABA82430402A88D5F449F678 --&gt; 613DAFF6BC5AB6C79E840CF3AA76A2485A3295CB8B2BD8B6E6E67A464FFC3EBB
class 0AED0132AC24F24C994C67DD3698DADD5E46F865ABA82430402A88D5F449F678 required
613DAFF6BC5AB6C79E840CF3AA76A2485A3295CB8B2BD8B6E6E67A464FFC3EBB --&gt; 909DA059580F0EDCA6DAE2334C64D08C75F6A96057FA06104A1327B2CCFA3F83
class 613DAFF6BC5AB6C79E840CF3AA76A2485A3295CB8B2BD8B6E6E67A464FFC3EBB required
class A58F713A400B91776C9D762B12E2653B8DB47976340A792D6010F77CEF50E1CC required
91217077982CBB79F69B7F6CE7374672B2062CFE37583FF17CAE1F0EE7A7DBED --&gt; 909DA059580F0EDCA6DAE2334C64D08C75F6A96057FA06104A1327B2CCFA3F83
91217077982CBB79F69B7F6CE7374672B2062CFE37583FF17CAE1F0EE7A7DBED --&gt; A58F713A400B91776C9D762B12E2653B8DB47976340A792D6010F77CEF50E1CC
class 91217077982CBB79F69B7F6CE7374672B2062CFE37583FF17CAE1F0EE7A7DBED required
ABEDF9B0E1CA557EF935860B83FC1031B2FDEA30FB2027C2F760A43489B092FB --&gt; BF4ED535EE4F857F3DEA45A493B6690E74EE8DF9A31208E0A46333833BF1D62E
class ABEDF9B0E1CA557EF935860B83FC1031B2FDEA30FB2027C2F760A43489B092FB required
class BF4ED535EE4F857F3DEA45A493B6690E74EE8DF9A31208E0A46333833BF1D62E required
882A0E463A098C4A6FB89C39D5E1F7247B3E85A81505617FC08CE5605EDC6E4F --&gt; A58F713A400B91776C9D762B12E2653B8DB47976340A792D6010F77CEF50E1CC
882A0E463A098C4A6FB89C39D5E1F7247B3E85A81505617FC08CE5605EDC6E4F --&gt; 22266CC1A217703C5F9C97F3AFA3333A50CBF41A8DDAA1A985A6A43CAF8BCF83
class 882A0E463A098C4A6FB89C39D5E1F7247B3E85A81505617FC08CE5605EDC6E4F required
22266CC1A217703C5F9C97F3AFA3333A50CBF41A8DDAA1A985A6A43CAF8BCF83 --&gt; 613DAFF6BC5AB6C79E840CF3AA76A2485A3295CB8B2BD8B6E6E67A464FFC3EBB
class 22266CC1A217703C5F9C97F3AFA3333A50CBF41A8DDAA1A985A6A43CAF8BCF83 required
985B9164950C731321520F9802800D86EE0301153C8DAC268A66168B258745C8 --&gt; 9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4
class 985B9164950C731321520F9802800D86EE0301153C8DAC268A66168B258745C8 required
9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4 --&gt; 909DA059580F0EDCA6DAE2334C64D08C75F6A96057FA06104A1327B2CCFA3F83
9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4 --&gt; 47DB938158C5366C2CDC7BBCE8355DB20D53DF36515534E6ACB7B4A57031B4A0
9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4 --&gt; A58F713A400B91776C9D762B12E2653B8DB47976340A792D6010F77CEF50E1CC
9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4 --&gt; 91217077982CBB79F69B7F6CE7374672B2062CFE37583FF17CAE1F0EE7A7DBED
9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4 --&gt; BF4ED535EE4F857F3DEA45A493B6690E74EE8DF9A31208E0A46333833BF1D62E
9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4 --&gt; 22266CC1A217703C5F9C97F3AFA3333A50CBF41A8DDAA1A985A6A43CAF8BCF83
class 9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4 required
subgraph 8D8E199EEF5C7E12EC77AB68EB1D3A7F7804093506039F6B273482C256A326CF[batch test]
A12312C97DD1A89D723FE05D55B838FD30A88D2B0770465841B5C9ECE3677B5C([test Terrabuild.Common.Tests])
94ED206E2AC00C196F1FCE74673F7A177779C13FEC910851E93E1E39E02E1066([test Terrabuild.Configuration.Tests])
DBB93749459C56830222D7DA400AAD078CB9D1A4C4A752633E2C05887B3EB4F8([test Terrabuild.Expressions.Tests])
4B84CD42552C56D3351E78188089601E383B57E04155DFBE0C9E51E872593AF2([test Terrabuild.PubSub.Tests])
1EB0018B20D23FB8CA4D9824C68C690F1789ABA05F5F2384158026E5CBE809F4([test Terrabuild.Scripting.Tests])
8431C1F7AEB702219D8832EFEC531C5E40FB29FF489B8CF9B4ABFDDED16883C0([test Terrabuild.Tests])
end
classDef cluster-8D8E199EEF5C7E12EC77AB68EB1D3A7F7804093506039F6B273482C256A326CF stroke:#BEA,stroke-width:3px,fill:white,rx:10,ry:10
class 8D8E199EEF5C7E12EC77AB68EB1D3A7F7804093506039F6B273482C256A326CF cluster-8D8E199EEF5C7E12EC77AB68EB1D3A7F7804093506039F6B273482C256A326CF
A12312C97DD1A89D723FE05D55B838FD30A88D2B0770465841B5C9ECE3677B5C --&gt; 193BB912F9478BB40DC4DAC7CB9EC33DE04F7DE26CAD23565A900D07BBE8DA74
class A12312C97DD1A89D723FE05D55B838FD30A88D2B0770465841B5C9ECE3677B5C required
94ED206E2AC00C196F1FCE74673F7A177779C13FEC910851E93E1E39E02E1066 --&gt; 9F37838D2ADF858B4CD2A52C377183901582CA3314B43728EACB6689FA690188
class 94ED206E2AC00C196F1FCE74673F7A177779C13FEC910851E93E1E39E02E1066 required
DBB93749459C56830222D7DA400AAD078CB9D1A4C4A752633E2C05887B3EB4F8 --&gt; 0AED0132AC24F24C994C67DD3698DADD5E46F865ABA82430402A88D5F449F678
class DBB93749459C56830222D7DA400AAD078CB9D1A4C4A752633E2C05887B3EB4F8 required
4B84CD42552C56D3351E78188089601E383B57E04155DFBE0C9E51E872593AF2 --&gt; ABEDF9B0E1CA557EF935860B83FC1031B2FDEA30FB2027C2F760A43489B092FB
class 4B84CD42552C56D3351E78188089601E383B57E04155DFBE0C9E51E872593AF2 required
1EB0018B20D23FB8CA4D9824C68C690F1789ABA05F5F2384158026E5CBE809F4 --&gt; 882A0E463A098C4A6FB89C39D5E1F7247B3E85A81505617FC08CE5605EDC6E4F
class 1EB0018B20D23FB8CA4D9824C68C690F1789ABA05F5F2384158026E5CBE809F4 required
8431C1F7AEB702219D8832EFEC531C5E40FB29FF489B8CF9B4ABFDDED16883C0 --&gt; 985B9164950C731321520F9802800D86EE0301153C8DAC268A66168B258745C8
class 8431C1F7AEB702219D8832EFEC531C5E40FB29FF489B8CF9B4ABFDDED16883C0 required
C6D0432181CDBE8A9D80D575A2B5B79462BEE144BE699D3649198F8D34E49CA1([dist Terrabuild])
C6D0432181CDBE8A9D80D575A2B5B79462BEE144BE699D3649198F8D34E49CA1 --&gt; 9AF519F11A4D9770940E7FEDD536C49944268C40E824F7D2F9327F087CA62CC4
class C6D0432181CDBE8A9D80D575A2B5B79462BEE144BE699D3649198F8D34E49CA1 required&lt;/pre&gt;&lt;h2&gt;Reports&lt;span class="hx-absolute -hx-mt-20" id="reports"&gt;&lt;/span&gt;
&lt;a href="#reports" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Build summary has been introduced on GitHub Actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tasks summary&lt;/li&gt;
&lt;li&gt;Build graph&lt;/li&gt;
&lt;li&gt;Logs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The build summary provides an overview of build performance and status: it&amp;rsquo;s even better than current GitHub build log 😎&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/MagnusOpera/Terrabuild/actions/runs/9741229868#user-content-78612a1a6f5df1a1d2d6aa405011d99a" target="_blank" rel="noopener"&gt;&lt;img src="https://magnusopera.io/images/build-summary.png" alt="Build Summary" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Partial graph invalidation&lt;span class="hx-absolute -hx-mt-20" id="partial-graph-invalidation"&gt;&lt;/span&gt;
&lt;a href="#partial-graph-invalidation" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If a node has children and those are rebuilt appart, it&amp;rsquo;s obvious the node shall be rebuilt (because it is younger than children). That was the case in the same build - but not across builds.&lt;/p&gt;
&lt;p&gt;This is now supported since it&amp;rsquo;s a valid scenario (for example with &lt;code&gt;terraform plan/apply&lt;/code&gt; on several jobs).&lt;/p&gt;
&lt;h2&gt;Extensions&lt;span class="hx-absolute -hx-mt-20" id="extensions"&gt;&lt;/span&gt;
&lt;a href="#extensions" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Rust (Cargo projects) has been added&lt;/li&gt;
&lt;li&gt;Dotnet is able to optimize &lt;code&gt;test&lt;/code&gt; command now&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Overall performance&lt;span class="hx-absolute -hx-mt-20" id="overall-performance"&gt;&lt;/span&gt;
&lt;a href="#overall-performance" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Accessing the global cache to check if a node is used are not was costly before: the whole summary and outputs were downloaded for all nodes 😬 This was inefficient since most of the time only a few nodes changes and only node status is required.&lt;/p&gt;
&lt;p&gt;Terrabuild implements now a better check strategy: it only download summary if the status of a node is uncertain. If the node is not required, outputs won&amp;rsquo;t even be downloaded. In some cases, it won&amp;rsquo;t even bother to check the task if not required at all. This really improves I/O and overall build performance 🎉&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h1&gt;Want to give it a try ?&lt;/h1&gt;&lt;p&gt;Terrabuild really shines with a shared cache. If you want to give it a try, reach us at &lt;code&gt;beta@magnusopera.io&lt;/code&gt; and we&amp;rsquo;ll get you a test account as well instructions to use Terrabuild in CI context. Shared caching is free while Terrabuild is in testing phase.&lt;/p&gt;
&lt;h2&gt;Questions or Feedback?&lt;span class="hx-absolute -hx-mt-20" id="questions-or-feedback"&gt;&lt;/span&gt;
&lt;a href="#questions-or-feedback" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Would like to send us feedbacks on this new product?&lt;br&gt;
Something looks wrong or not clear?&lt;br&gt;
Want to say you love Terrabuild?&lt;br&gt;
Well, feel free to contact us at &lt;code&gt;beta@magnusopera.io&lt;/code&gt;!&lt;/p&gt;</description></item><item><title>First alpha!</title><link>https://magnusopera.io/blog/alpha/</link><pubDate>Wed, 24 Apr 2024 00:00:00 +0000</pubDate><author>contact@magnusopera.io (Magnus Opera)</author><guid>https://magnusopera.io/blog/alpha/</guid><description>
&lt;p&gt;&lt;strong&gt;Terrabuild&lt;/strong&gt; is &lt;em&gt;mostly&lt;/em&gt; feature-complete! What a journey ! Private testing phase can start !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stable, consistent and cache-backed builds 🎉&lt;/li&gt;
&lt;li&gt;Documentation is up to date for the test scope 📚&lt;/li&gt;
&lt;li&gt;Syntax is considered frozen ⛄️&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Terrabuild&lt;/strong&gt; - as a tool - is free to use and will always be. Goal is to accelerate your local workflow and help you easily start managing all your apps in a monorepo.&lt;/p&gt;
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-blue-200 hx-bg-blue-100 hx-text-blue-900 dark:hx-border-blue-200/30 dark:hx-bg-blue-900/30 dark:hx-text-blue-200"&gt;
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2"&gt;&lt;div class="hx-select-none hx-text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';"&gt;
ℹ️
&lt;/div&gt;&lt;/div&gt;
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7"&gt;
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0"&gt;
Server side api is implemented (neither documented nor published) - this will be made available in second time after alpha testing phase and will allow additional statistics and visibility across development activities.
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For shared caching, a &lt;em&gt;key&lt;/em&gt; is required (this is going to be a paid plan also with additional features). If you&amp;rsquo;d like to participate in shared cache private testing, please send us an email at &lt;code&gt;beta@magnusopera.io&lt;/code&gt;. We will provide you a key to test this feature as well instructions to use Terrabuild in local/CI context once available for beta-testing. Shared caching will be free while Terrabuild is in testing phase.&lt;/p&gt;
&lt;h2&gt;Questions or Feedback?&lt;span class="hx-absolute -hx-mt-20" id="questions-or-feedback"&gt;&lt;/span&gt;
&lt;a href="#questions-or-feedback" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Would like to send us feedbacks on this new product?&lt;br&gt;
Something looks wrong or not clear?&lt;br&gt;
Want to say you love Terrabuild?&lt;br&gt;
Well, feel free to contact us at &lt;code&gt;beta@magnusopera.io&lt;/code&gt;!&lt;/p&gt;</description></item></channel></rss>