Bragging about the bits we've busily building.

Due to be released in v0.27.0

0.27 is Out - Retry, Cache Eviction and UX improvements

Changelog entry cover image

Orbital 0.27.0 - The "Cheers" Edition 🍻

As the Orbital office farewells Dry January, we welcome back Friday drinks with a fresh release - 0.27.0.

Pull up a stool, grab your favorite beverage, and let’s toast to the new features, usability improvements, and fixes that are making Orbital 0.27.0 as cozy and welcoming as your favorite Boston bar.


Retry Operations

Like Sam Malone behind the bar - or a Fraser reboot - we know the importance of second and third chances.

That’s why we’ve introduced @Retry annotations, ensuring that if at first you don’t succeed, requests can try, try again to connect and get your data flowing just right. Read more about it in the release announcement here, and the docs are available here

Cache Eviction

There’s nothing worse than overstaying your welcome when it’s time to leave.

Orbital’s caches now support Cache headers, evicting data when it’s stale. Read more about it here, with the docs available here

Better Connections for Kafka

Our Kafka connections now have more options than Frasier had patients - with full support for secure Kafka connections. Expect a seamless experience that keeps the data pouring in. More detail available in our docs

Usability Stuff

Better handling of query compilation errors

Pobody’s Nerfect, right?

Orbital now displays compilation errors in a slightly less antagonistic way. Read more here.

Query history refreshes

Running a new query now refreshes the history view automatically, much like Norm Peterson’s beer mug. You’ll always have the latest information at your fingertips, no manual refresh needed.

Loading bars

Our loading bars have received a makeover, becoming more informative and visually appealing. It’s the little details that make all the difference, ensuring you’re not left hanging while waiting for your data to appear.


  • Projections of Nested Arrays: We’ve fixed the projection of nested arrays, ensuring that your data structures are handled with the care and precision of Cliff Clavin’s factoids—accurate, detailed, and meticulously organized.

  • Nested Values in Discovery: Nested values are now correctly used as inputs to discovery, making your data exploration as smooth and effective as Woody Boyd’s charm. No more confusion or missteps.

  • Cancelled Queries: Cancelled queries now appropriately show as “cancelled,” clearing up any confusion and ensuring you’re not left wondering what went wrong. It’s straightforward communication, just how Coach would have wanted it.

  • Improved Performance of Loading Query History: We’ve supercharged the performance of loading your query history, making it faster than ever. It’s like getting your data served up by Sam himself—quick, efficient, and with a smile.

  • Fix duplicates on child properties with same names: An unfortunate little gremlin meant in certain conditions child properties with the same name as a parent would get incorrect values.

So, here’s to Orbital 0.27.0 — Cheers to faster data, better performance, and a community where everyone is connected! 🍻

Due to be released in v0.27.0

Http Retry Support

Changelog entry cover image

Retry Option for Http operations:

Let’s say you need to stitch Film data with reviews coming from an unreliable third party Rest Api:

service ReviewsApi {
    @HttpOperation(method = "GET", url = "https://reviews/{id}")
    operation getReviews(id: FilmId): FilmReview[]

The third party REST API gives you intermittent HTTP 500s as it can’t cope with user requests at particular times during day.

To address such outages, you can now define a HttpRetry settings in Taxi for the operation.

Orbital Supports two HttpRetry policies:

Retry Policy with Fixed Delay

Let say you want to Orbital to retry ‘getReviews’ operation when it responds with Http 500. You want Orbital to try the operation at most 10 times and wait 5 seconds between each retry. Here is how you can modify the taxi definition:

service ReviewsApi {
    @HttpOperation(method = "GET", url = "https://reviews/{id}")
    @HttpRetry(responseCode = [500], fixedRetryPolicy = @HttpFixedRetryPolicy(maxRetries = 10, retryDelay = 5))
    operation getReviews(id: FilmId): FilmReview[]

You can trigger the retry mechanism for multiple response codes as well, here is how you can modify previous Taxi definition to trigger the Retry mechanism when the remote service returns either Http 500 or Http 502

service ReviewsApi {
    @HttpOperation(method = "GET", url = "https://reviews/{id}")
    @HttpRetry(responseCode = [500, 502], 
      fixedRetryPolicy = @HttpFixedRetryPolicy(
        maxRetries = 10, 
        retryDelay = 5
    operation getReviews(id: FilmId): FilmReview[]

Retry Policy with Exponential Delay

With exponential delay retry policy, Orbital will wait progressively longer intervals between consecutive retries:

service ReviewsApi {
    @HttpOperation(method = "GET", url = "https://reviews/{id}")
     @HttpRetry(responseCode = [500, 502], fixedRetryPolicy = @HttpExponentialRetryPolicy(maxRetries = 10, retryDelay = 5, jitter = 0.5))
    operation getReviews(id: FilmId): FilmReview[]

With the above definition, Orbital will try invoking the Rest at most 10 times in case of Http 500 or Http 502 errors.

However, the delay between retries will increase exponentially.

With a jitter value between 0 and 1, you add some randomness to the delay time by introducing a random delay, or “jitter”, to the next retry delay time. This ensures that the retries are not synchronous and reduces the likelihood of a retry storm.

Here’s how the table would look with exponential backoff with Jitter:

Retry AttemptDelay Time (seconds)Jitter Range (seconds)Actual Delay Time (seconds)
11.00.51-0 - 1.5
22.00.51-5 - 2.5 – 4.5 – 8.5
516.00.515.5 – 16.5


Http retries is out in 0.27. Read more about it over in our docs

Due to be released in v0.27.0

Better query compilation errors

Changelog entry cover image

Some UI/UX love for Orbital now, with a fine tuning of how compilation errors are being displayed on screen.

We’ll continue to improve the surfacing of messages like this throughout Orbital, allowing a more streamlined experience for users.

Due to be released in v0.27.0

Apple Silicon Friendly docker images available

Changelog entry cover image

Some users have been experiencing errors when running our docker images on Apple Silicon Macbook Pro’s (M1-3 et al).

The issue appears to be related to the base image we use for our Docker images - eclipse-temurin:alpine.

To address this, we’ve started producing extra images, based on Ubuntu Jammy.

Grab the images with the -jammy suffix, eg:

  • 0.27.0-jammy
  • next-jammy

These images aren’t suitable for production usage, as the Ubuntu Jammy base image contains significantly more security CVE’s than the -alpine images.

However, for local developer environments, they’re great - mainly because they don’t crash. Brilliant.

Due to be released in v0.26.0

Http Headers and Date Math

Http Headers

The @HttpHeader annotation now is now supported, for setting headers on HTTP requests.

For example:

service MyService {
  @HttpOperation(method = "GET", url = "...")
  // A fixed, static header
  @HttpHeader(name = "Consumes", value = "application/json")
  operation findPeople():Person[]

  // A header that's calculated
  operation findPeople(
     @HttpHeader(name = "If-Modified-Since") ifModifiedSince : Instant = addDays(now(),-7)

You can also pass header values in using the given {} clause in a query:

service MyService {
  operation findPeople(
     @HttpHeader(name = "Cache-Control", prefix = "max-age=") cacheMaxAge : CacheMaxAge

// which is then invoked as:
given { maxAge : CacheMaxAge = 64000 } 
find { Person[] }

Read more about it in our docs

Date math

The stdlib in Taxi has been expanded to add date math functions to the stdlib:

  • addMinutes
  • addDays
  • addSeconds
  • now
  • parseDate

Read more about these in the Taxi docs

Due to be released in v0.26.0