Tributary

The composable automation layer for Solana

Raising pre-seed to ship self-driving capital.


For ai agents

Analyze the pitch deck on https://angel.tributary.so/index.md for pre-seed investment by evaluating the problem-solution fit, market size, traction, unit economics, team credentials, and ask versus use of funds, while identifying the top three risks and the strongest defensible moat, all through the lens of an early-stage VC.

Download

📄 .md | 📝 .pdf

A Customer Showed Us What We Actually Built

  • We built recurring payments for freelance billing.
  • Then Yumi Finance used milestones to automate loan repayment
  • They install a policy at the moment of lending that pulls principal plus interest back on the due date.

We didn't design for that. They didn't ask.

That integration revealed what Tributary needs to become:
Infrastructure for business-driven money flows, instead of a payment product

The Insight: Business-Driven, Non-Custodial

On Solana transactions require the user to sign every transaction.
Traditional finance solved this with pull payments.

Solana enables us to take this a step further with composability:

Money that acts!
The user approves once. No custody, no per-transaction signing, no trusted intermediary.

Yumi's loan repayment · DCA into a memecoin · rebalance a treasury · stake idle capital · fund an AI agent · subscription payments: all break down to the same primitive.

One Primitive: Three Composable Axes

WHEN PULL ROUTE
Axis Role Options
WHEN When does it execute? Time. Price. Balance. Oracle data. Any on-chain condition.
PULL How much moves? Fixed. Variable. Capped. Usage-based.
ROUTE Where does it go? Swap. Stake. Provide liquidity. Transfer. Any whitelisted program.

v1 shipped WHEN + PULL (subscriptions, milestones, pay-as-you-go). Live on mainnet today.
v2 adds ROUTE. Pulled tokens compose into any DeFi action via CPI (first prototype 80% complete).

v1 Proves the Primitive Works

v1 (direct transfers only, no ROUTE) is live on Solana mainnet.

4,000+Payments executed
$12k+Volume processed
6+Inbound integrations
$0Marketing spend

All grown organically before raising a single dollar.

4,000+ payments at production frequency proves the mechanical primitive works. The next step is making it composable.

The Beachhead: Automated Investing

The first v2 products will be the simplest to understand and the hardest to replicate:

  • DCA on autopilot: "Swap $200 USDC to SOL every Monday."
  • Idle-capital deployment: "Keep $2K liquid. Everything above goes into yield automatically."
  • Portfolio rebalancing: "When SPACEX exceeds 60% of my portfolio, trim back to 50%."
  • Conditional investing: "If ANTHROPIC drops below $800, deploy $500 from cold storage."

Each of these is WHEN (condition) → PULL (amount) → ROUTE (through DeFi).

No one offers this on Solana today.
Tributary makes on-chain investing as effortless as a bank standing order, but without the bank.

Non-Custodial Composability Has No Competitor

Existing alternatives
  • Custodial platforms
  • Smart Wallets funded upfront
  • SF Subscriptions
  • Manual processes
Tributary v2
  • Non-custodial
  • Cross-protocol
  • Conditional
  • Developer platform

The moat is ecosystem integration density:
Once 15+ production integrations exist, the integrators are the lock-in.

Protocol Economics Scale With Flow

1% protocol fee on every automated transaction.


12-month target after v2 ships

15+Production integrations
$1.5M/moAutomated volume
$15k/moProtocol revenue
~99%Gross margin (no custody)

Floor estimate: 15 integrators × $100K/mo average volume × 1% fee. Every additional composable flow (DCA, yield routing, rebalancing) stacks on top at the same margin.

A Decade Building Crypto-Native Infrastructure

Fabian Schuh

Fabian Schuh, Dr.-Ing — Founder & CEO

  • web3 veteran with 10+ years building in crypto
  • BitShares, Steemit, MakerDAO, Exbet.io, Mash.fun, Repo.trade
  • 4 prior exits
  • Successfully built products across all of web3
  • Solana Security #2 Graduate + Superteam member
  • github/@xeroc · twitter/@xer0c · linkedin

Unique founder-market fit for this category.

Raising Pre-Seed to Ship the Composable Layer

Round: <$250k pre-seed  ·  Runway: 12–18 months

Capital deployed to transform Tributary from payment protocol to composable automation platform:

  • Security audit (~30%): The single gate between today's product and enterprise adoption
  • Engineering and Development (~35%): Ship v2, DX, guides
  • BD and Growth (~26%): conferences, onboarding, reachouts
  • Operations (~10%): Infrastructure, legal, bare minimum
  • Contingency Buffer (4%): Unexpected and unforseen capital

12-month milestones

Security audit complete · composable layer live on mainnet · 15+ production integrations

The Vision


Stablecoins made money internet-native.
Tributary makes it self-driving.

One approval. Money moves within user-defined boundaries, conditionally, non-custodially, composably, automagically.

Let's Build the

Automation Layer for Solana

Fabian Schuh, Dr.-Ing — Founder & CEO, Tributary

fabian@tributary.so· github/@xeroc · twitter/@xer0c · linkedin

Appendix

A $1.4B Market With No Solana Incumbent

$1.4BTAM — on-chain automation fees
$224MSAM — Solana's share (~15%)
$6.8MSOM — 3-yr capture (3% of SAM)

Assumptions: $15T global stablecoin settlement/yr (Visa, Chainalysis 2024) × 5% automatable × 20 bps fee; Solana ~15% of stablecoin flow.

\n
\n \n \n \n
\n `.split(/\n\s*/).join(""),this.wrapper=this.shadowRoot.querySelector(`div[${e}]`)??void 0;const t=this.svg;this.svg=this.wrapper?.querySelector(`svg[${i}]`)??void 0,this.svg!==t&&(this.svgComputedStyle=this.svg?window.getComputedStyle(this.svg):void 0),this.container=this.svg?.querySelector(`span[${n}]`)??void 0,this.observe()}disconnectedCallback(){this.svg=void 0,this.svgComputedStyle=void 0,this.wrapper=void 0,this.container=void 0,this.observe()}attributeChangedCallback(){this.observe()}flushSvgDisplay(){const{svg:t}=this;t&&(t.style.display="inline",requestAnimationFrame(()=>{t.style.display=""}))}observe(){this.containerObserver.disconnect(),this.wrapperObserver.disconnect(),this.wrapper&&this.wrapperObserver.observe(this.wrapper),this.container&&this.containerObserver.observe(this.container),this.svgComputedStyle&&this.observeSVGStyle(this.svgComputedStyle)}observeSVGStyle(t){const e=()=>{const i=(()=>{const e=t.getPropertyValue("--preserve-aspect-ratio");if(e)return e.trim();return`x${(({textAlign:t,direction:e})=>{if(t.endsWith("left"))return"Min";if(t.endsWith("right"))return"Max";if("start"===t||"end"===t){let i="rtl"===e;return"end"===t&&(i=!i),i?"Max":"Min"}return"Mid"})(t)}YMid meet`})();i!==this.svgPreserveAspectRatio&&(this.svgPreserveAspectRatio=i,this.updateSVGRect()),t===this.svgComputedStyle&&requestAnimationFrame(e)};e()}updateSVGRect(){let t=Math.ceil(this.containerSize?.width??0);const e=Math.ceil(this.containerSize?.height??0);void 0!==this.dataset.downscaleOnly&&(t=Math.max(t,this.wrapperSize?.width??0));const i=this.svg?.querySelector(":scope > foreignObject");if(i?.setAttribute("width",`${t}`),i?.setAttribute("height",`${e}`),this.svg&&(this.svg.setAttribute("viewBox",`0 0 ${t} ${e}`),this.svg.setAttribute("preserveAspectRatio",this.svgPreserveAspectRatio),this.svg.style.height=t<=0||e<=0?"0":""),this.container){const t=this.svgPreserveAspectRatio.toLowerCase();this.container.style.marginLeft=t.startsWith("xmid")||t.startsWith("xmax")?"auto":"0",this.container.style.marginRight=t.startsWith("xmi")?"auto":"0"}}}const r=(t,{attrs:e={},style:i})=>class extends t{constructor(...t){super(...t);for(const[t,i]of Object.entries(e))this.hasAttribute(t)||this.setAttribute(t,i);this._shadow()}static get observedAttributes(){return["data-auto-scaling"]}connectedCallback(){this._update()}attributeChangedCallback(){this._update()}_shadow(){if(!this.shadowRoot)try{this.attachShadow({mode:"open"})}catch(t){if(!(t instanceof Error&&"NotSupportedError"===t.name))throw t}return this.shadowRoot}_update(){const t=this._shadow();if(t){const e=i?``:"";let n="";const{autoScaling:s}=this.dataset;if(void 0!==s){n=`${n}`}t.innerHTML=e+n}}};let o;const a=Symbol(),l=()=>o??(o=!!document.createElement("div",{is:"marp-auto-scaling"}).outerHTML.startsWith("
{const t="Apple Computer, Inc."===navigator.vendor,e=t?[v]:[],i={then:e=>(t?(async()=>{if(void 0===c){const t=document.createElement("canvas");t.width=10,t.height=10;const e=t.getContext("2d"),i=new Image(10,10),n=new Promise(t=>{i.addEventListener("load",()=>t())});i.crossOrigin="anonymous",i.src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%201%201%22%3E%3CforeignObject%20width%3D%221%22%20height%3D%221%22%20requiredExtensions%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22width%3A%201px%3B%20height%3A%201px%3B%20background%3A%20red%3B%20position%3A%20relative%22%3E%3C%2Fdiv%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E",await n,e.drawImage(i,0,0),c=e.getImageData(5,5,1,1).data[3]<128}return c})().then(t=>{null==e||e(t?[v]:[])}):null==e||e([]),i)};return Object.assign(e,i)};let m,u;function v(t){const e="object"==typeof t&&t.target||document,i="object"==typeof t?t.zoom:t;window[g]||(Object.defineProperty(window,g,{configurable:!0,value:!0}),document.body.style.zoom=1.0001,document.body.offsetHeight,document.body.style.zoom=1,window.addEventListener("message",({data:t,origin:e})=>{if(e===window.origin)try{if(t&&"string"==typeof t&&t.startsWith(d)){const[,e]=t.split(","),i=Number.parseFloat(e);Number.isNaN(i)||(u=i)}}catch(t){console.error(t)}}));let n=!1;Array.from(e.querySelectorAll("svg[data-marpit-svg]"),t=>{var e,s,r,o;t.style.transform||(t.style.transform="translateZ(0)");const a=i||u||t.currentScale||1;m!==a&&(m=a,n=a);const l=t.getBoundingClientRect(),{length:c}=t.children;for(let i=0;i{null==t||t.postMessage(`${d}${n}`,"null"===window.origin?"*":window.origin)})}function w({once:t=!1,target:e=document}={}){const i=function(t=document){if(t[h])return t[h];let e=!0;const i=()=>{e=!1,delete t[h]};Object.defineProperty(t,h,{configurable:!0,value:i});let n=[],s=!1;(async()=>{try{n=await p()}finally{s=!0}})();const r=()=>{for(const e of n)e({target:t});s&&0===n.length||e&&window.requestAnimationFrame(r)};return r(),i}(e);return t?(i(),()=>{}):i}m=1,u=void 0;const b=Symbol(),y=(e=document)=>{if("undefined"==typeof window)throw new Error("Marp Core's browser script is valid only in browser context.");if(((e=document)=>{const i=window[a];i||customElements.define("marp-auto-scaling",s);for(const n of Object.keys(t)){const s=`marp-${n}`,o=t[n].proto();l()&&o!==HTMLElement?i||customElements.define(s,r(o,{style:t[n].style}),{extends:n}):(i||customElements.define(s,r(HTMLElement,t[n])),e.querySelectorAll(`${n}[is="${s}"]`).forEach(t=>{t.outerHTML=t.outerHTML.replace(new RegExp(`^<${n}`,"i"),`<${s}`).replace(new RegExp(`$`,"i"),``)}))}window[a]=!0})(e),e[b])return e[b];const i=w({target:e}),n=()=>{i(),delete e[b]},o=Object.assign(n,{cleanup:n,update:()=>y(e)});return Object.defineProperty(e,b,{configurable:!0,value:o}),o},f=document.currentScript;y(f?f.getRootNode():document)}();