<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.0.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-06-08T00:24:51+00:00</updated><id>/feed.xml</id><title type="html">SHARP STONE codewerks</title><subtitle>Sharp Stone Codewerks is a consultancy and independent development house specializing in Ruby On Rails and Open Source technologies.</subtitle><entry><title type="html">Next from the Skunk Works: FORBUS</title><link href="/2021/11/26/forbus.html" rel="alternate" type="text/html" title="Next from the Skunk Works: FORBUS" /><published>2021-11-26T00:00:00+00:00</published><updated>2021-11-26T00:00:00+00:00</updated><id>/2021/11/26/forbus</id><content type="html" xml:base="/2021/11/26/forbus.html"><![CDATA[<p><img src="/assets/images/forbus.png" style="float:right; width: 320px; margin-left: 1rem; padding: 1rem; border: 1px solid #ccc; border-radius: 10px;background:#eee;" />I’ve put Wingate on temporary hiatus while I work on the next big piece of that project: Bidirectional Federation. Wingate as a standalone community service is coming along nicely, but the real power - the real end game - was to allow communities to share channels between themselves. In effect, allow communities to create their own Virtual Social Networks. Most current federation solutions are more like “RSS On Steroids” - FORBUS hopes to make it possible for subscribers to post data back to publisher instances.</p>

<p>The requirements for this were that:</p>
<ul>
  <li>the transport layer be something open-source and easy to provision</li>
  <li>the library itself be unopinionated in terms of how the data to drive it is stored</li>
  <li>the transport be something very fast and capable of handling immense bandwidth if needed</li>
  <li>the mechanism be “fire and forget” so that publishers won’t be blocked by slow subscribers, and subscribers can handle incoming traffic by whatever means they choose without fear of affecting anything upstream</li>
  <li>the mechanism utilize already proven acl/auth for better security</li>
  <li>the transport needs to support both pub/sub and list/queue capability</li>
  <li>the transport needs to support federated-access caching of entities</li>
</ul>

<p>The best fit for this - at least what looked best to me from the perspective of a Rails developer - was Redis. Hence the name of the library became “FORBUS” which stands for:</p>

<p style="text-align: center; font-size: 1.5rem;">
<b><u>F</u></b>ederation <b><u>O</u></b>ver <b><u>R</u></b>edis <b><u>BUS</u></b>
</p>

<p>Up until the latest version of Redis I was leaning towards something like RabbitMQ, but then Redis added ACL capability. It was now possible to create additional users and grant them access on a keyword level. Now it became possible to create message bus queues for a specific client and only that client would be able to see it. Perfect! This work borrows code from a Redis-based message bus I was working on a couple of years ago called <a href="https://github.com/msmiller/redbus" target="_blank">“Redbus”</a>.</p>

<p>Once I get further along I’ll open up the repository, but in general the services provided for federation include:</p>

<ul>
  <li>A cache space for “Imprints” of user profile information (name, avatar, handle, profile-link). Instances can use that to drive creation of virtual users on their local instance</li>
  <li>A cache space to list all available channels, their latest post id, and details about the channels, Subscribers can use this to request federation access and keep track of “latest post” counters.</li>
  <li>Mutual message-bus LISTs on each end of a federated Channel - the Publisher (Channel owner) sends out new posts on their LIST, the Subscribers sends out replies on their LISTS which the Publisher ingests and turns into Posts which then go out to all Subscribers on their LISTS</li>
  <li>An RPC capability whereby one side of the Federation can request some specific information and can wait on a keyword to appear in the the other side’s message-bus as a reply.</li>
</ul>

<p>There’s obviously more to it, there’s an ecosystem of models that provides the framing that an App will use to drive this. Above that up in the App’s code there are no limitations. The information about Redis access and subscribed channels and all the rest can be represented and persisted in any way the coder wants. The framing is mainly to provide a way to describe and organize what’s going on.</p>

<p>The plan is to get FORBUS operational, and then refactor Wingate to use it. This will require some torqueing around of Post, User, and Channel models and how they operate. The end result should be a smaller more flexible monolith which has federation capability.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[I’ve put Wingate on temporary hiatus while I work on the next big piece of that project: Bidirectional Federation. Wingate as a standalone community service is coming along nicely, but the real power - the real end game - was to allow communities to share channels between themselves. In effect, allow communities to create their own Virtual Social Networks. Most current federation solutions are more like “RSS On Steroids” - FORBUS hopes to make it possible for subscribers to post data back to publisher instances.]]></summary></entry><entry><title type="html">Wingate Enters Beta</title><link href="/2021/03/19/wingate-beta.html" rel="alternate" type="text/html" title="Wingate Enters Beta" /><published>2021-03-19T00:00:00+00:00</published><updated>2021-03-19T00:00:00+00:00</updated><id>/2021/03/19/wingate-beta</id><content type="html" xml:base="/2021/03/19/wingate-beta.html"><![CDATA[<p><img src="/assets/images/wingate-login.jpg" style="float:right; width: 320px; padding-left: 1rem;" /><a href="/skunkworks/wingate/">“Wingate”</a> has now entered beta release! This release represents well over a thousand hours of development and several rounds of re-thinking how to build a system capable of multiple content behaviors. It support six kinds of content channels: Timeline (Twitter-like), Forum, Link Sharing, News Sharing, Blog, and Gallery (Instagram-like).</p>

<p>This spring the entire system has been re-coded to use TailwindCSS and the new Turbo JavaScript package for doing asynchronous DOM updates. This makes it behave much better on mobile platforms, as well as be more flexible when it comes to making sweeping UI changes. Turbo and Stimulus-Reflex allows for App-Like performance within a browser without having to maintain a complex front-end stack. In addition, this approach means no structured data is stored on the remote device - just encrypted DOM fragments transmitted across ActionCable.</p>

<p>Right now I’m looking for some Angel investors so I can work on this full time. So feel free to hit me up on the “Contact” link at the bottom of the site if you know someone who might be interested. I should have some demo accounts rigged shortly to allow investors or interested parties to log in and see what the system is all about.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[“Wingate” has now entered beta release! This release represents well over a thousand hours of development and several rounds of re-thinking how to build a system capable of multiple content behaviors. It support six kinds of content channels: Timeline (Twitter-like), Forum, Link Sharing, News Sharing, Blog, and Gallery (Instagram-like).]]></summary></entry><entry><title type="html">Book Announcement: “Different Things Vary”</title><link href="/2020/01/26/different-things-vary.html" rel="alternate" type="text/html" title="Book Announcement: “Different Things Vary”" /><published>2020-01-26T00:00:00+00:00</published><updated>2020-01-26T00:00:00+00:00</updated><id>/2020/01/26/different-things-vary</id><content type="html" xml:base="/2020/01/26/different-things-vary.html"><![CDATA[<p><img src="/assets/images/dtv.png" style="float:right" />I’ve committed to myself to finish a book that I’ve been taking notes on for a few years. <a href="https://differentthingsvary.com/">“Different Things Vary”</a> reflects the experiences and techniques I’ve gathered from four decades as a developer in the Tech Industry. It will cover everything from coding techniques to going out on your own as a freelancer or entrepreneur, as well as getting into management, and the lifestyle of an engineer.</p>
<div style="clear:both"></div>]]></content><author><name></name></author><summary type="html"><![CDATA[I’ve committed to myself to finish a book that I’ve been taking notes on for a few years. “Different Things Vary” reflects the experiences and techniques I’ve gathered from four decades as a developer in the Tech Industry. It will cover everything from coding techniques to going out on your own as a freelancer or entrepreneur, as well as getting into management, and the lifestyle of an engineer.]]></summary></entry><entry><title type="html">Jekyll Site Redux</title><link href="/2019/11/24/jekyll-site-redux.html" rel="alternate" type="text/html" title="Jekyll Site Redux" /><published>2019-11-24T01:06:00+00:00</published><updated>2019-11-24T01:06:00+00:00</updated><id>/2019/11/24/jekyll-site-redux</id><content type="html" xml:base="/2019/11/24/jekyll-site-redux.html"><![CDATA[<p>In preparation for things coming in 2020, the company site has been rebuilt on top of <a href="https://jekyllrb.com/">Jekyll</a>. This makes it easier to do updates and post news.</p>

<p>What’s coming in 2020? Marketing on Abstretta will begin, Bibliogrify will be soft-launched, and a couple of Rails Gems I’ve been working on will also be released to the public.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[In preparation for things coming in 2020, the company site has been rebuilt on top of Jekyll. This makes it easier to do updates and post news.]]></summary></entry></feed>