<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on Frontier.sh</title><link>https://frontier.sh/projects/</link><description>Recent content in Projects on Frontier.sh</description><generator>Hugo -- gohugo.io</generator><language>en-nz</language><atom:link href="https://frontier.sh/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>Periscope</title><link>https://frontier.sh/projects/periscope/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://frontier.sh/projects/periscope/</guid><description>&lt;div class="oss-intro">
&lt;img src="https://frontier.sh/images/periscope-logo.svg" alt="Periscope" class="oss-intro__logo" />
&lt;p>Generate synthetic support tickets for training human or AI support agents.&lt;/p>
&lt;/div></description><content>&lt;div class="oss-intro">
&lt;img src="https://frontier.sh/images/periscope-logo.svg" alt="Periscope" class="oss-intro__logo" />
&lt;p>Generate synthetic support tickets for training human or AI support agents.&lt;/p>
&lt;/div>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Training support has a data problem. The tickets you&amp;rsquo;d most want someone to practise on are your real ones, and those are full of customer names, order numbers, and details you can&amp;rsquo;t hand to a new starter or drop into an eval harness. Sanitising them is slow work, and what you&amp;rsquo;re left with is thin and out of date.&lt;/p>
&lt;p>Periscope skips that step. You give it a URL and it reads what your customers already read: your help centre, docs, blog, and public social profiles. Then you answer a short set of questions about the queue you want — which issues come up, which channels they arrive on, how the customer sounds when they&amp;rsquo;re annoyed. It writes tickets from that, labelled by type, channel, sentiment, and difficulty, one at a time or a few hundred in a batch.&lt;/p>
&lt;p>That&amp;rsquo;s useful in two places. A new rep gets a queue that looks like week three rather than week one, with nothing real on the line. And if you&amp;rsquo;re shipping an AI agent, you get an evaluation set built from your own product — refunds, escalations, the ambiguous ones — before the agent meets them in production.&lt;/p>
&lt;p>No customer conversations are uploaded, and there&amp;rsquo;s nothing to connect to your live helpdesk. Pricing is credits rather than seats, so a whole team can practise on the same workspace.&lt;/p>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Learns from your public content&lt;/strong> — Point it at a URL and it reads the help centre, docs, blog, and public social profiles&lt;/li>
&lt;li>&lt;strong>Queues you shape&lt;/strong> — Choose the issue types, channels, and customer tone you want to practise against&lt;/li>
&lt;li>&lt;strong>Labelled tickets&lt;/strong> — Every ticket is tagged by type, channel, sentiment, and difficulty, so you can filter and sort a set&lt;/li>
&lt;li>&lt;strong>Batch generation&lt;/strong> — Make one ticket to check the tone, or a few hundred to build a training set&lt;/li>
&lt;li>&lt;strong>Export anywhere&lt;/strong> — JSONL, Markdown, or CSV, ready for an eval harness or a training doc&lt;/li>
&lt;li>&lt;strong>No customer data&lt;/strong> — Public content only; nothing to sanitise and no helpdesk integration to set up&lt;/li>
&lt;li>&lt;strong>Credit pricing&lt;/strong> — Pay for what you generate rather than per seat&lt;/li>
&lt;/ul></content></item><item><title>Jellybook</title><link>https://frontier.sh/projects/jellybook/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://frontier.sh/projects/jellybook/</guid><description>&lt;div class="oss-intro">
&lt;img src="https://frontier.sh/images/jellybook-logo.webp" alt="Jellybook" class="oss-intro__logo" />
&lt;p>Jellybook is an iOS app for Jellycat collectors to catalogue, track, and share their collection. I built it for my fiancé and we run it together — our first iOS app, and close to 1,000 collectors signed up in its first month.&lt;/p>
&lt;/div></description><content>&lt;div class="oss-intro">
&lt;img src="https://frontier.sh/images/jellybook-logo.webp" alt="Jellybook" class="oss-intro__logo" />
&lt;p>Jellybook is an iOS app for Jellycat collectors to catalogue, track, and share their collection. I built it for my fiancé and we run it together — our first iOS app, and close to 1,000 collectors signed up in its first month.&lt;/p>
&lt;/div>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Jellybook gives collectors a searchable catalogue of thousands of Jellycats, a way to track what they own with notes and photos, a wishlist, and a community &amp;ldquo;Jellywall&amp;rdquo; to share their collection. The app itself is native Swift and SwiftUI.&lt;/p>
&lt;p>The interesting part is the back end: it runs &lt;strong>entirely on Cloudflare&lt;/strong>. Workers serve the API, D1 holds the data, R2 stores the images, and Workers AI plus Vectorize power image-based search, with Queues handling the background work. There are no servers to manage, it&amp;rsquo;s fast everywhere, and it costs almost nothing to operate.&lt;/p>
&lt;div class="carousel" data-carousel data-carousel-type="phone" tabindex="0" role="group" aria-label="Jellybook screenshots">
&lt;button type="button" class="carousel__arrow carousel__arrow--prev" data-carousel-prev aria-label="Previous screenshot">&amp;larr;&lt;/button>
&lt;div class="carousel__viewport" data-carousel-viewport>
&lt;div class="carousel__track" data-carousel-track>
&lt;figure class="carousel__item" data-carousel-item data-caption="Browse a catalogue of thousands of Jellycats.">
&lt;img src="https://frontier.sh/images/jellybook-explore.webp" alt="Browsing the Jellycat catalogue in Jellybook" loading="lazy" />
&lt;/figure>
&lt;figure class="carousel__item" data-carousel-item data-caption="Track your collection, its size and its value.">
&lt;img src="https://frontier.sh/images/jellybook-collection.webp" alt="Tracking a collection in Jellybook" loading="lazy" />
&lt;/figure>
&lt;figure class="carousel__item" data-carousel-item data-caption="Every Jellycat gets its own detail page.">
&lt;img src="https://frontier.sh/images/jellybook-detail.webp" alt="A Jellycat detail page in Jellybook" loading="lazy" />
&lt;/figure>
&lt;figure class="carousel__item" data-carousel-item data-caption="Keep a wishlist of the ones you're still hunting for.">
&lt;img src="https://frontier.sh/images/jellybook-wishlist.webp" alt="A wishlist in Jellybook" loading="lazy" />
&lt;/figure>
&lt;figure class="carousel__item" data-carousel-item data-caption="Share your collection on the community Jellywall.">
&lt;img src="https://frontier.sh/images/jellybook-jellywall.webp" alt="The community Jellywall in Jellybook" loading="lazy" />
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;button type="button" class="carousel__arrow carousel__arrow--next" data-carousel-next aria-label="Next screenshot">&amp;rarr;&lt;/button>
&lt;div class="carousel__dots" data-carousel-dots aria-hidden="true">&lt;/div>
&lt;p class="carousel__caption" data-carousel-caption>&lt;/p>
&lt;/div>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Native iOS&lt;/strong> — Built in Swift and SwiftUI for a fast, native feel&lt;/li>
&lt;li>&lt;strong>Catalogue&lt;/strong> — Browse and search thousands of Jellycats by category&lt;/li>
&lt;li>&lt;strong>Collection tracking&lt;/strong> — Record what you own with notes, photos, and dates&lt;/li>
&lt;li>&lt;strong>Wishlist&lt;/strong> — Keep a list of the ones you&amp;rsquo;re still hunting for&lt;/li>
&lt;li>&lt;strong>Jellywall&lt;/strong> — Share your collection with the community&lt;/li>
&lt;li>&lt;strong>All on Cloudflare&lt;/strong> — Workers, D1, R2, Workers AI, Vectorize, and Queues — fast and cheap to run&lt;/li>
&lt;/ul></content></item></channel></rss>