From 13e2373f6eca201a462228cd19de53cca2a283bb Mon Sep 17 00:00:00 2001 From: Alex Godoroja Date: Sun, 9 Aug 2026 00:17:46 -0700 Subject: [PATCH] app-store: add Dial, Dead Simple Email, Kinetic Pricing, Rent A Human, Upfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five apps from the publish queue, all pinned to the front of New & Updated. Card and page data comes from each app's authored submission — the same file the catalogue entry is built from — so the store page cannot drift from what installs. Dial has no authored submission yet, so its record comes from its publish-queue case plus its live listing, and its usage demo is written here. Adding an app needs three registrations, not one, and missing any of them fails quietly rather than loudly: APP_IDS the authoritative list; an id absent from it is simply never built CATMAP category assignment; without it the app has no shelf ICON_MAP without an entry the generator falls back to a coloured gradient tile, which renders as a plausible-looking placeholder rather than an error New "Work & Research" shelf: pricing research and human dispatch are neither Data nor Communications, and squeezing them into an existing shelf would have been worse than adding one. Logos are the real marks, pulled from each vendor and checked by eye on both themes: Dial and Upfile are light-on-dark tiles, Kinetic is its dark green K, Rent A Human is its cream app icon, Dead Simple Email is the blue envelope. Each is normalised to 256px PNG with 96/240 webp variants, since the optimized variants are committed rather than generated at build. Dial's vendor reads GetDial AI rather than Dial, which matches their GitHub org and avoids a card that says "Dial / Dial". apps.ts regenerated: 22 -> 27 apps, five added, none removed, no churn to the existing records. build, check:site (407 files, 33,101 refs) and check:plain all green; the plain twin is re-stamped, and it carries no app list so shelf content cannot change it. Co-Authored-By: Claude Opus 5 --- public/appicons/io.pilot.deadsimple.png | Bin 0 -> 56117 bytes public/appicons/io.pilot.dial.png | Bin 0 -> 15155 bytes public/appicons/io.pilot.kinetic.png | Bin 0 -> 11775 bytes public/appicons/io.pilot.rentahuman.png | Bin 0 -> 10032 bytes public/appicons/io.pilot.upfile.png | Bin 0 -> 15599 bytes .../optimized/io.pilot.deadsimple-240.webp | Bin 0 -> 8194 bytes .../optimized/io.pilot.deadsimple-96.webp | Bin 0 -> 2930 bytes .../appicons/optimized/io.pilot.dial-240.webp | Bin 0 -> 3588 bytes .../appicons/optimized/io.pilot.dial-96.webp | Bin 0 -> 1338 bytes .../optimized/io.pilot.kinetic-240.webp | Bin 0 -> 3000 bytes .../optimized/io.pilot.kinetic-96.webp | Bin 0 -> 1254 bytes .../optimized/io.pilot.rentahuman-240.webp | Bin 0 -> 2918 bytes .../optimized/io.pilot.rentahuman-96.webp | Bin 0 -> 1302 bytes .../optimized/io.pilot.upfile-240.webp | Bin 0 -> 2528 bytes .../optimized/io.pilot.upfile-96.webp | Bin 0 -> 1036 bytes scripts/gen-apps.mjs | 10 + src/data/app-demos.json | 274 ++++ src/data/app-methods.json | 334 +++++ src/data/app-overrides.json | 230 ++++ src/data/apps.ts | 1185 +++++++++++++++++ src/pages/app-store.astro | 2 +- src/pages/plain/app-store.astro | 2 +- 22 files changed, 2035 insertions(+), 2 deletions(-) create mode 100644 public/appicons/io.pilot.deadsimple.png create mode 100644 public/appicons/io.pilot.dial.png create mode 100644 public/appicons/io.pilot.kinetic.png create mode 100644 public/appicons/io.pilot.rentahuman.png create mode 100644 public/appicons/io.pilot.upfile.png create mode 100644 public/appicons/optimized/io.pilot.deadsimple-240.webp create mode 100644 public/appicons/optimized/io.pilot.deadsimple-96.webp create mode 100644 public/appicons/optimized/io.pilot.dial-240.webp create mode 100644 public/appicons/optimized/io.pilot.dial-96.webp create mode 100644 public/appicons/optimized/io.pilot.kinetic-240.webp create mode 100644 public/appicons/optimized/io.pilot.kinetic-96.webp create mode 100644 public/appicons/optimized/io.pilot.rentahuman-240.webp create mode 100644 public/appicons/optimized/io.pilot.rentahuman-96.webp create mode 100644 public/appicons/optimized/io.pilot.upfile-240.webp create mode 100644 public/appicons/optimized/io.pilot.upfile-96.webp diff --git a/public/appicons/io.pilot.deadsimple.png b/public/appicons/io.pilot.deadsimple.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f61bffe7915d6e2cdbb207706d574bd96fe6fc GIT binary patch literal 56117 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 literal 0 HcmV?d00001 diff --git a/public/appicons/io.pilot.dial.png b/public/appicons/io.pilot.dial.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8d24f276f9a40674263b2791193b9ba4522d73 GIT binary patch literal 15155 zcmYLwbyQT}7w^n4zyJdb(mixYNjF1-fTTz>G)RilHA8nxhyn_zARr~u3@Ih0NOw0V zoo~Lsx88bx+;z{r_ndY2-glpUcYJo7-V=3VLOMbK06?s%p<)040I@?L0D^}-S$KbT z{O{_efw~f)a+qNod!gcBqUork1K`DuApl^E3jqAz6zoBVJpcflLLdMKdj|e@uMqVA zo&o`dIRAhA-$bV!I!ypT`kkhVqLDvvKjfL0{dB;>BEh_~s5c1?5}-{YQ(N0yD>F!3 zOp~3d8CR_3Fh*EeV`ag6-M?PLtet(kB=P!7G4B_*>2$3QVHX4OY|ci_W_G`r3@0w+ z1Mgv}qOr+EKRRMjI$|VBaVzLr;d5_m$l-p_$mOuy{pAR=W%`Hp&M2a`($Z4YGVwgCopQfB;4ELF~?l?0+L9qTn8 zj}~ke#UgLz8Nw1rio7HfLw3hjf262;S+YOPJAC{){+-lIPG%pT)4&q@(9mrdro8(c zhUZTS7{dh$oI>f=7N&uqR}~6{L)uLi`324M2MWL+ zHx~o1AKnH{7g{nWetPmQTzc4t;I%x-pADa?D^G#1hwnd4et>X;%;B((nnE1At&s0B z+963;gu^78VY_*=9mDc)1+)qdqC4W-+0{*TrQGRze9 zR8yaRA8xWLYvoywYM8aJ@7dhc)KsM_k#7=?WXRPk9=sc#p{simV#y@DNJM{&`S)jE z^{|WCAzu5QHhdk%m|GH2y!N;G`PZu-KXTH+_syn>K}#Wbm$ibJ!p$#Lp`GP|KM)Y) zhlgvBI&M%rrj`xy(v}X^N@RQVtaYu$NkUp(2|#&1?SXNT?A745lhLB^zPKk@Vd&X`I}>A^~6DGf_&#q}1Gu z%&=Vrslo|BIY!&N-jKiFM!Hyr{kHUcv^+fzB?Uq_#g>x^Fw?c4Lh&Q+>1l568GKM| zDO#p??2MmcDA1NFfR=B#pCl*8y!?+#1_sJxjb`CN%<2_4_cArn;EUL)KvH7nCtw2tv5Kz*;N5f-F53B&hj z6gpb|zg%4>pk73%%R+abmN%L6KYaPVJ_o?!}AK3VQJGu9`NiXKAl= z$fi8OLWGvaoUsUJ7arN{yu9zD92b@aBhOOw>>=6bCk|R90JO}F&>{a>;CvY9@k_k#8#vfq8;{t5 zF9CtvsQ9X(&6nAVOh-gU`=!4l%paiQJo~FMj-;NQnX>xAqB?xx4S}hVFQ6Jc_mI69nna>30zA zi{-7 zvEQ7tnjc%bE^sgTp3UQkP(E>`NR>m`3~!q$vgH zJyH%9W?w?GGc(@sENq&|sUopTJ@=@xf;Zc>)Da2Si^|aaAr+RHh~qW!JJYyp{D>6u zxP_p|$Zylk!6`mkJhZ`)x#g&mq_>~PnEoe1_4mu2|J8iyzM>FRT z@?-f!s)HZvZ_ns)AEk|K>h6fvC5z?c(kkF`;mlmHMHiS|PghTV8;-{agS6j0gG?-K zl4Z5SX?f$o7~FUFxHJ^-H(xaya`z+xwXt07p#eW6vW^bEUfdoCbI$3M`^o|lm2J{h z_f*P3AyUUmx0P7C;j4mb6yq7pAWBFu^oip)8QWL>TOg%SaO?`Zc{*AM07Z7Yo;I@< zLZ--p&Uo|I-3^WhKh=+QOqKz{dKg}KWx+%00-w%~3+C;%|7H;biC)N5tU8TkIlkX` zSbI$f>>C&WeOXeE;eIF_z*RaCv)h-nrV{tNlU$6lsHOJBlK zOP8O#n5}|jZa@Af2qn}iqhiQQt8;(tmQ;KXI(!r322ex+1Byx&LFOe6s_f}0$==wk zpcDTkCniRTnjtMmN1dYo_f#6hlp^GaqCNCzAe6&j#;}wVi~cG26=XI03G2*!#Tv1nX5Qg^xgfAh^c;k3k5Ia8Vg`YIUn~ot(VCrf z=iVC+CJS8!e7j3fEHYPx6T>hy?Nc>bPlWs7CFn*N=%Zrox48edMk0VSVd~0Kfl{*Rr+-^)YLnlyl{v;YIg7=48{v2>c=&#iZ?5(DGL4cU1Y zkRQUUhj5PoOdnNOKiWPxAp1VcF>RU(yb$(HJ5PARZq;IJb(9%8M{kQ~8tFB*dD`E1 z#N9y3oJE*BJ~qv%21=c}=$V*}M2k2x=bQI4wm> z$B=%1o>9<0FXOkaX-JeTSeDcw-->t)I3sYDk?l?D(AGgyM*=U`dzdjl3V`+Vf>KhZ z>6B2~l~kfmgga;=9{2Lnz{H3s;|7yla*IymP(WDdR1z z_>!Ugn$jRn*L~lnpU{C$2j}bi9v0arN!9u_*8v#SNQ^@Z%4Fixll;izF|a-PwBr&f zG3n~HJQNtDzt_mxC)=LgT3e2OqI+|K-a~ zFFr$IjHcVu22qs94D5ZVGcjJZ=tV);wOr%k1qK#f5&CuWdkX3SYTxc-`xF>RNa+Hj zz&r@gipIso?d0f+Bj-Yf20w{UNZ?=|jIJR3nMREa(8#cxAs3bS-gnI$3`Q^KykYjl zT@WAsLWQJ9ZkL#|A)HtR*c=_5?4i%)YmSTTiqyU!0+vN1L;n%|GkJj7f^}*owR!W%({`iLvOT?EPZi2oUMjK#PAoKQ*M+_Hog67_uhez zaQkJUgA;@sze;58-XxFhO2Ay7);2Y06zfFG5CtfYwHJf8Fc$oYF>t&WK7l{ z6PYH!dnH^<^LP$~npTp$MGbu^y8wA`iceSP++lLkaABt>Eq{mIX!Mk%J`&70>^ zFL#RPT0-zyetxh@>aU!z(+6h)w(?T{LWUw>(3Hf!q8}-VUZXLm^6yg8Dc`WgEcKfh zhV=PABwNEY$F3U}V*@IqJ zB25Yn?y{v)|2=0M$rw&pIKc(XSs>xCr1Z@KMGUg~~MDhDqHsnjBV z0f_?;D8H~tBS3neTd}>(a5PeFnA?2}aJ#&6EwO_Pjf}92A2(Pu`dTJ4$~?aT(Zs;3 z!NNEOCOLvmWW{TEvJV<5;9O}3ssxCpcA&VY!bA{5pNI*`E7sqV%K4KMj9ExyBW0K? zlN8X5cta^92N%fFm3Vq~RwBn$)yU=xm7C`U@gxG`053^Jzt?FPYLSn>KFx(~LLHc_ zx5WC6?1@i_4S>rmc4WPS(3P(`*&*wI@sdx!3g6W+Ffh@*o-J5NqaIf9WF^!;$~JL+ zq!9p2ilgyN^~KvZ%LEj=j>y!_Yg-7%#P*WHgd%HYil~0M3N4t#>WqwxWW1R%+eV1n zaUwJ){XtD&uPubeqN6G2vW7x>hVQFatnG+q+NDHE25TBa6i_u;{I?d5B&e55`^N_c zg!EZc*Q|CfAR|er+@Cr!9I7*%s2*31pNmqFYw zV#so#GSnlA@W4@0DMcby!bdPoXExRTuEZljeWoSV?)PlOKI0cl zEH$J$G+G_qL6XPK4**1J+vb11Q$vlspc2P(RvICG+%Lo6XK zZ{bJE#WcEyd9wG^{g*VDn{??apQRV8vX7=*s9Ja_L~T@&5?&1(RoYLqm6198h7Akb zcc1}adC=1nlp$GR&*IuzW*mG7Xr-^;R#~d8yzwufxT0eIGugWX>2fe~{$U~h+hhP^ zw9@<3%pZmzmvW|UILc)CGj;B9m@8T@?d_lGRhlYLY7$!Lhso+Ll+tn>_r?G4}$ ziB~UaVLQUc2K|C*=17f1@;w6zM_NCxN)9YpBx2&MtNXR(Dp#vl9)(u1jS9dMPHTDP z_6p>U;<0CCN_^)%XH0-vZ8D-i5rqt4jQoRb8K&bN_K;>N2nu@s9Qn*y&i7SlI)+(3 z5Y&wNR@vh!P=B2Lw8m*w&3S?nz0ZmeK!%1YR?au@?8gc-n3^?13!~uQz)zo2j*ogx zsnE?Fi0pZ_J^;v^r2l!L3oA5Ux;o9{#GMwcp}^WhTw1lg(f7*U8z(O8?3(#W+;#vq;DmWPm3qC!L}OHXc46|k}+j)Q(C9Ge~pIBzA@rm61!=X+ntfSM1|+r1xx z2xU&Gw_i-zlRh@ObYQ7Ry0|>@CVC4ykg4DXdYPp>52{bXba#VALGzsVa66)2>XaV| zC5Vr|nJayYAL|hyf<1Rb%~&z8WgHx3@6}#@JDwZ}sEEM2>D7y_$l|!k*=?-0$ed>V z@fm?3!SBC^-H>Oz6gp<10OUtf+dO^Bkr+Wpt~-0xER8eWbX{L5dpfP1sVFDWI+r7z zm+KRfGhv(V{pjOJyi#{x~8ml{I^>Fw{#fA4H;A;Ln=&z^lcIX%^Sp`S)TMG?JDbyg({z>Rz#^c(@8O3gUh`R3~DzR?u;5NLuQ*Gei>L%h1!dY1dFxUF(n1;fM5 zjd5fCnX8_R5)`p=xlz@6rNQPQ@Y|LFGAF>ViuKgH{d>gNjQ$8J+<~td;S{xJc+Lqk zi!DBbb@$xk@my3hIH?&|yX}{=-G=qIm0(Q0<#)3eJ5^FLA!kVv#WWrK^vS>TX!%4^ zd2al@ltIn($6cl4B?iNaY{VwFt|q2wCEGUHy!>!yFr$YnqX5`izwPh zvAi8EEx{SDO}g*E2!3Eez-NXbV%yGE&#>LRzZ2iv*xRq0?@h``o|c<8A2{yk=zJE5AJy~1L9#CP!h&6r4K*ZgoUNu z7+g1CFGmQX=pHx{OZ)6Z#xd2^>*!zhaTQqjsw|CuTXT2UIyH}HK`b+}P5(yp{g6F( z8p#)zIwW^0ZLRRl#H?*>bcl+BeQcxa>gs7Kl(n?F?I$%wKh4ix?cL39ZfvGKZ<+0r zgp>9NBTs36muI4{`vKXQ5O1ijzyNTn_+0WLcl)gK-{!ijXNYOr@u_vTTf>(?IKJfP zP6rJtH|TJITmr2K`^$f|dPT%jp?Z1^62#NJ)S>%2%3jmMCNG+oIiX@Z&4;ZqXT$Wv zT)xA}=Ia2ran~V-u)DdJfAQ~6&WE6DQ3zfSTj?s}Dw51B>z3FOh$xwsjh4s!9mQKr zH+o{*lvz73hL#=QCE_C+fS*w8p(|l5g3+kln~wc|Ig9AN&_AbqVK>ad>a} zG_u^!@7Z^TQfp>5l)nLyFgn%NSMV{wpaEa%qIB~73eyT$6RzgMwNAsSc zj!x*+V`s!iX2(AldXzM$6&ei~PV3izVrTWV9$Bo<+HyAIfglo1v9(I zznKa;xr5v^H#5)L`3ge*oo1H)@_ne(jvB7aFZPDcIA84KtJ)=l(R3ZxA6NK`P&PQOXZ1`&=%LnJ@hfqD zEbry3&OXM5hHS(~>IxRt8MfbMLw!glC*Rap=^Rt}%(nmPxC!U!PUi=j&~L!_1b8DA zQ$t?jaRViD&YyRE8n3)hniTAq=Je}w-ScG?6vRIR3U<{FhvGQUfstNS%vz{ZK14Jr z7+@UEi&HgApWAu5&KE$F^(yyB#_w_e5cJKKibvIu??Y{7ajAX|Odtr8s}O4etZeB1 z;Oko84dD50Cwg;iV_f>BLd}4{ftqJ!I|)wr-hh-!GH^_s2*H9Hbv#67 z0Ga0!wsH>ExEtO?eO3luy<-3PSpNvO$*j)IR#y>U=G^YzD7i<<%yw(2K@FaNs)?Ke zK$G$#fvBqyehTnRW4oI!U|?WS`}2mKdP-jgmk#H9)t6dd-YrzWZi*Jl)4TWF6kC66 z_rUk_LqWClpL(vwow>j71|oUrb-4FFAvjlrr>00S^`wH@xj;Ti$Xw##^JTS zMPlZI!?639zhfg|amd%MU+zTg!E*2N71WZL!UZHC0xSrTcI-tHM~QBXt+BETJp zB29f`+)x2$x8T@Jx6Qkn3Mk4kN3hku1N^c0-1LcWGQ}D-jqTBRf?&>R?mH{dKNCb5 z1`4dVQ@{Rt64hag19#9_0tuemlqF?rl!_`+yS`d=(D16xod95H^-ezN?S8B#wKcb< zLdZrYKLNlUu(u^eopSGZZS-Ph%sE;GwTzi81$98D0?wSQr?UXC3#3q;N1>sx)_nQA zjAJdjc=L=JNOIF(+V9ixgjU?mk+U%gbN9z4hc`*ns~Ue76KhMVL! zJZLi_&5vtyD8ogV`} zzh%fpQ{Rf>*P0PN-#69(R9ZC)Oo+t{38S8G3PF6RZSkyHeR1A*Z0`Rletk8Q1xV#L zH?a@`z4=D9A>i-S*n#U$%p#;>ThdtCN=}5R_Nd66nFuYLsn)U6D0TR;r?_UZ5OjZ7 z^6lGCXP0CKmsItX0-Dz%DbtNpZvdnEY?pvfx~To+8?Cz>_?~tiiWmj_=BE_X;ZCQ7(5ca_KUM^V!X&tNzhEqnE2!fJ|ipj#P!UQ0##Y4^VD2 zIG65ffT?wg=k;}UIjO&|{}Jxp8q!#|)4JQ%GxC>4p^^wN=};xxHi#n9mIcVo^Ds^C z%uHmtd)MGthGS6SzQ>{b^?re$K=k3%ROHRyRcj8*%AU%x{SG+N9E5m3zO*FtJ9t;_ z&KY79ulHM&px&GXe{^9%Kqn=y_*>(=$AtB>#jFkE0MI+B*-Q(E<^!%kBr{nRKTt>u zMe7Vq7XX6O%#_q98&XUT28uol6jehT^MEQvNoKf}-+bp@d=>m!hYQBK+`Z`2xI@JpDEdQJ0oew#T587NXuS;tqn zVTql3#cOQ1TbGEEQ&+P%$EFg{J$vyoHBIIwCb5weG46TI{G3}i9i(CG3O5R#TK=JA zDsUg%@N#pSgQ5HD!@DPK_Yv(8_cwKPcjax#JdIA~EJ)~2bO*4%zdt#|veqH_s%(JJ zTz#5@Yzu_8?5Y%8c0AGR@{`|tPbJKGd%B3re z^>=TN?EE+9Np1S42x&2Ecg9Ku^=x3Qy&uw!=;)y3eqn51w=~oBO@r=%sK;mD{Irj- zj00>e;=Gw2y!@{qW77IM(Z6(gO8@)eLW<-?HdUwh`hZWsVFc;g%;|1yYOOJMbCB*Y znSF6ketP=K;lY{C`M=OiA;YEfos#UdQn5i5V7y#`sd<+kwR|+x5MaTh#N@&(Pv^_s}ti77e$3d>r6jx&dkz{6t zrs13Hh-i<`=LcdlaCx89Nu-S`m?>gq&M1+gN7 zSl~9FygaeBnT_|+gm(4ktT;O54KQZeSgf7YBZ!8v+kayr>lwh!j<)&4`QA)zbQ!5g zQ71_R`~d^_Y8k#1DZZ13MVyKQIeJtL^sO9a!P}NjPI;)G)`~f+ZxE&WNs!t7{r#z~XOboi@C5;voc+83{QNcljI5kFvr7-+XM5-jet+yWqsA3g{~v-->zO z0sVYy%O}tro2=*n2RwcHnlopsQz@`ziUDK9Smu!5ioatuv2f-KIL1KVl=Hv)d(=_n zBMxk-tg1q^T}^yNY1sGPYoAl1>r^rNU{tFl$=RJ9q&z)}Xk>Uei`u#c-eZC-N22TY zU%5B1!jv&Dz^L74y@dtJ@OTy0rGHn&RfT$3R1FKH*0Z6?WOLh?%-Hf|Dr@yb#*EvU25{r3BH$+FBzZ=UhFi?&dNNUc%AIo zRzD42lB5Ngs}{Zf$n|r4VuF8FQ}*{9Q?}8wXS8Uz2t=KK^&|;f5GDow@CMXDDF$(W zP2fre>@@hxx%MzlL)eVX%${33-{$WFyfwq(K9n)lU=(A2>TmK4Y(3%fC4>s}i3Wme z*Q0}mw{5}$AZ(MuB<(D8)kOdC0R$ymfV!`eYOh8|g+xKxtZ#CZN24^PnMx}v)5cfE zeLT9WgSL#xyo5o?8-T=T^yx8rD`9`vUR?BVe%;opyw$l9^6zVu^9Z;&8hi8aN|nq@ z8kEcl*ptQkLc?4jBqG-p{>Z?~mVhM{?^o=6+imHPU{E`URna0Pkc)L`ivu8&I4qR- zbn^E&AOF7lgX*QjfA~)T$K9!_UQt}Ez!EAoFHMWCV*!X>*|fCaMv^H67Ta*psFlCe1S?Im z*zpcUen??bhFU}G)BcmMOq&} zefs@a2rt!xF%Dz4OQSCS;+y`jUm~2=w-GTZ95@FU(<)+wahe!fx$FyRhZTl+7QJat z0aW24dnNK{5wpYSqf1sL0dnaAb~nYnMc^lfDw(oiVQ(Ej|?Nw4@w-GmW-$|5d@7`Ui}fA6Z9`SVUZw zmR5?>0X|ZuP+k#@y7VR4&0Dr^2!#;wnNU2}2k#{#X2=20adQqUOG=&&zm;}*;B*n} z8WEWa5qhs?Y59&p&R4}FED%4u+jLdFJY2Dv6n#<|hF#;U5C_0N`DyM4rA|#ke8`RE z$}y=yvh>Y?1ZD4AWc^S2_*fj_)T19DQN++B$q!h#Z1*SDx+xsZ? zE$WyaWr4a5ID*@k13xaV9Ac4BzRCy!ghk3Dg@w_hR82VeIXE3a?on<{iKbA&t{s136TdI?>h9MO-3dJ!J{|Hkji9>}V#B9$ z3jdXurd9ZDX=;ia98csZRro|jvtuHHClXs9){(aJ@E9K2@;ek8nEu6O!5;SrGwUs%&=cz!Y&>$051e16DpC>EF>HB-#v&XP+BHT?6ov&?sE`< z#~sTrokj*;j>tJhM$ON+a%z@7C#VOQ=`uq=j{*50U$fhvLqi>4f2*ry6_sC0H{my8 z0eJrOSEPEbFo->?pv|ZWb+nRVF`J;81zMAx=e_#-GNJ;IcdLB?Ob>LFi7@P$oSo%* zJN6HAF!|@tn{HMnc9tYwf>om^FRqV!g&#gx3=9qwLwc24v355(>8q>`K?fm4(@PYD z8#sk`!BCgTk3~UpTQbg%|C(o0r%#TTz)@6Pal>8lq*dx(jvpWlI2FlW(|gLX0tF{F z=|v=V7ZqRQM_~oU2-n?~{{}Xq97a_*3F$Mh;CKI^Nu1A$?7&GznSnT2OHPrr4WJEf z6O-b4c;MHm)2653Gjgo1$*ANVgQJ%yr^dzz-XqEI+I59H&VpPx-3}U?*b85wb~>@( zJrfvHIvepR9AdR5V6S9A9U0m86lsssXHqB}&UhAk=f(wTz=Cs14NBj^sn6*j-|N1U zWuX>qV_&@5nB;f}CSQ@vUTM&p+#6qVrm^Ywm}}thyuaYmlk$Bd>gXykE*OttVl8CA z2%rWv^VF2<7=lqZ;ZVURNr)Oz`{NY5IW$y-kyk(76}PbZydgdaO=XrG=>NPGTW_fUkTVK2gai?XN^fJ^-hHC*z@+!_asIDZWzS_ z@6imIsj^YAToSeKo{O)W&kxubXd4pnQ;?3b?hs&94AepGlszu|L39Od;$J^jCsLuW zEhW`x0k{!TRkTZccRLRS2hFW7AGEPeK^$)?2ysOieiI!%vG29@rl|e(ay%ORXSDJbu;UhpZFf?aOGTpT!8RMClfXy_npOlg{2&5p7Mh2%YJ}0K= z(AailI+ADn>UBi_N%$wJ%i77ILKCU7PPlvgWRh(FxMw(`K6%}Tu(0NGVmZ40o889E z;m{LJ4=3|tW2DW-GZ!TJV?5O<3~!;xLf-*vwF?=-b5rs0@smWx*&!WkYm&ljBRLxC z(2!nm>5|}366=!i2VY|Sm8!FYtDoEdY5fl-PO?IwlyHR&21%cl$lr|ed|%tHYTjbx z#X$6?6dp!8wMI+GUPSU}J}PVu-zIiHL!)~TVtYN8oScm49p#>^Tu41%xJMTK*m@De zTBwBz*)vI$5SjJvwM3Nt4HDw<@NjwkWztiFawyXEd6|x$fj1;d6*nEd)oo5$YXn~e z?5vzs_VP~c_{r+7kaeerA441XT-@EoScZ-Ak3_emR_QnZ_H4qS7I zn9dF?)W?L)*HwJ2V!7s)(&SFHY7QF2KPVRW4jzm7)5J3?F)L5JwYw`qpglV?Q~2bj zy*C=AA48Y=wwU1<|FX2ALW!@F@B(hn`t$M%Q!?wa&kBx6DG<%Qfy`dMvvPd~wjj#U z*=PWp0K|?A5hWZxu)+b72RLjGkrmvM#nNLj7dWq2-=MfwexHDgZ@biVa-uM7&}YND z!B)(WXzJ_V0{)2{EZH!R0Rnhr@u5<=9#cn&hTk*N720G)9SveM)h9O8Gqm7T_~d#G zO~dfv3EpgL2*YP`azpRKI~>ud0_SDq20~CkAafv|kUTE74Odj&c8%3him*c}P8>gz zW7ICq8}~W=XWX2KZ_9Gef$&&2clU&Oi)tVk~;|i6RouE^L(89YgK~ zV0+^7x?ULzfz8JQxp6Klqtf zD$@sSlY}a!1A>vR?Ia-NKRcE+tT%4QX>0wstB&T=hB{5PaVJ;6-zY;V51( zXc_Yyn*muZOfm$I69N0KQeP--v|8OOf0g)BP$2XrA6?of55WNZP9ehQzRheBa~=tQ(ElS|5rX;WM?rog6Du!9@A`)j zhym_m1AdEp1@LQshGxX~|KQAF;H8UN@M^&e7`k~003+r$TOmM6*_tjCpdT;&4|@GJ z9N=~@)#%4oHH44#P#(Gz{~-gceRZwpDwslf%*Nfrh=QM{>HvS3R-}zH zc%ehUPP?L<+W$$ye^6xtAZK1SLBU7}{>S#+$m@K29mQ8uRU?~uP`tD)D|Y&V9s9}c zN7(PHfyMSz-QEAYyzD7JH%s&?9E&{}03Lv)2 zAkN0)#{+MW%tylZz%@8w72W7M2I$iwZ%l@XOzc}YU}2BC)t$0JKRf)md*|O>uL{Tt zb0&sDhcdIXh17lMxkotML|#L>yUMQPF`=wW;RWrd%xdafZTD;a8RD`5zkI@ifBGr` zh7P}!1(WBTU$c^h5s@HdkZF+5+HfYz`DfrW8lZjXJz4L9jMvF!ZB`al<+X&-CC8V6 zWCDce;o65udb7U%{#?=+YU|FWk?500vHSIFg#ElFKmId455Ze&t8_hq_m+^2!-eL_ zSpWQ8osjQMgUJK{PuWM0$fDoaR5dm2+3CSGKo&-%;{h5DAh1RPYZX331vm77rRH|I z>eOj4B1~O3kP}pOqw?juA5vIQkXaZw`NM53L;R$qB>U@0sY^Hih)DA0p2`>^A|mxdPB--X(Wge0#3MF6|7+S2!0MB32h-c2 z$VQn1f7!olcemGxd(9PMVYW|wBXESyBfsm@%%I2KzMV_C2^EY)3v6+e;BncFj5;W? zUR_y|`4fVLl0W~7asBE;q$YpgyMK1G_DlCruA`c9fu@`iF)t$eao8Xj=#tRg^z-6iO`n-oWaAakd(hRf&L1cFiqzCD4FZT}_86 zsr}by`?KzLL1UlgxB#C;3zp^mD#c|ONJ0pbu0iqzKOPO>|4(YXAfhQ%sKO=l#SI7B zrEKtp5a-q`Wmed!{#ffR98m4lgiVE70a8j>!3-5@k=54t?iUPCj8{yo_E@pVy6q?w zkwLI4oygsY(AL*L**2NJxruI?P+0j04$hiML=z1f=CE6-S4>bJ9*9yzgDaBbv^D)s*BrD zy6NS){GqF3_yHF_?B1gGek0E_kj%N5<`~xs2hfgxiQ#$s*~;%dlOFhO1OWe37VlmR zhW0yJSafKr>`s)so|wbd7Y37FJu@-_$H&Jj0g5Pmf37bdb-EVDQ@?1VScx!{d~$$I zZDG?0j(RTa>zQiK-IaFtELrWO*;#Y$u~Q-mM!`hcg4T}k6uE-^40N_Z*ABLyQW4C+ z!tyyqrBe*Ujt^cEs#k>rru8C_u9To5SW98}1&MpOY7rZs17Fyyyz*RZ56qMt_$bud zvMtsxok@sd?zl@a5g}NeI%zQ_@RZl@dxWMC;>W@T&FhBiLzn-eWr|cVA|> zXX7yUi}S1X(sjv5#hzC)9E`?eo4*KxFLUYq+GdeSa}n6;g`Mcl(stb QU&E@V>JybpC1m*j0e_^!(EtDd literal 0 HcmV?d00001 diff --git a/public/appicons/io.pilot.kinetic.png b/public/appicons/io.pilot.kinetic.png new file mode 100644 index 0000000000000000000000000000000000000000..98d9d39bb6c6b79d651501eedbe5ec5360c12b55 GIT binary patch literal 11775 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 literal 0 HcmV?d00001 diff --git a/public/appicons/io.pilot.upfile.png b/public/appicons/io.pilot.upfile.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0ea1bd10da70e9b4c575fdb7cdbcaa3adfd041 GIT binary patch literal 15599 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 literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.deadsimple-240.webp b/public/appicons/optimized/io.pilot.deadsimple-240.webp new file mode 100644 index 0000000000000000000000000000000000000000..a9b20825de218931c27b3054cfee7484e0b5b1ec GIT binary patch literal 8194 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 literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.deadsimple-96.webp b/public/appicons/optimized/io.pilot.deadsimple-96.webp new file mode 100644 index 0000000000000000000000000000000000000000..0b41428ad1f5882ce22ef4cf211f9ab0dc3d8728 GIT binary patch literal 2930 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 literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.kinetic-240.webp b/public/appicons/optimized/io.pilot.kinetic-240.webp new file mode 100644 index 0000000000000000000000000000000000000000..9291852732dd1a95ee41b5bdbeae587be6c4fa50 GIT binary patch literal 3000 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 literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.kinetic-96.webp b/public/appicons/optimized/io.pilot.kinetic-96.webp new file mode 100644 index 0000000000000000000000000000000000000000..eaa6d2cc2f4e5231f05643463c3b050d8781e718 GIT binary patch literal 1254 zcmVAslSE78Fe|@D6O4guAQ&YZ5^#Q?b1^QHA4x*cQMjWlHw5xl+a#MhLn1kq5x1r zb-ervH~hOgZ=eJK09H^qAP58i0FV~|odGIf0AK((a9~2MR4hfy`56}*^uPBXKW%d1Qq36#&z-0-0XM%5lJ4}Cr{88Y<w?_U8w$N#1OxBl7q@8AQ`5B40cj_G*EwM$4yz+&v~ z@7&p)Xjkg}azBp9Znd+@lQo&>D7~xb^>dA;Z#n0)r9)*fqnue?b^c$VWg-mU;w;B0 z5->=sRg>~NZ~y@Q{W+&2{WgdR@&$wb`TCWwRqvud>gDdR|H=F$KDOS7Q7z{=6NEN6 zyp*0FlTo66xWXITh+K0{!leyiFj@9?Z<|Ei)tv%#P5q-{gG5=$2#nW0sByY?p{zso zc%o7lWUHvh+O0p1V~jsW&Au^5?FST}zmci~d*rEq^VWm@hi#1<<`zR^#!%&YCN6VK z_1?Dy_A9H1naQgpB}t^8rhsO?peD?TEJ?8*bgiDp!}tCeh6Df=Zc3zgkB@I8M?({^ z>t|j~^P}`BTbIRl%sx4?_pt6{?*}h`uvfV^p-dhlZXgoy)$_mc|Ek5+gN6WhWe^;P z01eRW;Nz})Fyp`HYJ+SM|MQQ}IsJ{C0IaSYl$_>;LtS8i(M?I-)&?P<={>U?3)iLHb}!g92)iV;#tM*e7Xhwk z#LeZ)j$iaP|1%);*?;i5KjeeMzfbZ1odt2Nx9R;kNq@mxkWCoY$^1W(C*!wYH%23c zYaS%rL6FNWw4-4sl?T{52kayqBr1s4|Nnc-4(y{nm>#PXLdDrBSOWPQ8m;F?eG7`VH*ENcmCW@oQVo={a&B zN}3Q3o?Yn8+zX}^D(Pbd%OB)S@6*%q|M+Q=qxCtb_<6CprGM+SI-f2ws32Ppn|p{2 zaj6%UO)ZL|cz&ur94LF4(}6jkB+7ZoGkRjrrGpD#u2l2zAw+{!@t!~$#$Gp3FA`OW)Z*#LFcSGkAcjYLdJ?9d{8KYGgFX$0n34U78VqR^fO0XuIE Qfk|>*;^isJ$tVB-0FGE{^#A|> literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.rentahuman-240.webp b/public/appicons/optimized/io.pilot.rentahuman-240.webp new file mode 100644 index 0000000000000000000000000000000000000000..bb42353a167ae01dbcbcf76b5cd54e745eab5337 GIT binary patch literal 2918 zcmV-s3z_s%Nk&Fq3jhFDMM6+kP&gn`3jhExJpi2nD)0dC06sAoi$kIzp%H2v$RGm* zw6}1(SbF)T`3w2SKkk2) z_z3=C{a5{O_aE{<_RDB#m|Hq=~M8|~jy6i|%YC%SbX{ZHX~fDfSeEtOU% zTPmzjAOQaV?CAeN@m~M{00B@j!mFd|mtPEwcmnU{craDe-Nsj0+IxB#FN6un`_bP_ z_ia1zN-ny2#fJa>3`{PO)p6IPL_{z!b>n5cm6dUnOhNI@2f=N$xLwz_w2xj=m~FhD zl-%L8-6xW?BUUrmxZ6!{w>dm#hDtl5H4F9C{5uKjP_127{6E6TQGB~7|NYcVgakRF zn{54S1xT}!8uHmA;QkXbWF^?*Nb)MGzBj-OQGc!75tJO`bfmA~5|o=ob*apDJ-hOZ z_C{Vq^^k=0%Tp+jEz{cnnKn@|fzUkt_(MzFo;rNh*R}Qk<-NC6g+K@&4}~Tx@Xsbr z!x}1f>kt2fc>Wsw6T-#IaUwei!bcNT^gAmvt&mw?)hJH0 z%C@+<)D{XPB>~JdmMz)tOeg$-qwQIFUI~?7-ifqn6DWs82A5q=wO9+&U0~{p0prGB zMYX(k?9f?(Ms>GCK}RGhdWUh$PfA7~CS)`~B#q&8(IEv^Jn-z-23ApcBECuWn7ow|q%)pR?cm*2iK`x_~~WZl$f?FzcN?K3p&V$nQ^75*k3($=ORn7LQo;($&-!_HGWIYXT>D-~JMbm~6F= zrEHh81g`K+LQRq+4*=b~9Yn_K!OV$8BON9}T>_}cNp@6NkiyP;`Btk8r>Hh2jDOd136UfuDtQJ~*K>^fPE05G+v+3Nn zKi`1gmJha*SJT^cdtYgrpr=80Wj^tkFKL87{=TSg11k?cWhwb*GX}!{>Y3!iN-Jww z@N9{aIG755{Dj`ikxWw;9L%c5MT1TuEgr2tAIl7D7;21{;Tu>7*zu(FH%x0T{1Acm~+55ikN#VZbO1_4+ zS1z+nv|K+tc*V1JdtsH=eJ>iZ%=C`8Kb8KRr zJ89XbXjF7N4fAFxwt?!=9sDyx{@(nscxGC$jJ=~Do_@yTphb(d(f7J%o|UfNs zCADp+X~v~u=e=Q`%*5QDhz!mOsrw_;dcJ_gH2VJOX2R?7AGoJjo~F8H6lNl^oKu7b$5ZbAhDnCgmkZ;;DY z8Qzf`o}=7RI1-DeZynKbK%0O%lMnG$GHN4iJ%+#Mce{*saw5pb>d6O6WA$#j{x@H4 z;6B=(z4*aosYrMeqw=)b9v#-X+P;U;Z{cg)4Y5=~p4kN=M$_bsIhOQ;^25o84L3z_ zA(!aVrDI$&#!I}8jlrgMm_Yu(Qo?pn863WF$w&3UYpX5`_#ubpTu-kyMyNmrr63G1kwgKtb|F z6t>Oh-Z0?)x*FJN1rgRN4}qbdzR+;$?H%?J9ku`+WB)fjc@fxDUvyz6giF32bv<+H zW1}?69&mi7;99j}Z9P4IzMkX-Oc5U69kFd`#GbpMS!S+03%5J7oH8?Q^wFQG>Dr;Vi=m!2Qj$q)>as)`qgjNULblXMj zdWY@bHOUz|Ndzej&1UNL$LCKRA|Zi@G`t~>w&RKG2(sV!Bkj>LTcTfexXAZ~_4HMpW#&JI{6dbFKqfEVA61ZFqopy-$haZEW(ow%++oa$Uc9x?}CU+MH+plN(!MYI(+CHIIBpb)WwZCRr%s-;Hk3`?{SPLIR zE?3nh8}6*6+zFk*^iMYHZ*k z&@i?te}p)@6_RYTypO~((R}3lV6~;h+a$fwD4n8&!M5AMP68h)hBGA<>5U0^ykfP$ItQNb>6C?VngxsGaw;Vv>3ECsO?m%%jlTcjev z)yjznu3DPtXsq0+r@%mEA7fhb{O=#cQBcbZoW-G Qnl_>SrDvo-0000007Gob5dZ)H literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.rentahuman-96.webp b/public/appicons/optimized/io.pilot.rentahuman-96.webp new file mode 100644 index 0000000000000000000000000000000000000000..948773a63b7cbded1f023ed8e42451a085a736c6 GIT binary patch literal 1302 zcmV+x1?l=yNk&Ev1pok7MM6+kP&gn01polh8UUREDqsL$06sAoibJ9yp%KglfFJ_| zw18@(wa?Rct-dz=d+Z z{OkLV7&nW10DmF=nf~MZALFOe5AmPwe(8OgerNr!{uj6(@$cy0>3_QZ^#6$OpZf{y zjr#Ccf;s>1gBAR@>KIpbA@3tbL+kW;&`~ zjQCq2f8{}PG|V%q0IjY!eWOuB$Y4M$QJLKPSW({sq#q%PxV->5u|NR+{$W#SJ}ck> zkLL?czrG5|E9D6l3tt@n9cY|j!}Cc@zpt53u_c{Y)_LkHe3H)m4s(nP!LMD=EZp_Q zhqHY*8XUbtv}TGnrSIpLDRQD0I#5M!?gu!8>ltWSik9+AO9yWEJs7{hwd$DMWO(Rtk`++8NwuPBB*x(mjBuHJ9zIMHv!&Yk zh3K*HV*mda*O;mYBc{QsG4;w_6d&6lkWWVo*5CIq7;unV#OfW#XH78p-1z42o@YT2QhRP z7{6*Y8^~j9t%p(zq(N8|`vNlAGGaus^j1jUq^P=fpn2bSZ_;=br{Rhy z0YGxXWe^bca<3IBxKG`y1ARAluk4}knwY~Ha(AOF1? z5n)%Wd}xVArN^sVTgCS+gB^uWMpkROacJwL6|v+NVF2Mcc59)wl3`}a!;r1+N{m9@ zqf(6jcRYCe7&6M4C;14ztYXp@P(7$9^d!H3j*w^Y6N6BOHsc*faVNV}JH({tS~2xe zPYX?TK!a6YK%l)?9s*IfaeSeEPmPy0`80MI8TFn2*r*asx z&OuxUCVh|;lRn{f(T^>X#tzuu>?tUH*g)U-L{jQ;(4eKe9xY9o*bR@d3ZadGpX=bu z?kCdmO5q+FC2*{Hai#T0ey1FJZWWc|`>;r3Nt&`ogUi`Pihal0B#thr{pqF-%@j|# zFEZk8zA^;C4T8_3k&zAgdhgZd{z#rFHujW1h~M_4sZ?K-y|AO&or8|!iuM%$_rT{w zB#-ty;Y(>Xe3Baz<*x}PtW))prJWMD|6BLO($CS?jJ)yR54V-ldxWMP%86E*Pi`vD zm`_=O)^4^OBR3x%th@(Av4m`blO`b7AS9A`GU zvxqKZ*ahqP(dZPsUO8gaIG^yZvzt>za%a_r8!t(foOZoV?x}R^!assIH`WOm=prBH zs*Zeb%KWAfxp-wV5L*XT#P*%@GpKWB&Uf>9C?uwU#UUt7VP MejGI95C8xG0HOzwTmS$7 literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.upfile-240.webp b/public/appicons/optimized/io.pilot.upfile-240.webp new file mode 100644 index 0000000000000000000000000000000000000000..91f6ca32e7700cdac2d5ab28604bcacc9c12936d GIT binary patch literal 2528 zcmV<62_N=SNk&H42><|BMM6+kP&gpW2><{PGyt6eD)0dC06sAoi$o$Jp%IA0gdhV1 zw6}4hj!a0bh5*GtaZj&RPy0t`Ki2;uf0Xoz`w7aTBp(j?oA`h2AG80|xm(}`_}}s$ z@*kAH)PHKYSU&Pi1E*CEr^64Et$~u2S`euIZ0RH;*2VaF7{d|b&odk#h z4G=~gfKBM~XUXt_sKAoaylBc!LdDi*!UJ4I?$Iai_(^BBhG>q^G3V32oKMzIxa`~S z!%H-7RQYPJafj#THd%)mkRMWy1O@!(Yme(mCoceBDCeF4ymY6&V&@67yO~gxWvS8@yI5^E?DrzLb7S{(Ue{#@%{%fHoQlY4 zU^$_0lXs8)0zMebxO!deE5F`>uVlc+3bm#Mog-+p+oBCAZ-|m#Lo4|!vrWD7Mf2ro|t=8<&Fn!j80sQ0898s-vLszor~b?S#e zgbB#eJ7kPBQ|D^9BJI(Vot89DQcrFzYZHCk%%?}8yEJwDnk2TC?~xn{5@Ss{-dAyf zBw%P#t!JNw!)DLsEj(qJ;s=f~{z)`nSP-aOhx9W7pbAOtx2F{2o#*A?TCqMaeVE%Q zNk&X}6z*Q~$r%mQVE7%+FBdPtgMIPx7DFV8Rg+UU&I#9Wti%|E$cDj`YEfcEbl%|QE&&3FJ4$kT(X2`zuqSn&H(_YBi38Bx61L_+3)&I zwo)Jfz7N|}a2t*>3X&_v^@Khv>91n2uyYj2I=>x7=bo&UpMXxq8-EJvyW)TYxU5>4 zw>V`S{J;g^VM1ooDNps?Pn+X`rCCnC6gnGd#D$15z6At*iSoj`1n+190cJLKYWVsSj~inN&?pyWp9%@rVKt;H238P zE?8~L4!q#F*axMm1SP1*Q&qW}-JR%Y+M?*K(W%2<^9?9p0G-8*1QpUTf?R?7x4)J(x41xG5_N8mlu@LS2d zQ=gHvl)nwZONJw#A($cc8mJ$0$f$R`8wQ#PxQ+_x)_C@|5@vR|6RB1hNP)O2&1W-W*$=C;N z+qpt3qKV=~`KYOyU67}2%Rwj-En;oKdVWR{11WY2^Z){uVLQ$rjIuE4%g6%J0;in^ z)p#)S^$YTI)&DVl^hjrPnVi97g12N?B5r!+KZT8Fn3T`!dot3})P)C(@<`+|Bg}3_ zn3sD|o%m=+)9Tb#r%G`h zkZ>sKPyf6}v#t9IZKHPg9nV`ajs)WZ(N}btO}D4G9$JJVEbg`E27ToJ1|_98T3-f% zs1T;~L|6qs3;PdI>_=vMszjC?tq<>aQIfl@Od9Hr%RGNmp7bi5CBows2Gdm)P$Zq{ z=&E=NwjrT2Ul7j3y1upcm$0_{f(bk3_d|axN-+r8hI)K4{d&d|P_y5PUgx4L^*hN- zv8A3flSdMd1+d!F!2T#|veg^D$1kb}{k5|*6m$6Dkxsh0$*B|GFcOX6K6t%3ei%S_ z56kZ36ttT#h;>sZ-q&8s23=<}+iam_{h%xQ{73K&WeFy`Zexw%7K23p+KY??f34Io zyh@YVym??T&t9RM$8R4LJ3G7kXVVg!XETVmP3fSpma=FM`rG>G6jTVC0qJGI0kd+@ z1|4o?v_*)OtHKxnEWD?S`~H@t_XKA5n@!>whV5I*b+hnc^#Y?Txe`V@PJE;}%=}Ib zKc<#xcmWsg^3RmGkl1{;arYc*L;An&&r_)H(s9n9__J#gD5UN#o$=JdC0sw(9j2e< zpVdN=7K~R*_dl8j^^}tZyE7&YWQ=986ykbT15Q zJyS4ek*Q8+bt4?`m zqS5l)JK-w~&taXP~Z z=?uHDkT?3DzFg@4sJJ1XxaS0qCQkj60Q^a1Z_4*6^fKKdcSXJTGX5B#G5 literal 0 HcmV?d00001 diff --git a/public/appicons/optimized/io.pilot.upfile-96.webp b/public/appicons/optimized/io.pilot.upfile-96.webp new file mode 100644 index 0000000000000000000000000000000000000000..fbfb805380e8d0d5847cd60c9e7cfe8ac8520e8d GIT binary patch literal 1036 zcmV+n1oQh+Nk&El1ONb6MM6+kP&gp?0{{SU7XY0BDqsL$06sAmibJ9yAruMB^=vwOGl~C{W4#~f#elT^pceB=Q%G}5Ofc%%_ujB_fJHtPY|5x4!%3tCB&iTOk zRr~<>Ir~Tai}ov+8^pZo|G@Ni{-gVUo9~x@-T!R(1^!F@8~wlB2Y+wa4`wgcBF43o z15FnlLY^VF-wn=sh^H5pK(U4;TGgA9C9T1v^B(u7sgf{Uj#Hv$Yi)=p*i7#!I7rf( zt>mA(k2VMKdq|c7UHAY1{{76iZ3AcTz1nhswvbG#R}%t{EZ`CkdEff?`*r>6_3%V} z25Q&CkN0;0`t=d$C@HnO(aW~eYXFV&x`oug^`GKrLj9^pdGt5WTg%Y}IK@LZXNjbC z{t;IN6yieB`la;iXUH0O=Rd)`p!GxIIfn&j)`&GROUYgPRZfsAL%dk)*RLE^sfLvS zYx{-C*6|n{8YC;gPjkf`-?!{9iRsF*01NjIhP*9ViVI5Y--puHyd4GJDz|2P>+2Ra zUMc$1HGHmQem$U01IUXiWT3#mkO{}F*$QF(iGuQN?{4T5){s`VGTaD{#p{Ruv)s9z z5SSBe=b!~U^iaBS1maF;Md6$obXO{suK_{pe+{I>CzP~|*t1C*w52*d7cDKMrCRR> z$G4oU3{ZzIx_%ZwANRS!%6;iwIejvY-UczT9~ejmjFeN|d~lE9P`vpZClm4(|7Fb@k!|)|oY`v;aE#>iiHyP^q`i z*;ZZ9>qH^WKu)-Ec<3RX-ojC}rlq&Jz3qdIX(oEp!A<4DPRv2P$yu|XE!F-(7d8F;|e(=6XhPki9ovnbBkE}UNMHK>L0 zukgQh=F!pw(dcd2#?m^+T1a%e$D=u1>sP7p`TMDcwD3PEMQ~2hwr(1q)^FJQ`Dt@b zFUiFiKgE4PO6cGen)^R~TMF+BEB$&fDnL568HAS#nViZ4Pk#ob3F3Ba#=B%tp>Tao ze=2!FrGBLd#~O8hNY1VdU~@r|oT-1;UqiR08W6$OyBDWC+*AMU4C-Vf_&o9Ykt_c= z*pw7Aq9V_|FV|-&aXEpwDu{5nw#lu?&Y*2V4o#ZQ;I%!I#MrWzleEPGyyt}_x1lU? z*d_bWYxfQKU!3UNI+z9FtJ-!{X5Rnf)*8jwaI+gc+}Yb`+}yyw9e(j%3b33xIqu27 z@EeQGv(a%U3{!L-HDmA0NybJ7?706@Qo)m3d7rMA3h%GBjWpq=Bn;T7 GfB*o9pBifb literal 0 HcmV?d00001 diff --git a/scripts/gen-apps.mjs b/scripts/gen-apps.mjs index 55ce8a6f..91aaf0a6 100644 --- a/scripts/gen-apps.mjs +++ b/scripts/gen-apps.mjs @@ -31,6 +31,7 @@ const CATEGORIES = [ { id: 'infra', name: 'Infrastructure', blurb: 'Containers, microVMs, and deploys — the compute layer for agents.', hue: 30 }, { id: 'security', name: 'Security', blurb: 'Guardrails and firewalls for agents and their inputs.', hue: 5 }, { id: 'finance', name: 'Finance & Payments', blurb: 'Settle value on-overlay and read the markets.', hue: 155 }, + { id: 'work', name: 'Work & Research', blurb: 'Put real-world work in motion and get real answers back — human hands on a task, and pricing research with your own customers.', hue: 45 }, { id: 'comms', name: 'Communications', blurb: 'Give an agent its own phone number or email inbox — voice, SMS/iMessage, email, and threaded conversations.', hue: 315 }, ]; const CAT_HUE = Object.fromEntries(CATEGORIES.map((c) => [c.id, c.hue])); @@ -43,6 +44,9 @@ const CATMAP = { 'io.pilot.aegis': 'security', 'io.pilot.didit': 'security', 'io.pilot.slipstream': 'finance', 'io.pilot.wallet': 'finance', 'io.pilot.agentphone': 'comms', 'io.pilot.primitive': 'comms', + 'io.pilot.deadsimple': 'comms', 'io.pilot.dial': 'comms', + 'io.pilot.upfile': 'infra', + 'io.pilot.kinetic': 'work', 'io.pilot.rentahuman': 'work', }; // ---------- icons: brand mark (Simple Icons), line glyph (Lucide), or real logo image ---------- @@ -69,6 +73,11 @@ const ICON_MAP = { 'io.pilot.orthogonal': { image: 'png', fit: 'cover', bg: '#e3e6df' }, 'io.pilot.agentphone': { image: 'png', fit: 'contain', bg: '#26B65A' }, 'io.pilot.primitive': { image: 'png', fit: 'cover', bg: '#111110' }, + 'io.pilot.dial': { image: 'png', fit: 'cover', bg: '#2b2b28' }, + 'io.pilot.deadsimple': { image: 'png', fit: 'contain', bg: '#ffffff' }, + 'io.pilot.kinetic': { image: 'png', fit: 'cover', bg: '#1b3329' }, + 'io.pilot.rentahuman': { image: 'png', fit: 'cover', bg: '#f2f0eb' }, + 'io.pilot.upfile': { image: 'png', fit: 'cover', bg: '#1c2023' }, }; function relLum(hex) { @@ -94,6 +103,7 @@ function iconFor(id, hue) { // ---------- presentation config ---------- const APP_IDS = [ + 'io.pilot.dial', 'io.pilot.deadsimple', 'io.pilot.kinetic', 'io.pilot.rentahuman', 'io.pilot.upfile', 'io.pilot.primitive', 'io.pilot.agentphone', 'io.pilot.postgres', 'io.pilot.duckdb', 'io.pilot.sqlite', 'io.pilot.mysql', 'io.pilot.redis', 'io.pilot.sixtyfour', 'io.pilot.cosift', 'io.telepat.ideon-free', 'io.pilot.plainweb', 'io.pilot.otto', diff --git a/src/data/app-demos.json b/src/data/app-demos.json index 057f1554..7f421b80 100644 --- a/src/data/app-demos.json +++ b/src/data/app-demos.json @@ -1030,5 +1030,279 @@ "next": [ "io.telepat.ideon-free ideon-free.help '{}'" ] + }, + "io.pilot.deadsimple": { + "skill": "io.pilot.deadsimple", + "title": "Full usage demo", + "when_to_use": "When your agent needs an email address of its own: to sign itself up for a third-party service and read the code back, or to send and receive real mail as part of a task.", + "metered": false, + "quickstart": { + "goal": "Get an account, an API key and a live inbox in one call", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.signup '{\"label\":\"my-agent\"}'", + "expect": "{\"data\":{\"account_id\":\"...\",\"api_key\":\"dse_...\",\"inbox\":{\"inbox_id\":\"...\",\"email\":\"...@box1.deadsimple.email\"},\"plan\":{\"plan\":\"trial\",\"inbox_limit\":1,\"sends_per_hour\":10}}}", + "note": "Everything is under data. Save data.api_key as DEADSIMPLE_API_KEY — it is shown once. Already have a key? Skip this and call create_inbox." + }, + "examples": [ + { + "title": "Sign up for a third-party service and read the code back", + "goal": "The whole point: clear an email verification without a human", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.get_verification_code '{\"inbox_id\":\"\",\"since\":\"2026-08-06T12:00:00Z\",\"from_contains\":\"stripe.com\"}'", + "expect": "{\"data\":{\"found\":true,\"code\":\"481920\",\"magic_link\":null,\"message_id\":\"...\"}}", + "note": "Note the time BEFORE submitting your address, pass it as `since`, then poll every 2-3s. found=false just means it has not landed yet. Never parse the raw email yourself." + }, + { + "title": "Send a real email", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.send_email '{\"inbox_id\":\"\",\"to\":\"someone@example.com\",\"subject\":\"Report ready\",\"text_body\":\"The run finished.\"}'", + "expect": "{\"data\":{\"message_id\":\"...\",\"status\":\"queued\"}}", + "note": "DKIM-signed egress, not a sandbox. Trial caps this at 10/hour, 25/day." + }, + { + "title": "Read a conversation before replying", + "goal": "Get the whole thread, then reply on it with threading handled for you", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.get_thread '{\"inbox_id\":\"\",\"thread_id\":\"\"}'", + "expect": "{\"data\":{\"thread_id\":\"...\",\"messages\":[{\"message_id\":\"...\",\"from\":\"...\",\"subject\":\"...\"}]}}", + "note": "Then reply with the message_id; threading headers are set for you." + } + ], + "gotchas": [ + "Every response is wrapped: the payload is under data, with meta.request_id beside it.", + "Call signup only when you have no key. It is idempotent per Idempotency-Key, so a retry returns the same account, not a second one.", + "Trial is 1 inbox, 10 sends/hour, 25/day. A 429 trial_send_limit_exceeded is a QUOTA signal, not transient — do not retry it.", + "Lift the caps with claim then claim_verify. Your key, inboxes and history survive.", + "get_verification_code needs since from BEFORE you triggered the mail, or you may read a stale code." + ], + "next": [ + "io.pilot.deadsimple deadsimple.help '{}'" + ] + }, + "io.pilot.rentahuman": { + "skill": "io.pilot.rentahuman", + "title": "Full usage demo", + "when_to_use": "When a task needs hands in the physical world — a clean, a pickup, an errand, an on-site check — and your agent needs a real person to do it and report back.", + "metered": false, + "quickstart": { + "goal": "Ask for a human to do something, in plain language", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.create_request '{\"task\":\"Deep clean a 2-bedroom apartment\",\"externalChatId\":\"thread-9f2a41c7\",\"requesterPhoneNumber\":\"+14155550100\",\"budgetUsd\":150,\"location\":\"Mission District, San Francisco, CA\"}'", + "expect": "{\"success\":true,\"requestId\":\"8FQxJ0N2VvR5aYc31TZk\",\"status\":\"received\",\"request\":{...}}", + "note": "A human ops coordinator picks this up and sources a vetted person. Keep the requestId — everything else hangs off it." + }, + "examples": [ + { + "title": "Poll the request and read the thread", + "goal": "status is the branch point, not success", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.get_request '{\"requestId\":\"8FQxJ0N2VvR5aYc31TZk\"}'", + "expect": "{\"success\":true,\"request\":{\"status\":\"quoted\",\"paymentLinks\":[{\"url\":\"https://...\"}]}}", + "note": "received -> needs_info -> quoted -> scheduled -> in_progress -> completed. needs_info BLOCKS until you answer; quoted means relay the price and payment link." + }, + { + "title": "Answer an ops question", + "goal": "Unblock a needs_info request by relaying your customer's answer", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.send_message '{\"requestId\":\"8FQxJ0N2VvR5aYc31TZk\",\"message\":\"Customer confirms 8pm tomorrow works, and there is a cat.\"}'", + "expect": "{\"success\":true,\"messageId\":\"3NcVb8sDf1gHj6kQw0Pz\"}", + "note": "This goes to the ops coordinator, not to your customer. Nothing you send here reaches them." + }, + { + "title": "See everything in flight", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.list_requests '{\"limit\":20}'", + "expect": "{\"success\":true,\"requests\":[{\"requestId\":\"...\",\"status\":\"quoted\"}],\"nextCursor\":null}", + "note": "Newest first, cursor-paginated. No server-side status filter — read status per item." + } + ], + "gotchas": [ + "Nothing reaches your customer unless YOU send it. Ops replies, quotes and payment links are all addressed to your agent.", + "Branch on status, not success. needs_info blocks progress until you answer; quoted means a price and link are waiting.", + "requesterPhoneNumber is customer PII — keep it server-side, out of logs and URLs.", + "task and details are moderated. A 400 means rewrite, not retry.", + "budgetUsd is before fees (1-100000). Always pass dueBy if the customer gave a deadline." + ], + "next": [ + "io.pilot.rentahuman rentahuman.help '{}'" + ] + }, + "io.pilot.upfile": { + "skill": "io.pilot.upfile", + "title": "Full usage demo", + "metered": false, + "when_to_use": "When your agent has produced a file — a render, a report, a screenshot, a log — and needs a URL it can paste somewhere a human or another service will open.", + "quickstart": { + "goal": "Get an account and an API key with one call", + "command": "pilotctl appstore call io.pilot.upfile upfile.signup '{\"email\":\"you@example.com\"}'", + "expect": "Account created. API key: upf_... Tier: free (1GB). Key saved.", + "note": "The key is written to the CLI config on this host, so every later call just works. No dashboard, no browser." + }, + "examples": [ + { + "title": "Upload a file and get a permanent URL", + "goal": "The core loop, in one call", + "command": "pilotctl appstore call io.pilot.upfile upfile.upload '{\"path\":\"/tmp/report.pdf\"}'", + "expect": "{\"id\":\"tRbBqIyEiB\",\"url\":\"https://cdn.upfile.sh/tRbBqIyEiB.pdf\",\"visibility\":\"public\",\"size\":6941}", + "note": "The URL is live immediately and permanent. Always JSON, so read .url straight out of it." + }, + { + "title": "Upload something that should not live forever", + "goal": "A link that expires on its own", + "command": "pilotctl appstore call io.pilot.upfile upfile.upload_expiring '{\"path\":\"/tmp/build.log\",\"expiry\":3600}'", + "expect": "{\"id\":\"...\",\"url\":\"https://cdn.upfile.sh/....log\",\"expires_at\":\"2026-08-06T17:00:00.000Z\"}", + "note": "expiry is seconds. Use it for anything you would not want indexed a year from now." + }, + { + "title": "Check what you have stored", + "command": "pilotctl appstore call io.pilot.upfile upfile.status '{}'", + "expect": "Tier: free Storage: 0.01GB / 1GB", + "note": "Free tier is 1GB. upfile.list shows individual files; upfile.remove deletes one by id." + } + ], + "gotchas": [ + "Run upfile.signup once per host if there is no key. Everything else fails with No API key until you do.", + "Read .url from the JSON — the human-readable output is not stable.", + "A plain upload is a permanent, unauthenticated URL. Use upload_private or upload_expiring for anything sensitive.", + "expiry is in SECONDS, not minutes. 3600 is an hour.", + "Free tier is 1GB total, not per file. Use upfile.remove to reclaim space." + ], + "next": [ + "io.pilot.upfile upfile.help '{}'" + ] + }, + "io.pilot.kinetic": { + "skill": "io.pilot.kinetic", + "title": "Full usage demo", + "metered": true, + "when_to_use": "When you need to know what to charge and want it grounded in your own customers' answers: a price range, a specific price point, or which features carry the value.", + "quickstart": { + "goal": "Find out which study answers your question", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.method_recommend '{\"decision\":\"What should we charge for our Pro tier?\"}'", + "expect": "{\"study_type\":\"van_westendorp\",\"reason\":\"You need a price RANGE, not specific points.\"}", + "note": "Free. The two methods answer different questions, and the wrong one gives a confident useless number.", + "cost": "$0.00 (read)" + }, + "examples": [ + { + "title": "Draft a study and preview it", + "goal": "Everything up to launch is free", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.study_create '{\"Idempotency-Key\":\"\",\"name\":\"Pro tier\",\"product_desc\":\"SaaS analytics for small teams\",\"segment_desc\":\"Founders at 5-50 person startups\",\"decision_type\":\"first_time\",\"currency\":\"USD\"}'", + "expect": "{\"id\":\"3572c965-...\",\"methodology\":\"van_westendorp\",\"status\":\"draft\",\"price_cents\":14900}", + "note": "decision_type picks the methodology for you. Every mutating call needs an Idempotency-Key.", + "cost": "$0.00 (draft, free)" + }, + { + "title": "Check the price before spending", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.offer_list '{}'", + "expect": "{\"offers\":[{\"study_type\":\"van_westendorp\",\"price_cents\":14900}]}", + "note": "Launching costs $149-$199, far above the $5 budget, so a human pays on Stripe.", + "cost": "$0.00 (read)" + }, + { + "title": "Read computed results, not guesses", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.results_get '{\"id\":\"stu_abc123\"}'", + "expect": "{\"optimal_price_point\":42,\"acceptable_range\":{\"low\":34,\"high\":58},\"n\":31}", + "note": "Call study_quality_get first: speeders make a clean number worthless.", + "cost": "$0.00 (read)" + } + ], + "cost": { + "unit": "micro-USD (1000000 = $1.00)", + "free_budget": "$5.00 per Pilot user", + "hard_cap_usd": 5.0, + "operations": [ + { + "op": "all research methods", + "price": "free", + "note": "discovery, drafting, preview, progress, quality, results, evidence, narrative, export and teardowns cost nothing against the Pilot budget" + }, + { + "op": "kinetic.study_checkout_create", + "price": "free", + "note": "returns a Stripe link; the $149-$199 charge happens on Stripe and is paid by the human who opens it, not from your Pilot budget" + } + ], + "worked_total": "$0.00 against the Pilot budget. The research loop is free; the study fee is paid by a human on Stripe." + }, + "gotchas": [ + "Everything except launching is free. The $149-$199 fee is paid by a human on Stripe, not your budget.", + "Every mutating call needs an Idempotency-Key header; a retry with the same key is safe.", + "study_checkout_create returns a link and does NOT pay. Hand the URL to your human and stop.", + "Preview before launch — once live, questions are fixed.", + "You supply the respondents; Kinetic has no panel.", + "Check study_quality_get and progress before trusting a result." + ], + "next": [ + "io.pilot.kinetic kinetic.balance '{}'", + "io.pilot.kinetic kinetic.help '{}'" + ] + }, + "io.pilot.dial": { + "skill": "io.pilot.dial", + "title": "Full usage demo", + "metered": true, + "when_to_use": "When a task needs a phone: call a business and sit through the hold queue, text someone and wait for the reply, or receive a 2FA code on a real US number.", + "quickstart": { + "goal": "See your credit and the limits in force before spending anything", + "command": "pilotctl appstore call io.pilot.dial dial.status '{}'", + "expect": "{\"credit\":\"$5.00\",\"plan\":\"free\",\"maxCallDurationSeconds\":300,\"maxConcurrentCalls\":2}", + "cost": "$0.00 (read)", + "note": "Free. A new account starts with $5 and no card. No key yet? dial.signup emails a code and dial.verify exchanges it for one." + }, + "examples": [ + { + "title": "Get a number, then text someone", + "goal": "A number is the prerequisite for everything else", + "command": "pilotctl appstore call io.pilot.dial dial.buy_number '{\"areaCode\":\"415\",\"explicitProgrammaticConsent\":\"yes\"}'", + "expect": "{\"id\":\"num_...\",\"phoneNumber\":\"+14155550123\"}", + "cost": "$3.00/month", + "note": "Spends money, so it requires an explicit consent attestation — confirm with your human first. Then dial.send_message delivers over iMessage when the recipient supports it, else SMS." + }, + { + "title": "Place a call and let it wait out the IVR", + "goal": "The thing an agent genuinely cannot do itself", + "command": "pilotctl appstore call io.pilot.dial dial.place_call '{\"to\":\"+14155550199\",\"fromNumber\":\"+14155550123\",\"outboundInstruction\":\"Ask if they take reservations for 4 at 8pm Friday\",\"transferTo\":\"+14155550100\"}'", + "expect": "{\"id\":\"call_...\",\"status\":\"queued\"}", + "cost": "$0.22/min", + "note": "transferTo hands the live call to your human the moment a real person answers — never to a recording. Poll dial.get_call for the transcript." + }, + { + "title": "Block until the reply arrives, instead of polling", + "command": "pilotctl appstore call io.pilot.dial dial.wait_for_event '{\"eventType\":\"message.received\",\"timeout\":120}'", + "expect": "{\"event\":\"message.received\",\"message\":{\"body\":\"Your code is 481920\"}}", + "cost": "$0.00 (read)", + "note": "A 408 means try again, not an error. This is how you catch a 2FA code without spinning." + } + ], + "cost": { + "unit": "USD", + "free_budget": "$5.00 signup credit, no card", + "hard_cap_usd": 5.0, + "operations": [ + { + "op": "reads (status, usage, list_*, get_call, wait_for_event)", + "price": "free" + }, + { + "op": "dial.buy_number", + "price": "$3.00/month", + "note": "requires an explicit consent attestation" + }, + { + "op": "dial.send_message", + "price": "$0.02 per SMS segment", + "note": "iMessage delivery where supported" + }, + { + "op": "dial.place_call", + "price": "$0.22/min", + "note": "$0.13/min self-hosted if you bring your own LLM" + } + ], + "worked_total": "$3.44 — one number for a month ($3.00), one 2-minute call ($0.44), reads free. Inside the $5 signup credit." + }, + "gotchas": [ + "Reads are free; buying a number, texting and calling cost money. Check dial.status first.", + "dial.buy_number needs an explicit consent attestation because it spends — confirm with your human.", + "A new account is capped at 5-minute calls and 2 concurrent until the first top-up.", + "Always pass numbers in E.164, e.g. +14155551234. Emergency and crisis numbers are blocked.", + "Prefer dial.wait_for_event over polling; a 408 means retry, not failure." + ], + "next": [ + "io.pilot.dial dial.help '{}'" + ] } } diff --git a/src/data/app-methods.json b/src/data/app-methods.json index 831314b5..326447b3 100644 --- a/src/data/app-methods.json +++ b/src/data/app-methods.json @@ -1810,5 +1810,339 @@ "name": "tldr.version", "summary": "Print the delivered client and tldr-client-spec version, e.g. \"tlrc v1.13.1 (implementing the tldr client specification v2.3)\". Needs no cache. This is `tldr --version`." } + ], + "io.pilot.deadsimple": [ + { + "name": "deadsimple.signup", + "summary": "START HERE if you have no key. Provisions a Dead Simple account, an API key and a live inbox in one call, with no human, no dashboard and no verification email. Returns {account_id, api_key, inbox}. Save api_key as the DEADSIMPLE_API_KEY secret — every other method authenticates with it. Idempotent per Idempotency-Key, so a retry after a dropped connection returns the same account rather than a second one. The account starts on the trial tier: 1 inbox, 10 sends an hour, 25 a day." + }, + { + "name": "deadsimple.claim", + "summary": "Start lifting the trial caps by attaching an email address a human controls. Sends a 6-digit code to that address; pass it to deadsimple.claim_verify to finish. Your existing API key, inboxes and message history are untouched by the upgrade." + }, + { + "name": "deadsimple.claim_verify", + "summary": "Confirm the code from deadsimple.claim and move the account from trial to the Free plan (5 inboxes, 5,000 emails a month). The same API key keeps working." + }, + { + "name": "deadsimple.create_inbox", + "summary": "Create a real, deliverable email inbox in one call. Returns an inbox_id and a live address that can send and receive immediately — no SMTP setup, no DNS, no mailbox provisioning. Use this when you already have a key and want an additional identity." + }, + { + "name": "deadsimple.list_inboxes", + "summary": "List the inboxes this key can see, newest first. Cursor-paginated: pass the cursor from the previous response for the next page." + }, + { + "name": "deadsimple.get_inbox", + "summary": "Fetch one inbox: its address, display name, tags, status, and counters." + }, + { + "name": "deadsimple.delete_inbox", + "summary": "Permanently delete an inbox and its stored messages. IRREVERSIBLE. Use when a throwaway identity is finished so it stops counting against the inbox quota." + }, + { + "name": "deadsimple.send_email", + "summary": "Send an email from one of your inboxes. Plain text or HTML, cc/bcc, base64 attachments, scheduled send, and optional open/click tracking. Real DKIM-signed egress, not a test harness. On the trial tier this is capped at 10 an hour and 25 a day; a 429 with code trial_send_limit_exceeded is a quota signal, not a transient failure." + }, + { + "name": "deadsimple.get_verification_code", + "summary": "THE method agents reach for. Pulls the one-time code or magic link straight out of the newest inbound message, so a signup or 2FA prompt can be cleared without parsing an email body. Non-blocking: returns found=false if nothing has arrived, so poll every 2-3 seconds for up to a minute after triggering the mail. Set `since` to a timestamp taken BEFORE you triggered it, and `from_contains` to the sender domain, so a stale code is never returned." + }, + { + "name": "deadsimple.list_messages", + "summary": "List messages in an inbox, newest first, with sender, subject, snippet, and labels. Spam is excluded unless include_spam is true. Cursor-paginated." + }, + { + "name": "deadsimple.get_message", + "summary": "Get one message in full: headers, plain-text and HTML bodies, and attachment metadata." + }, + { + "name": "deadsimple.reply", + "summary": "Reply to the sender of a message. Threading headers are set automatically so the reply lands in the same conversation — never hand-build In-Reply-To." + }, + { + "name": "deadsimple.reply_all", + "summary": "Reply to the sender and every other recipient of a message, with threading headers set automatically." + }, + { + "name": "deadsimple.forward", + "summary": "Forward a message, with its attachments, to new recipients." + }, + { + "name": "deadsimple.list_threads", + "summary": "List conversation threads in an inbox, each with its latest message, so an agent can track ongoing exchanges instead of loose messages." + }, + { + "name": "deadsimple.get_thread", + "summary": "Get a full conversation thread with every message in order — the context an agent needs before replying." + }, + { + "name": "deadsimple.get_attachment", + "summary": "Get a time-limited signed download URL for an attachment. The link expires in one hour." + }, + { + "name": "deadsimple.list_all_messages", + "summary": "List messages across every inbox this key can see, newest first. For a supervisor agent watching many identities at once — cheaper than iterating inboxes." + }, + { + "name": "deadsimple.create_webhook", + "summary": "Register an HMAC-SHA256 signed webhook for inbound mail, bounces, and complaints, so long-running work does not have to poll list_messages in a loop. Deliveries retry on exponential backoff and every attempt is logged." + } + ], + "io.pilot.rentahuman": [ + { + "name": "rentahuman.create_request", + "summary": "START HERE. Ask for a human to do something in the physical world, in plain language. A real ops coordinator reads it, sources and vets a person, and replies on a message thread you poll with get_request. Returns {requestId, status:\"received\", request}. Keep the requestId — every other method hangs off it. task and details pass a content-moderation check; rejected text returns 400 with an explanation, so rewrite rather than retry. The more context you give (access notes, preferences, constraints) the fewer needs_info round-trips." + }, + { + "name": "rentahuman.get_request", + "summary": "Read one request: its current status and the full message thread with the ops coordinator. THIS IS THE POLL TARGET after create_request. Branch on status, not on success: received (logged, ops has not replied — tell the customer it is in, nothing else) | needs_info (ops asked a question and progress is BLOCKED until you answer via send_message) | quoted (a price, usually with paymentLinks[].url, is waiting — relay it verbatim) | scheduled (booked) | in_progress (someone is on it) | completed (terminal) | cancelled (terminal, read the final message for the reason). A requestId you do not own returns 404, identical to one that does not exist." + }, + { + "name": "rentahuman.send_message", + "summary": "Send a follow-up message to the ops coordinator on a request — answer their question, or relay your customer's decision. This is the way out of a needs_info status. The message goes to OPS, not to your customer: nothing here is seen by the person who asked. Max 5,000 characters, moderated." + }, + { + "name": "rentahuman.list_requests", + "summary": "List your requests, newest first, so an agent can see everything in flight at once. Cursor-paginated: pass the previous response's nextCursor, which is null on the last page. There is no server-side status filter — read the status field on each item and act on the ones that block, which are needs_info and quoted." + }, + { + "name": "rentahuman.list_bounties", + "summary": "List open marketplace bounties, each with a tracked referral URL, for agents that want to surface paid real-world work rather than commission it. Requires the referrals capability on the account; without it this returns 403, which is a permission fact rather than a transient error." + } + ], + "io.pilot.upfile": [ + { + "name": "upfile.signup", + "summary": "START HERE if this host has no API key. Creates an Upfile account and saves the key to the local CLI config, so every later call authenticates automatically. No browser, no dashboard, no verification step. The account starts on the free tier: 1GB of storage. Everything else fails with No API key until this has been run." + }, + { + "name": "upfile.upload", + "summary": "Upload a file from this host and get back a permanent, immediately-live URL. Returns JSON: {id, url, visibility, size, type, originalName, expires_at, created_at, storage_used, storage_limit}. Read .url. Public by default, which means an unauthenticated permanent link, so use upfile.upload_private or upfile.upload_expiring for anything you would not want to stay reachable." + }, + { + "name": "upfile.upload_private", + "summary": "Upload a file as private, so the returned URL requires authentication rather than being open to anyone holding the link. Same JSON shape as upfile.upload, with visibility private." + }, + { + "name": "upfile.upload_expiring", + "summary": "Upload a file with a time-to-live, so the link stops working on its own. Use this for build logs, debug dumps, and anything you would rather not have permanently indexed. Same JSON shape as upfile.upload, with expires_at set." + }, + { + "name": "upfile.status", + "summary": "Show the account tier and how much of the storage quota is used, e.g. Tier: free Storage: 0.01GB / 1GB. Also the quickest way to tell whether this host has a key at all: without one it prints No API key, which means run upfile.signup first." + }, + { + "name": "upfile.list", + "summary": "List the files stored on this account as JSON, newest first, with each file's id and URL. The ids are what upfile.remove takes." + }, + { + "name": "upfile.remove", + "summary": "Delete one stored file by its id, reclaiming its space against the quota. IRREVERSIBLE: the URL stops resolving immediately." + }, + { + "name": "upfile.version", + "summary": "Print the Upfile CLI version bundled with this app." + }, + { + "name": "upfile.cli_help", + "summary": "The Upfile CLI's own full help text, listing every subcommand and flag including any not curated as a named method here." + }, + { + "name": "upfile.run", + "summary": "Escape hatch: run the Upfile CLI with an arbitrary argv array, for anything the named methods do not cover such as config set/get, upgrade, or stdin uploads. Payload is {args:[...]}. Prefer the named methods when one fits, because they return JSON." + } + ], + "io.pilot.kinetic": [ + { + "name": "kinetic.method_list", + "summary": "List the pricing-research methods available, with each one's server-owned launch price in cents, methodology version, and sample-size guidance. Van Westendorp finds an acceptable price RANGE, Gabor-Granger tests exact price POINTS, MaxDiff ranks feature value, choice-based conjoint models trade-offs. Free, and the right first call when you do not yet know which study to run." + }, + { + "name": "kinetic.method_recommend", + "summary": "Describe the pricing decision in plain language and get back the method that fits it, with reasoning. Free. Use this instead of guessing between Van Westendorp and Gabor-Granger: they answer different questions, and the wrong one produces a confident, useless number." + }, + { + "name": "kinetic.study_create", + "summary": "START HERE once you know the decision. Creates a draft study. You do NOT pick the method: Kinetic derives the methodology from decision_type (first_time and new_tier map to Van Westendorp today) and returns it on the study along with price_cents. Free — a draft costs nothing and is not launched. Returns {id, methodology, status:\"draft\", price_cents}." + }, + { + "name": "kinetic.study_prefill", + "summary": "Generate a draft study filled in from a description of your product and audience, so you edit a sensible starting point rather than an empty form. Free." + }, + { + "name": "kinetic.study_get", + "summary": "Read one study: its configuration, state, and position in the lifecycle. Free." + }, + { + "name": "kinetic.study_list", + "summary": "List your studies with their states. Free." + }, + { + "name": "kinetic.study_update", + "summary": "Edit a draft study: name, prices, features, audience and question configuration. Only the fields you send change. Free, and only valid before launch." + }, + { + "name": "kinetic.study_duplicate", + "summary": "Copy an existing study into a new draft, to run the same design against a different audience or set of prices. Free." + }, + { + "name": "kinetic.survey_regenerate", + "summary": "Regenerate the respondent-facing survey from the study's current configuration after editing it. Free." + }, + { + "name": "kinetic.survey_preview", + "summary": "Read the survey exactly as a respondent will see it, WITHOUT storing any respondent evidence. Free. Always preview before launching: once a study is live the questions are fixed, and a bad question wastes the whole sample." + }, + { + "name": "kinetic.study_launch", + "summary": "Take a draft live so it can collect responses. COSTS MONEY: the launch price comes from kinetic.method_list (currently $149-$199 by method) and must be paid first via kinetic.study_checkout_create. Confirm with your human before calling. Once live the questions are fixed." + }, + { + "name": "kinetic.respondent_link_get", + "summary": "Get the link to send to your customers or prospects. THEY are the respondents: Kinetic supplies no panel, so the quality of the answer depends on who you send this to. Free." + }, + { + "name": "kinetic.study_progress_get", + "summary": "How many responses have arrived against the recommended sample size. Free. Poll after launch; results are only meaningful once you clear the method's recommended minimum." + }, + { + "name": "kinetic.study_quality_get", + "summary": "Response-quality signals: speeders, straight-liners, and other patterns meaning a response should not be trusted. Free. Check this before believing the results." + }, + { + "name": "kinetic.study_close", + "summary": "Stop collecting responses and finalize the study so results can be computed. Free." + }, + { + "name": "kinetic.results_get", + "summary": "The deterministic results: numbers Kinetic's analysis engine computed from the responses, not a model's opinion of them. Free. This is the output you act on." + }, + { + "name": "kinetic.evidence_get", + "summary": "The structured respondent evidence behind the results, so a number can be traced to the answers that produced it. Free." + }, + { + "name": "kinetic.narrative_generate", + "summary": "Generate a written explanation of the results. The narrative is written FROM the deterministic results, so it explains the computed numbers rather than inventing them. Free." + }, + { + "name": "kinetic.narrative_get", + "summary": "Read a previously generated narrative. Free." + }, + { + "name": "kinetic.results_export_csv", + "summary": "Export results and responses as CSV for analysis elsewhere. Free." + }, + { + "name": "kinetic.offer_list", + "summary": "List what is purchasable and what it costs: one-time study prices and Kinetic Pro plans. Free, and the honest place to check a price before committing to a spend." + }, + { + "name": "kinetic.study_checkout_create", + "summary": "Start payment for a draft study. Returns {checkout_url, study_id, amount_cents} and does NOT complete the purchase. A human must open checkout_url and pay on Stripe's hosted page; hand them the link and stop. Once paid, kinetic.study_launch will work. Confirm the amount with your human first." + }, + { + "name": "kinetic.teardown_create", + "summary": "Run a teardown of a public pricing page and get a structured read of how it is constructed. Free." + }, + { + "name": "kinetic.teardown_get", + "summary": "Read a completed teardown. Free." + }, + { + "name": "kinetic.research_list", + "summary": "Browse Kinetic's published pricing research. Free." + }, + { + "name": "kinetic.research_get", + "summary": "Read one published research piece. Free." + }, + { + "name": "kinetic.task_get", + "summary": "Poll a long-running task (prefill, teardown, export) for completion. Free." + } + ], + "io.pilot.dial": [ + { + "name": "dial.status", + "summary": "Your account: credit balance, plan, and the limits currently in force (max call duration, max concurrent calls). Free. Call this first to orient." + }, + { + "name": "dial.usage", + "summary": "Activity analytics: message and call counts, voice minutes, per-day series, and busiest numbers. Free." + }, + { + "name": "dial.signup", + "summary": "Start creating a Dial account. Emails a 6-digit code and returns a verificationId; pass both to dial.verify to finish. Only needed if you do not already have an API key." + }, + { + "name": "dial.verify", + "summary": "Finish signup by exchanging the emailed code for an API key. The new account starts with $5 of credit and no card on file." + }, + { + "name": "dial.list_numbers", + "summary": "Your phone numbers, with capabilities, setup status, and per-number inbound configuration. Free." + }, + { + "name": "dial.buy_number", + "summary": "Provision a new US phone number. COSTS $3/month. Requires an explicit consent attestation because it spends money on behalf of the account holder, so confirm with your human first." + }, + { + "name": "dial.get_number", + "summary": "One phone number by id. Free." + }, + { + "name": "dial.set_number", + "summary": "Update a number: nickname, inbound behavior, voice, language, call ceiling, and (iMessage numbers only) the display name and avatar recipients see. Only the fields you send change. Free." + }, + { + "name": "dial.release_number", + "summary": "Release a number. IRREVERSIBLE: the number is gone and the unused month is not refunded. Confirm with your human first." + }, + { + "name": "dial.send_message", + "summary": "Send a text. Delivers over iMessage when the recipient supports it, otherwise SMS, same call either way. COSTS MONEY (US SMS $0.02 per segment). Pass exactly one of fromNumber or fromNumberId." + }, + { + "name": "dial.list_messages", + "summary": "Your messages, inbound and outbound, newest first (up to the 100 most recent). Free. Poll this for replies, or prefer dial.wait_for_event to block until one arrives." + }, + { + "name": "dial.typing", + "summary": "Show or clear a typing indicator before you reply. iMessage numbers display it; SMS numbers ignore it, so it is always safe to call. Sending a message clears it automatically. Free." + }, + { + "name": "dial.place_call", + "summary": "Place an outbound AI voice call. Returns a call id immediately; the call runs in the background. COSTS MONEY per minute. Pass transferTo to have the agent wait out hold queues and IVR menus and hand the live call to a human when a real person answers. Poll dial.get_call, or block on dial.wait_for_event with call.ended." + }, + { + "name": "dial.get_call", + "summary": "One call with its status and transcript once available. THE poll target after dial.place_call. Free." + }, + { + "name": "dial.list_calls", + "summary": "Your calls, newest first (up to the 100 most recent), inbound and outbound. Free." + }, + { + "name": "dial.end_call", + "summary": "Hang up a call that is still in progress. Free." + }, + { + "name": "dial.wait_for_event", + "summary": "Block until a matching event arrives instead of polling. Use it for an inbound reply or a 2FA code (message.received) or a finished call (call.ended, call.transcribed). A 408 means the wait timed out: try again, it is not an error. Free." + }, + { + "name": "dial.list_context_mcps", + "summary": "The MCP servers connected to your voice agent. Secrets and tokens are masked. Free." + }, + { + "name": "dial.add_context_mcp", + "summary": "Connect an MCP server so its tools are available to your AI voice agent DURING calls, to look something up or take an action mid-conversation. Works unattended for servers needing no auth or a static header. An OAuth server instead returns an authorizationUrl and stays pending until a human grants consent in a browser. Free." + }, + { + "name": "dial.remove_context_mcp", + "summary": "Disconnect an MCP server from your voice agent. Its tools stop being offered on future calls. Free." + } ] } diff --git a/src/data/app-overrides.json b/src/data/app-overrides.json index 8ed4001d..089020fd 100644 --- a/src/data/app-overrides.json +++ b/src/data/app-overrides.json @@ -1141,5 +1141,235 @@ "publishedAt": null, "grants": [], "inCatalogue": true + }, + "io.pilot.deadsimple": { + "name": "Dead Simple Email", + "tagline": "An email identity your agent provisions for itself, then uses to send, receive, and read its own signup codes.", + "description": "Dead Simple Email gives an agent a real, deliverable email identity — not a sandbox — and it can get one entirely on its own. A single call to `deadsimple.signup` returns an account, an API key and a live inbox. No dashboard, no verification email, no human in the loop.\n\n**The method agents reach for most is `deadsimple.get_verification_code`.** It pulls the one-time code or magic link straight out of the newest inbound message, so an agent can sign itself up for a third-party service or clear a 2FA prompt without ever parsing an email body. Filter by sender and by timestamp so a stale code is never returned. This is what turns \"the provider emails you a code\" from a dead end into a step.\n\nFrom there the agent sends, replies on-thread, reply-alls, forwards, reads full messages with headers and attachments, and walks whole conversation threads over one REST API.\n\nUnderneath is real sending infrastructure: DKIM-signed egress through a dedicated MTA, bounce and complaint handling, suppression lists, and optional open and click tracking. Inbound mail can be pushed to HMAC-SHA256 signed webhooks that retry on exponential backoff. A supervisor agent can watch every inbox in a workspace at once with `list_all_messages`, and inboxes can be created in bulk, tagged, and torn down when a throwaway identity is finished.\n\n**Tiers.** A self-provisioned agent account starts on trial: 1 inbox, 10 sends an hour, 25 a day. Calling `deadsimple.claim` with an email a human controls, then `deadsimple.claim_verify`, moves it to the Free plan — 5 inboxes and 5,000 emails a month — keeping the same API key, inboxes and history. Paid plans scale to 500 inboxes, 25 custom domains, and 1,000 requests a minute.\n\n**Edge cases.** A 429 with code `trial_send_limit_exceeded` is a quota signal, not a transient failure — do not blindly retry, claim the account instead. Pagination is cursor-based. Spam is excluded from `list_messages` unless `include_spam` is true. Delete throwaway inboxes when finished so they stop counting against the quota.", + "version": "0.1.0", + "vendor": "Dead Simple Email", + "vendorUrl": "https://deadsimple.email", + "homepage": "https://deadsimple.email", + "sourceUrl": "https://deadsimple.email", + "license": "Proprietary", + "categoriesRaw": [ + "comms" + ], + "keywords": [ + "email", + "inbox", + "otp", + "verification code", + "magic link", + "agent onboarding", + "transactional email", + "threads", + "attachments", + "webhooks" + ], + "grants": [ + "fs.read:$APP/config.json", + "fs.read:$APP/secrets.json", + "key.sign:self", + "audit.log:*" + ], + "protection": "shareable", + "runtimes": [ + "go" + ], + "minPilotVersion": "1.10.0", + "inCatalogue": true, + "publishedAt": "2026-07-27", + "changelog": [ + { + "version": "0.1.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ] + }, + "io.pilot.rentahuman": { + "name": "Rent A Human", + "tagline": "Hire a real person for a physical-world task, in plain language, and talk to ops until it is done.", + "description": "Rent A Human gives an agent hands in the physical world. Describe a task the way a person would — \"deep clean a 2-bedroom apartment in the Mission by Friday, budget $150\" — and a human ops coordinator at RentAHuman sources and vets a real person to do it. Everything after that happens on a message thread your agent polls.\n\n**This is the Partner API, not the marketplace.** There is no account for your user to create, no profile to browse, and no escrow for your agent to manage. One call creates a request; ops does the sourcing, vetting and scheduling; your agent reads status and messages and answers questions. When work is priced, a payment link comes back for your agent to relay.\n\n**Your agent is the only channel.** RentAHuman never contacts your end customer. Quotes, questions, status changes and payment links are all addressed to your agent, even when the wording reads like \"tell the customer…\". You decide whether, when and how to relay each one. Nothing reaches your customer unless your agent sends it.\n\n**The loop.** `create_request` returns a `requestId`. Poll `get_request` and branch on `status`: `received` means ops has not replied yet; `needs_info` means they asked a question and progress is **blocked** until you answer with `send_message`; `quoted` means a price and usually a payment link are waiting to be relayed; then `scheduled`, `in_progress`, `completed`. `list_requests` shows everything in flight.\n\n**Edge cases.** `task` and `details` are moderated, so rejected text returns 400 with an explanation and should be rewritten rather than retried. `requesterPhoneNumber` must be E.164 and is customer PII. `budgetUsd` is the budget before fees. A `requestId` you do not own returns 404, exactly like one that does not exist, so ids cannot be enumerated. `list_bounties` needs the referrals capability and otherwise returns 403.", + "version": "0.2.0", + "vendor": "Rent A Human", + "vendorUrl": "https://rentahuman.ai", + "homepage": "https://rentahuman.ai", + "sourceUrl": "https://rentahuman.ai/docs/partners", + "license": "Proprietary", + "categoriesRaw": [ + "automation" + ], + "keywords": [ + "humans", + "real-world tasks", + "errands", + "cleaning", + "on-site", + "human-in-the-loop", + "concierge", + "physical world", + "ops" + ], + "grants": [ + "fs.read:$APP/config.json", + "key.sign:self", + "net.dial:broker.pilotprotocol.network", + "audit.log:*" + ], + "protection": "shareable", + "runtimes": [ + "go" + ], + "minPilotVersion": "1.10.0", + "inCatalogue": true, + "publishedAt": "2026-07-27", + "changelog": [ + { + "version": "0.2.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ] + }, + "io.pilot.upfile": { + "name": "Upfile", + "tagline": "Upload a file, get a permanent URL. One call to sign up, one to upload.", + "description": "Upfile turns a file on the host into a URL an agent can hand to a human or another service. There is no dashboard and no browser step anywhere in the loop: `upfile.signup` creates an account and saves the key locally, and from then on `upfile.upload` returns a live, permanent link.\n\n**Everything returns JSON.** The upload methods emit `{id, url, visibility, size, type, expires_at, storage_used, storage_limit}`, so an agent reads `.url` rather than scraping console output.\n\n**Three shapes of link.** A plain upload is public and permanent — an unauthenticated URL that keeps working. `upload_private` puts it behind authentication. `upload_expiring` gives it a TTL in seconds, which is the right choice for build logs, debug dumps, and anything you would rather not leave permanently reachable.\n\n**Housekeeping.** `status` shows tier and quota, `list` enumerates what is stored with each file's id, and `remove` deletes one by id and reclaims the space. The free tier is 1GB total across all files.\n\nThe CLI ships with the app as a per-platform binary verified by sha256 at install, so there is no Node install and no package manager involved on the host.", + "version": "0.2.3", + "vendor": "Upfile", + "vendorUrl": "https://upfile.sh", + "homepage": "https://upfile.sh", + "sourceUrl": "https://github.com/upfilesh/cli", + "license": "MIT", + "categoriesRaw": [ + "devtools" + ], + "keywords": [ + "upload", + "file-sharing", + "cli", + "cdn", + "permanent url", + "expiring link", + "artifacts", + "agents" + ], + "grants": [ + "fs.read:$APP/install.json", + "fs.write:$APP", + "proc.exec:upfile", + "net.dial:pub-f09f9a4ea848491198d48e329ba030e3.r2.dev", + "audit.log:*" + ], + "protection": "shareable", + "runtimes": [ + "go" + ], + "minPilotVersion": "1.10.0", + "inCatalogue": true, + "publishedAt": "2026-07-27", + "changelog": [ + { + "version": "0.2.3", + "notes": [ + "First release on the Pilot app store." + ] + } + ] + }, + "io.pilot.kinetic": { + "name": "Kinetic Pricing", + "tagline": "Decide what to charge, using answers from your own customers rather than a guess.", + "description": "Kinetic Pricing runs real pricing research end to end: choose the method that fits the decision, draft and preview the survey, send a link to your own customers, and read results computed by an analysis engine rather than asserted by a model.\n\n**Pick the right method or the answer is worthless.** `method_recommend` takes the decision in plain language and returns the method that answers it. Van Westendorp finds an acceptable price *range*; Gabor-Granger tests specific price *points* and produces a demand curve; MaxDiff ranks which features carry value; choice-based conjoint models trade-offs. Asking the wrong one produces a confident, useless number.\n\n**Everything up to launch is free.** Drafting, editing, regenerating the survey and previewing it cost nothing, and preview stores no respondent evidence. Launching costs $149-$199 depending on method, and that fee is paid by a human on Stripe's hosted page rather than out of an agent's budget. `study_checkout_create` returns the link and explicitly does not complete the purchase.\n\n**You supply the respondents.** Kinetic has no panel. `respondent_link_get` gives a link to send to your own customers or prospects, so the quality of the answer depends on who you send it to.\n\n**The numbers are computed, not narrated.** `results_get` returns what the analysis engine calculated, `evidence_get` traces a number back to the answers behind it, and `narrative_generate` writes an explanation *from* those results. Check `study_quality_get` before believing any of it, since speeders and straight-liners produce clean-looking nonsense, and check `study_progress_get` against the method's recommended minimum sample.\n\nAlso included: pricing-page teardowns, Kinetic's published research, and CSV export.", + "version": "1.0.0", + "vendor": "Kinetic Pricing", + "vendorUrl": "https://kineticpricing.com", + "homepage": "https://kineticpricing.com", + "sourceUrl": "https://kineticpricing.com", + "license": "Proprietary", + "categoriesRaw": [ + "ai" + ], + "keywords": [ + "pricing", + "willingness to pay", + "van westendorp", + "gabor granger", + "maxdiff", + "conjoint", + "market research", + "saas pricing" + ], + "grants": [ + "fs.read:$APP/config.json", + "key.sign:self", + "net.dial:broker.pilotprotocol.network", + "audit.log:*" + ], + "protection": "shareable", + "runtimes": [ + "go" + ], + "minPilotVersion": "1.10.0", + "inCatalogue": true, + "publishedAt": "2026-07-30", + "changelog": [ + { + "version": "1.0.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ] + }, + "io.pilot.dial": { + "name": "Dial", + "tagline": "A complete phone identity for your agent — voice calls, SMS and iMessage on a real US number, provisioned in one call.", + "description": "Dial gives your agent its own real phone number: place and receive AI voice calls, send and receive SMS and iMessage, and wait on inbound events without polling. Bring your Dial API key at install time and every method authenticates as your own account. The account is yours, works outside Pilot too, and starts with $5 of credit and no credit card. No key yet? dial.signup emails a 6-digit code and dial.verify exchanges it for one. What you can do - Call people. dial.place_call runs an autonomous AI voice call from your number: book a table, chase a delivery, return a missed call. Pass transferTo and it waits out hold music and IVR menus, then cold-transfers to your human the moment a real person answers — never to a recording. Poll dial.get_call for the transcript, or block on dial.wait_for_event. - Give the call your tools. Connect a Context MCP and your MCP server tools become available to the voice agent DURING the call, so it can look something up or take an action mid-conversation. Dial runs the OAuth 2.1 flow and keeps the token fresh in the background. - Text people. dial.send_message delivers over iMessage when the recipient supports it and falls back to SMS otherwise, same call either way. Show a typing indicator first with dial.typing. - Wait, do not poll. dial.wait_for_event blocks until an inbound reply, a 2FA code, or a finished call shows up. A 408 means try again, not an error. - Own the identity. Set each number inbound behavior, voice and language, and on iMessage numbers the display name and avatar recipients see in Messages. Cost Reads are free. $3/month per number. US SMS $0.02 per segment. Managed voice $0.22/min all-in; self-hosted voice $0.13/min if you bring your own LLM over a WebSocket. Your $5 signup credit covers the first usage and spend pauses at $0 rather than surprising you. Good to know A brand-new account is on the free tier until it is topped up, which caps calls at 5 minutes and 2 concurrent calls. Both lift permanently on the first top-up. Emergency and crisis numbers are blocked. Always pass numbers in E.164, e.g. +14155551234. Every method, its parameters and latency class are discoverable at runtime via dial.help.", + "version": "0.1.0", + "vendor": "GetDial AI", + "vendorUrl": "https://getdial.ai", + "homepage": "https://getdial.ai", + "sourceUrl": "https://github.com/GetDial-AI/cli", + "license": "MIT", + "categoriesRaw": [ + "comms", + "automation" + ], + "keywords": [ + "phone", + "sms", + "imessage", + "voice", + "calls", + "telephony", + "agent", + "webhooks" + ], + "grants": [ + "fs.read:$APP/config.json", + "fs.read:$APP/secrets.json", + "key.sign:self", + "audit.log:*" + ], + "protection": "shareable", + "runtimes": [ + "go" + ], + "minPilotVersion": "1.10.0", + "inCatalogue": true, + "publishedAt": "2026-08-05", + "changelog": [ + { + "version": "0.1.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ] } } diff --git a/src/data/apps.ts b/src/data/apps.ts index 4aceda38..53c455a4 100644 --- a/src/data/apps.ts +++ b/src/data/apps.ts @@ -69,6 +69,12 @@ export const categories: Category[] = [ "blurb": "Settle value on-overlay and read the markets.", "hue": 155 }, + { + "id": "work", + "name": "Work & Research", + "blurb": "Put real-world work in motion and get real answers back — human hands on a task, and pricing research with your own customers.", + "hue": 45 + }, { "id": "comms", "name": "Communications", @@ -78,6 +84,1185 @@ export const categories: Category[] = [ ]; export const apps: App[] = [ + { + "id": "io.pilot.dial", + "name": "Dial", + "tagline": "A complete phone identity for your agent — voice calls, SMS and iMessage on a real US number, provisioned in one call", + "description": "Dial gives your agent its own real phone number: place and receive AI voice calls, send and receive SMS and iMessage, and wait on inbound events without polling. Bring your Dial API key at install time and every method authenticates as your own account. The account is yours, works outside Pilot too, and starts with $5 of credit and no credit card. No key yet? dial.signup emails a 6-digit code and dial.verify exchanges it for one. What you can do - Call people. dial.place_call runs an autonomous AI voice call from your number: book a table, chase a delivery, return a missed call. Pass transferTo and it waits out hold music and IVR menus, then cold-transfers to your human the moment a real person answers — never to a recording. Poll dial.get_call for the transcript, or block on dial.wait_for_event. - Give the call your tools. Connect a Context MCP and your MCP server tools become available to the voice agent DURING the call, so it can look something up or take an action mid-conversation. Dial runs the OAuth 2.1 flow and keeps the token fresh in the background. - Text people. dial.send_message delivers over iMessage when the recipient supports it and falls back to SMS otherwise, same call either way. Show a typing indicator first with dial.typing. - Wait, do not poll. dial.wait_for_event blocks until an inbound reply, a 2FA code, or a finished call shows up. A 408 means try again, not an error. - Own the identity. Set each number inbound behavior, voice and language, and on iMessage numbers the display name and avatar recipients see in Messages. Cost Reads are free. $3/month per number. US SMS $0.02 per segment. Managed voice $0.22/min all-in; self-hosted voice $0.13/min if you bring your own LLM over a WebSocket. Your $5 signup credit covers the first usage and spend pauses at $0 rather than surprising you. Good to know A brand-new account is on the free tier until it is topped up, which caps calls at 5 minutes and 2 concurrent calls. Both lift permanently on the first top-up. Emergency and crisis numbers are blocked. Always pass numbers in E.164, e.g. +14155551234. Every method, its parameters and latency class are discoverable at runtime via dial.help.", + "categories": [ + "comms" + ], + "primaryCategory": "comms", + "keywords": [ + "phone", + "sms", + "imessage", + "voice", + "calls", + "telephony", + "agent", + "webhooks" + ], + "version": "0.1.0", + "vendor": "GetDial AI", + "vendorUrl": "https://getdial.ai", + "license": "MIT", + "sourceUrl": "https://github.com/GetDial-AI/cli", + "homepage": "https://getdial.ai", + "methods": [ + { + "name": "dial.status", + "summary": "Your account: credit balance, plan, and the limits currently in force (max call duration, max concurrent calls). Free. Call this first to orient.", + "example": null, + "gated": null + }, + { + "name": "dial.usage", + "summary": "Activity analytics: message and call counts, voice minutes, per-day series, and busiest numbers. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.signup", + "summary": "Start creating a Dial account. Emails a 6-digit code and returns a verificationId; pass both to dial.verify to finish. Only needed if you do not already have an API key.", + "example": null, + "gated": null + }, + { + "name": "dial.verify", + "summary": "Finish signup by exchanging the emailed code for an API key. The new account starts with $5 of credit and no card on file.", + "example": null, + "gated": null + }, + { + "name": "dial.list_numbers", + "summary": "Your phone numbers, with capabilities, setup status, and per-number inbound configuration. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.buy_number", + "summary": "Provision a new US phone number. COSTS $3/month. Requires an explicit consent attestation because it spends money on behalf of the account holder, so confirm with your human first.", + "example": null, + "gated": null + }, + { + "name": "dial.get_number", + "summary": "One phone number by id. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.set_number", + "summary": "Update a number: nickname, inbound behavior, voice, language, call ceiling, and (iMessage numbers only) the display name and avatar recipients see. Only the fields you send change. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.release_number", + "summary": "Release a number. IRREVERSIBLE: the number is gone and the unused month is not refunded. Confirm with your human first.", + "example": null, + "gated": null + }, + { + "name": "dial.send_message", + "summary": "Send a text. Delivers over iMessage when the recipient supports it, otherwise SMS, same call either way. COSTS MONEY (US SMS $0.02 per segment). Pass exactly one of fromNumber or fromNumberId.", + "example": null, + "gated": null + }, + { + "name": "dial.list_messages", + "summary": "Your messages, inbound and outbound, newest first (up to the 100 most recent). Free. Poll this for replies, or prefer dial.wait_for_event to block until one arrives.", + "example": null, + "gated": null + }, + { + "name": "dial.typing", + "summary": "Show or clear a typing indicator before you reply. iMessage numbers display it; SMS numbers ignore it, so it is always safe to call. Sending a message clears it automatically. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.place_call", + "summary": "Place an outbound AI voice call. Returns a call id immediately; the call runs in the background. COSTS MONEY per minute. Pass transferTo to have the agent wait out hold queues and IVR menus and hand the live call to a human when a real person answers. Poll dial.get_call, or block on dial.wait_for_event with call.ended.", + "example": null, + "gated": null + }, + { + "name": "dial.get_call", + "summary": "One call with its status and transcript once available. THE poll target after dial.place_call. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.list_calls", + "summary": "Your calls, newest first (up to the 100 most recent), inbound and outbound. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.end_call", + "summary": "Hang up a call that is still in progress. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.wait_for_event", + "summary": "Block until a matching event arrives instead of polling. Use it for an inbound reply or a 2FA code (message.received) or a finished call (call.ended, call.transcribed). A 408 means the wait timed out: try again, it is not an error. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.list_context_mcps", + "summary": "The MCP servers connected to your voice agent. Secrets and tokens are masked. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.add_context_mcp", + "summary": "Connect an MCP server so its tools are available to your AI voice agent DURING calls, to look something up or take an action mid-conversation. Works unattended for servers needing no auth or a static header. An OAuth server instead returns an authorizationUrl and stays pending until a human grants consent in a browser. Free.", + "example": null, + "gated": null + }, + { + "name": "dial.remove_context_mcp", + "summary": "Disconnect an MCP server from your voice agent. Its tools stop being offered on future calls. Free.", + "example": null, + "gated": null + } + ], + "changelog": [ + { + "version": "0.1.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ], + "grants": [ + "fs.read:$APP/config.json", + "fs.read:$APP/secrets.json", + "key.sign:self", + "audit.log:*" + ], + "bundles": [ + { + "platform": "darwin-arm64", + "bytes": null + }, + { + "platform": "darwin-amd64", + "bytes": null + }, + { + "platform": "linux-arm64", + "bytes": null + }, + { + "platform": "linux-amd64", + "bytes": null + } + ], + "installedBytes": null, + "depends": [], + "protection": "shareable", + "featured": false, + "real": true, + "inCatalogue": true, + "icon": { + "mode": "image", + "img": "/appicons/io.pilot.dial.png", + "fit": "cover", + "pos": "center", + "color": "#2b2b28", + "ink": false, + "file": null, + "hue": 315 + }, + "minPilotVersion": "1.10.0", + "runtimes": [ + "go" + ], + "publishedAt": "2026-08-05", + "updatedAt": "2026-08-05", + "productDemo": { + "skill": "io.pilot.dial", + "title": "Full usage demo", + "metered": true, + "when_to_use": "When a task needs a phone: call a business and sit through the hold queue, text someone and wait for the reply, or receive a 2FA code on a real US number.", + "quickstart": { + "goal": "See your credit and the limits in force before spending anything", + "command": "pilotctl appstore call io.pilot.dial dial.status '{}'", + "expect": "{\"credit\":\"$5.00\",\"plan\":\"free\",\"maxCallDurationSeconds\":300,\"maxConcurrentCalls\":2}", + "cost": "$0.00 (read)", + "note": "Free. A new account starts with $5 and no card. No key yet? dial.signup emails a code and dial.verify exchanges it for one." + }, + "examples": [ + { + "title": "Get a number, then text someone", + "goal": "A number is the prerequisite for everything else", + "command": "pilotctl appstore call io.pilot.dial dial.buy_number '{\"areaCode\":\"415\",\"explicitProgrammaticConsent\":\"yes\"}'", + "expect": "{\"id\":\"num_...\",\"phoneNumber\":\"+14155550123\"}", + "cost": "$3.00/month", + "note": "Spends money, so it requires an explicit consent attestation — confirm with your human first. Then dial.send_message delivers over iMessage when the recipient supports it, else SMS." + }, + { + "title": "Place a call and let it wait out the IVR", + "goal": "The thing an agent genuinely cannot do itself", + "command": "pilotctl appstore call io.pilot.dial dial.place_call '{\"to\":\"+14155550199\",\"fromNumber\":\"+14155550123\",\"outboundInstruction\":\"Ask if they take reservations for 4 at 8pm Friday\",\"transferTo\":\"+14155550100\"}'", + "expect": "{\"id\":\"call_...\",\"status\":\"queued\"}", + "cost": "$0.22/min", + "note": "transferTo hands the live call to your human the moment a real person answers — never to a recording. Poll dial.get_call for the transcript." + }, + { + "title": "Block until the reply arrives, instead of polling", + "command": "pilotctl appstore call io.pilot.dial dial.wait_for_event '{\"eventType\":\"message.received\",\"timeout\":120}'", + "expect": "{\"event\":\"message.received\",\"message\":{\"body\":\"Your code is 481920\"}}", + "cost": "$0.00 (read)", + "note": "A 408 means try again, not an error. This is how you catch a 2FA code without spinning." + } + ], + "cost": { + "unit": "USD", + "free_budget": "$5.00 signup credit, no card", + "hard_cap_usd": 5, + "operations": [ + { + "op": "reads (status, usage, list_*, get_call, wait_for_event)", + "price": "free" + }, + { + "op": "dial.buy_number", + "price": "$3.00/month", + "note": "requires an explicit consent attestation" + }, + { + "op": "dial.send_message", + "price": "$0.02 per SMS segment", + "note": "iMessage delivery where supported" + }, + { + "op": "dial.place_call", + "price": "$0.22/min", + "note": "$0.13/min self-hosted if you bring your own LLM" + } + ], + "worked_total": "$3.44 — one number for a month ($3.00), one 2-minute call ($0.44), reads free. Inside the $5 signup credit." + }, + "gotchas": [ + "Reads are free; buying a number, texting and calling cost money. Check dial.status first.", + "dial.buy_number needs an explicit consent attestation because it spends — confirm with your human.", + "A new account is capped at 5-minute calls and 2 concurrent until the first top-up.", + "Always pass numbers in E.164, e.g. +14155551234. Emergency and crisis numbers are blocked.", + "Prefer dial.wait_for_event over polling; a 408 means retry, not failure." + ], + "next": [ + "io.pilot.dial dial.help '{}'" + ] + }, + "limits": null + }, + { + "id": "io.pilot.deadsimple", + "name": "Dead Simple Email", + "tagline": "An email identity your agent provisions for itself, then uses to send, receive, and read its own signup codes", + "description": "Dead Simple Email gives an agent a real, deliverable email identity — not a sandbox — and it can get one entirely on its own. A single call to `deadsimple.signup` returns an account, an API key and a live inbox. No dashboard, no verification email, no human in the loop.\n\n**The method agents reach for most is `deadsimple.get_verification_code`.** It pulls the one-time code or magic link straight out of the newest inbound message, so an agent can sign itself up for a third-party service or clear a 2FA prompt without ever parsing an email body. Filter by sender and by timestamp so a stale code is never returned. This is what turns \"the provider emails you a code\" from a dead end into a step.\n\nFrom there the agent sends, replies on-thread, reply-alls, forwards, reads full messages with headers and attachments, and walks whole conversation threads over one REST API.\n\nUnderneath is real sending infrastructure: DKIM-signed egress through a dedicated MTA, bounce and complaint handling, suppression lists, and optional open and click tracking. Inbound mail can be pushed to HMAC-SHA256 signed webhooks that retry on exponential backoff. A supervisor agent can watch every inbox in a workspace at once with `list_all_messages`, and inboxes can be created in bulk, tagged, and torn down when a throwaway identity is finished.\n\n**Tiers.** A self-provisioned agent account starts on trial: 1 inbox, 10 sends an hour, 25 a day. Calling `deadsimple.claim` with an email a human controls, then `deadsimple.claim_verify`, moves it to the Free plan — 5 inboxes and 5,000 emails a month — keeping the same API key, inboxes and history. Paid plans scale to 500 inboxes, 25 custom domains, and 1,000 requests a minute.\n\n**Edge cases.** A 429 with code `trial_send_limit_exceeded` is a quota signal, not a transient failure — do not blindly retry, claim the account instead. Pagination is cursor-based. Spam is excluded from `list_messages` unless `include_spam` is true. Delete throwaway inboxes when finished so they stop counting against the quota.", + "categories": [ + "comms" + ], + "primaryCategory": "comms", + "keywords": [ + "email", + "inbox", + "otp", + "verification code", + "magic link", + "agent onboarding", + "transactional email", + "threads", + "attachments", + "webhooks" + ], + "version": "0.1.0", + "vendor": "Dead Simple Email", + "vendorUrl": "https://deadsimple.email", + "license": "Proprietary", + "sourceUrl": "https://deadsimple.email", + "homepage": "https://deadsimple.email", + "methods": [ + { + "name": "deadsimple.signup", + "summary": "START HERE if you have no key. Provisions a Dead Simple account, an API key and a live inbox in one call, with no human, no dashboard and no verification email. Returns {account_id, api_key, inbox}. Save api_key as the DEADSIMPLE_API_KEY secret — every other method authenticates with it. Idempotent per Idempotency-Key, so a retry after a dropped connection returns the same account rather than a second one. The account starts on the trial tier: 1 inbox, 10 sends an hour, 25 a day.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.claim", + "summary": "Start lifting the trial caps by attaching an email address a human controls. Sends a 6-digit code to that address; pass it to deadsimple.claim_verify to finish. Your existing API key, inboxes and message history are untouched by the upgrade.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.claim_verify", + "summary": "Confirm the code from deadsimple.claim and move the account from trial to the Free plan (5 inboxes, 5,000 emails a month). The same API key keeps working.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.create_inbox", + "summary": "Create a real, deliverable email inbox in one call. Returns an inbox_id and a live address that can send and receive immediately — no SMTP setup, no DNS, no mailbox provisioning. Use this when you already have a key and want an additional identity.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.list_inboxes", + "summary": "List the inboxes this key can see, newest first. Cursor-paginated: pass the cursor from the previous response for the next page.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.get_inbox", + "summary": "Fetch one inbox: its address, display name, tags, status, and counters.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.delete_inbox", + "summary": "Permanently delete an inbox and its stored messages. IRREVERSIBLE. Use when a throwaway identity is finished so it stops counting against the inbox quota.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.send_email", + "summary": "Send an email from one of your inboxes. Plain text or HTML, cc/bcc, base64 attachments, scheduled send, and optional open/click tracking. Real DKIM-signed egress, not a test harness. On the trial tier this is capped at 10 an hour and 25 a day; a 429 with code trial_send_limit_exceeded is a quota signal, not a transient failure.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.get_verification_code", + "summary": "THE method agents reach for. Pulls the one-time code or magic link straight out of the newest inbound message, so a signup or 2FA prompt can be cleared without parsing an email body. Non-blocking: returns found=false if nothing has arrived, so poll every 2-3 seconds for up to a minute after triggering the mail. Set `since` to a timestamp taken BEFORE you triggered it, and `from_contains` to the sender domain, so a stale code is never returned.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.list_messages", + "summary": "List messages in an inbox, newest first, with sender, subject, snippet, and labels. Spam is excluded unless include_spam is true. Cursor-paginated.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.get_message", + "summary": "Get one message in full: headers, plain-text and HTML bodies, and attachment metadata.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.reply", + "summary": "Reply to the sender of a message. Threading headers are set automatically so the reply lands in the same conversation — never hand-build In-Reply-To.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.reply_all", + "summary": "Reply to the sender and every other recipient of a message, with threading headers set automatically.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.forward", + "summary": "Forward a message, with its attachments, to new recipients.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.list_threads", + "summary": "List conversation threads in an inbox, each with its latest message, so an agent can track ongoing exchanges instead of loose messages.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.get_thread", + "summary": "Get a full conversation thread with every message in order — the context an agent needs before replying.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.get_attachment", + "summary": "Get a time-limited signed download URL for an attachment. The link expires in one hour.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.list_all_messages", + "summary": "List messages across every inbox this key can see, newest first. For a supervisor agent watching many identities at once — cheaper than iterating inboxes.", + "example": null, + "gated": null + }, + { + "name": "deadsimple.create_webhook", + "summary": "Register an HMAC-SHA256 signed webhook for inbound mail, bounces, and complaints, so long-running work does not have to poll list_messages in a loop. Deliveries retry on exponential backoff and every attempt is logged.", + "example": null, + "gated": null + } + ], + "changelog": [ + { + "version": "0.1.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ], + "grants": [ + "fs.read:$APP/config.json", + "fs.read:$APP/secrets.json", + "key.sign:self", + "audit.log:*" + ], + "bundles": [ + { + "platform": "darwin-arm64", + "bytes": null + }, + { + "platform": "darwin-amd64", + "bytes": null + }, + { + "platform": "linux-arm64", + "bytes": null + }, + { + "platform": "linux-amd64", + "bytes": null + } + ], + "installedBytes": null, + "depends": [], + "protection": "shareable", + "featured": false, + "real": true, + "inCatalogue": true, + "icon": { + "mode": "image", + "img": "/appicons/io.pilot.deadsimple.png", + "fit": "contain", + "pos": "center", + "color": "#ffffff", + "ink": false, + "file": null, + "hue": 315 + }, + "minPilotVersion": "1.10.0", + "runtimes": [ + "go" + ], + "publishedAt": "2026-07-27", + "updatedAt": "2026-07-27", + "productDemo": { + "skill": "io.pilot.deadsimple", + "title": "Full usage demo", + "when_to_use": "When your agent needs an email address of its own: to sign itself up for a third-party service and read the code back, or to send and receive real mail as part of a task.", + "metered": false, + "quickstart": { + "goal": "Get an account, an API key and a live inbox in one call", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.signup '{\"label\":\"my-agent\"}'", + "expect": "{\"data\":{\"account_id\":\"...\",\"api_key\":\"dse_...\",\"inbox\":{\"inbox_id\":\"...\",\"email\":\"...@box1.deadsimple.email\"},\"plan\":{\"plan\":\"trial\",\"inbox_limit\":1,\"sends_per_hour\":10}}}", + "note": "Everything is under data. Save data.api_key as DEADSIMPLE_API_KEY — it is shown once. Already have a key? Skip this and call create_inbox." + }, + "examples": [ + { + "title": "Sign up for a third-party service and read the code back", + "goal": "The whole point: clear an email verification without a human", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.get_verification_code '{\"inbox_id\":\"\",\"since\":\"2026-08-06T12:00:00Z\",\"from_contains\":\"stripe.com\"}'", + "expect": "{\"data\":{\"found\":true,\"code\":\"481920\",\"magic_link\":null,\"message_id\":\"...\"}}", + "note": "Note the time BEFORE submitting your address, pass it as `since`, then poll every 2-3s. found=false just means it has not landed yet. Never parse the raw email yourself." + }, + { + "title": "Send a real email", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.send_email '{\"inbox_id\":\"\",\"to\":\"someone@example.com\",\"subject\":\"Report ready\",\"text_body\":\"The run finished.\"}'", + "expect": "{\"data\":{\"message_id\":\"...\",\"status\":\"queued\"}}", + "note": "DKIM-signed egress, not a sandbox. Trial caps this at 10/hour, 25/day." + }, + { + "title": "Read a conversation before replying", + "goal": "Get the whole thread, then reply on it with threading handled for you", + "command": "pilotctl appstore call io.pilot.deadsimple deadsimple.get_thread '{\"inbox_id\":\"\",\"thread_id\":\"\"}'", + "expect": "{\"data\":{\"thread_id\":\"...\",\"messages\":[{\"message_id\":\"...\",\"from\":\"...\",\"subject\":\"...\"}]}}", + "note": "Then reply with the message_id; threading headers are set for you." + } + ], + "gotchas": [ + "Every response is wrapped: the payload is under data, with meta.request_id beside it.", + "Call signup only when you have no key. It is idempotent per Idempotency-Key, so a retry returns the same account, not a second one.", + "Trial is 1 inbox, 10 sends/hour, 25/day. A 429 trial_send_limit_exceeded is a QUOTA signal, not transient — do not retry it.", + "Lift the caps with claim then claim_verify. Your key, inboxes and history survive.", + "get_verification_code needs since from BEFORE you triggered the mail, or you may read a stale code." + ], + "next": [ + "io.pilot.deadsimple deadsimple.help '{}'" + ] + }, + "limits": null + }, + { + "id": "io.pilot.kinetic", + "name": "Kinetic Pricing", + "tagline": "Decide what to charge, using answers from your own customers rather than a guess", + "description": "Kinetic Pricing runs real pricing research end to end: choose the method that fits the decision, draft and preview the survey, send a link to your own customers, and read results computed by an analysis engine rather than asserted by a model.\n\n**Pick the right method or the answer is worthless.** `method_recommend` takes the decision in plain language and returns the method that answers it. Van Westendorp finds an acceptable price *range*; Gabor-Granger tests specific price *points* and produces a demand curve; MaxDiff ranks which features carry value; choice-based conjoint models trade-offs. Asking the wrong one produces a confident, useless number.\n\n**Everything up to launch is free.** Drafting, editing, regenerating the survey and previewing it cost nothing, and preview stores no respondent evidence. Launching costs $149-$199 depending on method, and that fee is paid by a human on Stripe's hosted page rather than out of an agent's budget. `study_checkout_create` returns the link and explicitly does not complete the purchase.\n\n**You supply the respondents.** Kinetic has no panel. `respondent_link_get` gives a link to send to your own customers or prospects, so the quality of the answer depends on who you send it to.\n\n**The numbers are computed, not narrated.** `results_get` returns what the analysis engine calculated, `evidence_get` traces a number back to the answers behind it, and `narrative_generate` writes an explanation *from* those results. Check `study_quality_get` before believing any of it, since speeders and straight-liners produce clean-looking nonsense, and check `study_progress_get` against the method's recommended minimum sample.\n\nAlso included: pricing-page teardowns, Kinetic's published research, and CSV export.", + "categories": [ + "work" + ], + "primaryCategory": "work", + "keywords": [ + "pricing", + "willingness to pay", + "van westendorp", + "gabor granger", + "maxdiff", + "conjoint", + "market research", + "saas pricing" + ], + "version": "1.0.0", + "vendor": "Kinetic Pricing", + "vendorUrl": "https://kineticpricing.com", + "license": "Proprietary", + "sourceUrl": "https://kineticpricing.com", + "homepage": "https://kineticpricing.com", + "methods": [ + { + "name": "kinetic.method_list", + "summary": "List the pricing-research methods available, with each one's server-owned launch price in cents, methodology version, and sample-size guidance. Van Westendorp finds an acceptable price RANGE, Gabor-Granger tests exact price POINTS, MaxDiff ranks feature value, choice-based conjoint models trade-offs. Free, and the right first call when you do not yet know which study to run.", + "example": null, + "gated": null + }, + { + "name": "kinetic.method_recommend", + "summary": "Describe the pricing decision in plain language and get back the method that fits it, with reasoning. Free. Use this instead of guessing between Van Westendorp and Gabor-Granger: they answer different questions, and the wrong one produces a confident, useless number.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_create", + "summary": "START HERE once you know the decision. Creates a draft study. You do NOT pick the method: Kinetic derives the methodology from decision_type (first_time and new_tier map to Van Westendorp today) and returns it on the study along with price_cents. Free — a draft costs nothing and is not launched. Returns {id, methodology, status:\"draft\", price_cents}.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_prefill", + "summary": "Generate a draft study filled in from a description of your product and audience, so you edit a sensible starting point rather than an empty form. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_get", + "summary": "Read one study: its configuration, state, and position in the lifecycle. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_list", + "summary": "List your studies with their states. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_update", + "summary": "Edit a draft study: name, prices, features, audience and question configuration. Only the fields you send change. Free, and only valid before launch.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_duplicate", + "summary": "Copy an existing study into a new draft, to run the same design against a different audience or set of prices. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.survey_regenerate", + "summary": "Regenerate the respondent-facing survey from the study's current configuration after editing it. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.survey_preview", + "summary": "Read the survey exactly as a respondent will see it, WITHOUT storing any respondent evidence. Free. Always preview before launching: once a study is live the questions are fixed, and a bad question wastes the whole sample.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_launch", + "summary": "Take a draft live so it can collect responses. COSTS MONEY: the launch price comes from kinetic.method_list (currently $149-$199 by method) and must be paid first via kinetic.study_checkout_create. Confirm with your human before calling. Once live the questions are fixed.", + "example": null, + "gated": null + }, + { + "name": "kinetic.respondent_link_get", + "summary": "Get the link to send to your customers or prospects. THEY are the respondents: Kinetic supplies no panel, so the quality of the answer depends on who you send this to. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_progress_get", + "summary": "How many responses have arrived against the recommended sample size. Free. Poll after launch; results are only meaningful once you clear the method's recommended minimum.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_quality_get", + "summary": "Response-quality signals: speeders, straight-liners, and other patterns meaning a response should not be trusted. Free. Check this before believing the results.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_close", + "summary": "Stop collecting responses and finalize the study so results can be computed. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.results_get", + "summary": "The deterministic results: numbers Kinetic's analysis engine computed from the responses, not a model's opinion of them. Free. This is the output you act on.", + "example": null, + "gated": null + }, + { + "name": "kinetic.evidence_get", + "summary": "The structured respondent evidence behind the results, so a number can be traced to the answers that produced it. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.narrative_generate", + "summary": "Generate a written explanation of the results. The narrative is written FROM the deterministic results, so it explains the computed numbers rather than inventing them. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.narrative_get", + "summary": "Read a previously generated narrative. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.results_export_csv", + "summary": "Export results and responses as CSV for analysis elsewhere. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.offer_list", + "summary": "List what is purchasable and what it costs: one-time study prices and Kinetic Pro plans. Free, and the honest place to check a price before committing to a spend.", + "example": null, + "gated": null + }, + { + "name": "kinetic.study_checkout_create", + "summary": "Start payment for a draft study. Returns {checkout_url, study_id, amount_cents} and does NOT complete the purchase. A human must open checkout_url and pay on Stripe's hosted page; hand them the link and stop. Once paid, kinetic.study_launch will work. Confirm the amount with your human first.", + "example": null, + "gated": null + }, + { + "name": "kinetic.teardown_create", + "summary": "Run a teardown of a public pricing page and get a structured read of how it is constructed. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.teardown_get", + "summary": "Read a completed teardown. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.research_list", + "summary": "Browse Kinetic's published pricing research. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.research_get", + "summary": "Read one published research piece. Free.", + "example": null, + "gated": null + }, + { + "name": "kinetic.task_get", + "summary": "Poll a long-running task (prefill, teardown, export) for completion. Free.", + "example": null, + "gated": null + } + ], + "changelog": [ + { + "version": "1.0.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ], + "grants": [ + "fs.read:$APP/config.json", + "key.sign:self", + "net.dial:broker.pilotprotocol.network", + "audit.log:*" + ], + "bundles": [ + { + "platform": "darwin-arm64", + "bytes": null + }, + { + "platform": "darwin-amd64", + "bytes": null + }, + { + "platform": "linux-arm64", + "bytes": null + }, + { + "platform": "linux-amd64", + "bytes": null + } + ], + "installedBytes": null, + "depends": [], + "protection": "shareable", + "featured": false, + "real": true, + "inCatalogue": true, + "icon": { + "mode": "image", + "img": "/appicons/io.pilot.kinetic.png", + "fit": "cover", + "pos": "center", + "color": "#1b3329", + "ink": false, + "file": null, + "hue": 45 + }, + "minPilotVersion": "1.10.0", + "runtimes": [ + "go" + ], + "publishedAt": "2026-07-30", + "updatedAt": "2026-07-30", + "productDemo": { + "skill": "io.pilot.kinetic", + "title": "Full usage demo", + "metered": true, + "when_to_use": "When you need to know what to charge and want it grounded in your own customers' answers: a price range, a specific price point, or which features carry the value.", + "quickstart": { + "goal": "Find out which study answers your question", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.method_recommend '{\"decision\":\"What should we charge for our Pro tier?\"}'", + "expect": "{\"study_type\":\"van_westendorp\",\"reason\":\"You need a price RANGE, not specific points.\"}", + "note": "Free. The two methods answer different questions, and the wrong one gives a confident useless number.", + "cost": "$0.00 (read)" + }, + "examples": [ + { + "title": "Draft a study and preview it", + "goal": "Everything up to launch is free", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.study_create '{\"Idempotency-Key\":\"\",\"name\":\"Pro tier\",\"product_desc\":\"SaaS analytics for small teams\",\"segment_desc\":\"Founders at 5-50 person startups\",\"decision_type\":\"first_time\",\"currency\":\"USD\"}'", + "expect": "{\"id\":\"3572c965-...\",\"methodology\":\"van_westendorp\",\"status\":\"draft\",\"price_cents\":14900}", + "note": "decision_type picks the methodology for you. Every mutating call needs an Idempotency-Key.", + "cost": "$0.00 (draft, free)" + }, + { + "title": "Check the price before spending", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.offer_list '{}'", + "expect": "{\"offers\":[{\"study_type\":\"van_westendorp\",\"price_cents\":14900}]}", + "note": "Launching costs $149-$199, far above the $5 budget, so a human pays on Stripe.", + "cost": "$0.00 (read)" + }, + { + "title": "Read computed results, not guesses", + "command": "pilotctl appstore call io.pilot.kinetic kinetic.results_get '{\"id\":\"stu_abc123\"}'", + "expect": "{\"optimal_price_point\":42,\"acceptable_range\":{\"low\":34,\"high\":58},\"n\":31}", + "note": "Call study_quality_get first: speeders make a clean number worthless.", + "cost": "$0.00 (read)" + } + ], + "cost": { + "unit": "micro-USD (1000000 = $1.00)", + "free_budget": "$5.00 per Pilot user", + "hard_cap_usd": 5, + "operations": [ + { + "op": "all research methods", + "price": "free", + "note": "discovery, drafting, preview, progress, quality, results, evidence, narrative, export and teardowns cost nothing against the Pilot budget" + }, + { + "op": "kinetic.study_checkout_create", + "price": "free", + "note": "returns a Stripe link; the $149-$199 charge happens on Stripe and is paid by the human who opens it, not from your Pilot budget" + } + ], + "worked_total": "$0.00 against the Pilot budget. The research loop is free; the study fee is paid by a human on Stripe." + }, + "gotchas": [ + "Everything except launching is free. The $149-$199 fee is paid by a human on Stripe, not your budget.", + "Every mutating call needs an Idempotency-Key header; a retry with the same key is safe.", + "study_checkout_create returns a link and does NOT pay. Hand the URL to your human and stop.", + "Preview before launch — once live, questions are fixed.", + "You supply the respondents; Kinetic has no panel.", + "Check study_quality_get and progress before trusting a result." + ], + "next": [ + "io.pilot.kinetic kinetic.balance '{}'", + "io.pilot.kinetic kinetic.help '{}'" + ] + }, + "limits": null + }, + { + "id": "io.pilot.rentahuman", + "name": "Rent A Human", + "tagline": "Hire a real person for a physical-world task, in plain language, and talk to ops until it is done", + "description": "Rent A Human gives an agent hands in the physical world. Describe a task the way a person would — \"deep clean a 2-bedroom apartment in the Mission by Friday, budget $150\" — and a human ops coordinator at RentAHuman sources and vets a real person to do it. Everything after that happens on a message thread your agent polls.\n\n**This is the Partner API, not the marketplace.** There is no account for your user to create, no profile to browse, and no escrow for your agent to manage. One call creates a request; ops does the sourcing, vetting and scheduling; your agent reads status and messages and answers questions. When work is priced, a payment link comes back for your agent to relay.\n\n**Your agent is the only channel.** RentAHuman never contacts your end customer. Quotes, questions, status changes and payment links are all addressed to your agent, even when the wording reads like \"tell the customer…\". You decide whether, when and how to relay each one. Nothing reaches your customer unless your agent sends it.\n\n**The loop.** `create_request` returns a `requestId`. Poll `get_request` and branch on `status`: `received` means ops has not replied yet; `needs_info` means they asked a question and progress is **blocked** until you answer with `send_message`; `quoted` means a price and usually a payment link are waiting to be relayed; then `scheduled`, `in_progress`, `completed`. `list_requests` shows everything in flight.\n\n**Edge cases.** `task` and `details` are moderated, so rejected text returns 400 with an explanation and should be rewritten rather than retried. `requesterPhoneNumber` must be E.164 and is customer PII. `budgetUsd` is the budget before fees. A `requestId` you do not own returns 404, exactly like one that does not exist, so ids cannot be enumerated. `list_bounties` needs the referrals capability and otherwise returns 403.", + "categories": [ + "work" + ], + "primaryCategory": "work", + "keywords": [ + "humans", + "real-world tasks", + "errands", + "cleaning", + "on-site", + "human-in-the-loop", + "concierge", + "physical world", + "ops" + ], + "version": "0.2.0", + "vendor": "Rent A Human", + "vendorUrl": "https://rentahuman.ai", + "license": "Proprietary", + "sourceUrl": "https://rentahuman.ai/docs/partners", + "homepage": "https://rentahuman.ai", + "methods": [ + { + "name": "rentahuman.create_request", + "summary": "START HERE. Ask for a human to do something in the physical world, in plain language. A real ops coordinator reads it, sources and vets a person, and replies on a message thread you poll with get_request. Returns {requestId, status:\"received\", request}. Keep the requestId — every other method hangs off it. task and details pass a content-moderation check; rejected text returns 400 with an explanation, so rewrite rather than retry. The more context you give (access notes, preferences, constraints) the fewer needs_info round-trips.", + "example": null, + "gated": null + }, + { + "name": "rentahuman.get_request", + "summary": "Read one request: its current status and the full message thread with the ops coordinator. THIS IS THE POLL TARGET after create_request. Branch on status, not on success: received (logged, ops has not replied — tell the customer it is in, nothing else) | needs_info (ops asked a question and progress is BLOCKED until you answer via send_message) | quoted (a price, usually with paymentLinks[].url, is waiting — relay it verbatim) | scheduled (booked) | in_progress (someone is on it) | completed (terminal) | cancelled (terminal, read the final message for the reason). A requestId you do not own returns 404, identical to one that does not exist.", + "example": null, + "gated": null + }, + { + "name": "rentahuman.send_message", + "summary": "Send a follow-up message to the ops coordinator on a request — answer their question, or relay your customer's decision. This is the way out of a needs_info status. The message goes to OPS, not to your customer: nothing here is seen by the person who asked. Max 5,000 characters, moderated.", + "example": null, + "gated": null + }, + { + "name": "rentahuman.list_requests", + "summary": "List your requests, newest first, so an agent can see everything in flight at once. Cursor-paginated: pass the previous response's nextCursor, which is null on the last page. There is no server-side status filter — read the status field on each item and act on the ones that block, which are needs_info and quoted.", + "example": null, + "gated": null + }, + { + "name": "rentahuman.list_bounties", + "summary": "List open marketplace bounties, each with a tracked referral URL, for agents that want to surface paid real-world work rather than commission it. Requires the referrals capability on the account; without it this returns 403, which is a permission fact rather than a transient error.", + "example": null, + "gated": null + } + ], + "changelog": [ + { + "version": "0.2.0", + "notes": [ + "First release on the Pilot app store." + ] + } + ], + "grants": [ + "fs.read:$APP/config.json", + "key.sign:self", + "net.dial:broker.pilotprotocol.network", + "audit.log:*" + ], + "bundles": [ + { + "platform": "darwin-arm64", + "bytes": null + }, + { + "platform": "darwin-amd64", + "bytes": null + }, + { + "platform": "linux-arm64", + "bytes": null + }, + { + "platform": "linux-amd64", + "bytes": null + } + ], + "installedBytes": null, + "depends": [], + "protection": "shareable", + "featured": false, + "real": true, + "inCatalogue": true, + "icon": { + "mode": "image", + "img": "/appicons/io.pilot.rentahuman.png", + "fit": "cover", + "pos": "center", + "color": "#f2f0eb", + "ink": false, + "file": null, + "hue": 45 + }, + "minPilotVersion": "1.10.0", + "runtimes": [ + "go" + ], + "publishedAt": "2026-07-27", + "updatedAt": "2026-07-27", + "productDemo": { + "skill": "io.pilot.rentahuman", + "title": "Full usage demo", + "when_to_use": "When a task needs hands in the physical world — a clean, a pickup, an errand, an on-site check — and your agent needs a real person to do it and report back.", + "metered": false, + "quickstart": { + "goal": "Ask for a human to do something, in plain language", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.create_request '{\"task\":\"Deep clean a 2-bedroom apartment\",\"externalChatId\":\"thread-9f2a41c7\",\"requesterPhoneNumber\":\"+14155550100\",\"budgetUsd\":150,\"location\":\"Mission District, San Francisco, CA\"}'", + "expect": "{\"success\":true,\"requestId\":\"8FQxJ0N2VvR5aYc31TZk\",\"status\":\"received\",\"request\":{...}}", + "note": "A human ops coordinator picks this up and sources a vetted person. Keep the requestId — everything else hangs off it." + }, + "examples": [ + { + "title": "Poll the request and read the thread", + "goal": "status is the branch point, not success", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.get_request '{\"requestId\":\"8FQxJ0N2VvR5aYc31TZk\"}'", + "expect": "{\"success\":true,\"request\":{\"status\":\"quoted\",\"paymentLinks\":[{\"url\":\"https://...\"}]}}", + "note": "received -> needs_info -> quoted -> scheduled -> in_progress -> completed. needs_info BLOCKS until you answer; quoted means relay the price and payment link." + }, + { + "title": "Answer an ops question", + "goal": "Unblock a needs_info request by relaying your customer's answer", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.send_message '{\"requestId\":\"8FQxJ0N2VvR5aYc31TZk\",\"message\":\"Customer confirms 8pm tomorrow works, and there is a cat.\"}'", + "expect": "{\"success\":true,\"messageId\":\"3NcVb8sDf1gHj6kQw0Pz\"}", + "note": "This goes to the ops coordinator, not to your customer. Nothing you send here reaches them." + }, + { + "title": "See everything in flight", + "command": "pilotctl appstore call io.pilot.rentahuman rentahuman.list_requests '{\"limit\":20}'", + "expect": "{\"success\":true,\"requests\":[{\"requestId\":\"...\",\"status\":\"quoted\"}],\"nextCursor\":null}", + "note": "Newest first, cursor-paginated. No server-side status filter — read status per item." + } + ], + "gotchas": [ + "Nothing reaches your customer unless YOU send it. Ops replies, quotes and payment links are all addressed to your agent.", + "Branch on status, not success. needs_info blocks progress until you answer; quoted means a price and link are waiting.", + "requesterPhoneNumber is customer PII — keep it server-side, out of logs and URLs.", + "task and details are moderated. A 400 means rewrite, not retry.", + "budgetUsd is before fees (1-100000). Always pass dueBy if the customer gave a deadline." + ], + "next": [ + "io.pilot.rentahuman rentahuman.help '{}'" + ] + }, + "limits": null + }, + { + "id": "io.pilot.upfile", + "name": "Upfile", + "tagline": "Upload a file, get a permanent URL. One call to sign up, one to upload", + "description": "Upfile turns a file on the host into a URL an agent can hand to a human or another service. There is no dashboard and no browser step anywhere in the loop: `upfile.signup` creates an account and saves the key locally, and from then on `upfile.upload` returns a live, permanent link.\n\n**Everything returns JSON.** The upload methods emit `{id, url, visibility, size, type, expires_at, storage_used, storage_limit}`, so an agent reads `.url` rather than scraping console output.\n\n**Three shapes of link.** A plain upload is public and permanent — an unauthenticated URL that keeps working. `upload_private` puts it behind authentication. `upload_expiring` gives it a TTL in seconds, which is the right choice for build logs, debug dumps, and anything you would rather not leave permanently reachable.\n\n**Housekeeping.** `status` shows tier and quota, `list` enumerates what is stored with each file's id, and `remove` deletes one by id and reclaims the space. The free tier is 1GB total across all files.\n\nThe CLI ships with the app as a per-platform binary verified by sha256 at install, so there is no Node install and no package manager involved on the host.", + "categories": [ + "infra" + ], + "primaryCategory": "infra", + "keywords": [ + "upload", + "file-sharing", + "cli", + "cdn", + "permanent url", + "expiring link", + "artifacts", + "agents" + ], + "version": "0.2.3", + "vendor": "Upfile", + "vendorUrl": "https://upfile.sh", + "license": "MIT", + "sourceUrl": "https://github.com/upfilesh/cli", + "homepage": "https://upfile.sh", + "methods": [ + { + "name": "upfile.signup", + "summary": "START HERE if this host has no API key. Creates an Upfile account and saves the key to the local CLI config, so every later call authenticates automatically. No browser, no dashboard, no verification step. The account starts on the free tier: 1GB of storage. Everything else fails with No API key until this has been run.", + "example": null, + "gated": null + }, + { + "name": "upfile.upload", + "summary": "Upload a file from this host and get back a permanent, immediately-live URL. Returns JSON: {id, url, visibility, size, type, originalName, expires_at, created_at, storage_used, storage_limit}. Read .url. Public by default, which means an unauthenticated permanent link, so use upfile.upload_private or upfile.upload_expiring for anything you would not want to stay reachable.", + "example": null, + "gated": null + }, + { + "name": "upfile.upload_private", + "summary": "Upload a file as private, so the returned URL requires authentication rather than being open to anyone holding the link. Same JSON shape as upfile.upload, with visibility private.", + "example": null, + "gated": null + }, + { + "name": "upfile.upload_expiring", + "summary": "Upload a file with a time-to-live, so the link stops working on its own. Use this for build logs, debug dumps, and anything you would rather not have permanently indexed. Same JSON shape as upfile.upload, with expires_at set.", + "example": null, + "gated": null + }, + { + "name": "upfile.status", + "summary": "Show the account tier and how much of the storage quota is used, e.g. Tier: free Storage: 0.01GB / 1GB. Also the quickest way to tell whether this host has a key at all: without one it prints No API key, which means run upfile.signup first.", + "example": null, + "gated": null + }, + { + "name": "upfile.list", + "summary": "List the files stored on this account as JSON, newest first, with each file's id and URL. The ids are what upfile.remove takes.", + "example": null, + "gated": null + }, + { + "name": "upfile.remove", + "summary": "Delete one stored file by its id, reclaiming its space against the quota. IRREVERSIBLE: the URL stops resolving immediately.", + "example": null, + "gated": null + }, + { + "name": "upfile.version", + "summary": "Print the Upfile CLI version bundled with this app.", + "example": null, + "gated": null + }, + { + "name": "upfile.cli_help", + "summary": "The Upfile CLI's own full help text, listing every subcommand and flag including any not curated as a named method here.", + "example": null, + "gated": null + }, + { + "name": "upfile.run", + "summary": "Escape hatch: run the Upfile CLI with an arbitrary argv array, for anything the named methods do not cover such as config set/get, upgrade, or stdin uploads. Payload is {args:[...]}. Prefer the named methods when one fits, because they return JSON.", + "example": null, + "gated": null + } + ], + "changelog": [ + { + "version": "0.2.3", + "notes": [ + "First release on the Pilot app store." + ] + } + ], + "grants": [ + "fs.read:$APP/install.json", + "fs.write:$APP", + "proc.exec:upfile", + "net.dial:pub-f09f9a4ea848491198d48e329ba030e3.r2.dev", + "audit.log:*" + ], + "bundles": [ + { + "platform": "darwin-arm64", + "bytes": null + }, + { + "platform": "darwin-amd64", + "bytes": null + }, + { + "platform": "linux-arm64", + "bytes": null + }, + { + "platform": "linux-amd64", + "bytes": null + } + ], + "installedBytes": null, + "depends": [], + "protection": "shareable", + "featured": false, + "real": true, + "inCatalogue": true, + "icon": { + "mode": "image", + "img": "/appicons/io.pilot.upfile.png", + "fit": "cover", + "pos": "center", + "color": "#1c2023", + "ink": false, + "file": null, + "hue": 30 + }, + "minPilotVersion": "1.10.0", + "runtimes": [ + "go" + ], + "publishedAt": "2026-07-27", + "updatedAt": "2026-07-27", + "productDemo": { + "skill": "io.pilot.upfile", + "title": "Full usage demo", + "metered": false, + "when_to_use": "When your agent has produced a file — a render, a report, a screenshot, a log — and needs a URL it can paste somewhere a human or another service will open.", + "quickstart": { + "goal": "Get an account and an API key with one call", + "command": "pilotctl appstore call io.pilot.upfile upfile.signup '{\"email\":\"you@example.com\"}'", + "expect": "Account created. API key: upf_... Tier: free (1GB). Key saved.", + "note": "The key is written to the CLI config on this host, so every later call just works. No dashboard, no browser." + }, + "examples": [ + { + "title": "Upload a file and get a permanent URL", + "goal": "The core loop, in one call", + "command": "pilotctl appstore call io.pilot.upfile upfile.upload '{\"path\":\"/tmp/report.pdf\"}'", + "expect": "{\"id\":\"tRbBqIyEiB\",\"url\":\"https://cdn.upfile.sh/tRbBqIyEiB.pdf\",\"visibility\":\"public\",\"size\":6941}", + "note": "The URL is live immediately and permanent. Always JSON, so read .url straight out of it." + }, + { + "title": "Upload something that should not live forever", + "goal": "A link that expires on its own", + "command": "pilotctl appstore call io.pilot.upfile upfile.upload_expiring '{\"path\":\"/tmp/build.log\",\"expiry\":3600}'", + "expect": "{\"id\":\"...\",\"url\":\"https://cdn.upfile.sh/....log\",\"expires_at\":\"2026-08-06T17:00:00.000Z\"}", + "note": "expiry is seconds. Use it for anything you would not want indexed a year from now." + }, + { + "title": "Check what you have stored", + "command": "pilotctl appstore call io.pilot.upfile upfile.status '{}'", + "expect": "Tier: free Storage: 0.01GB / 1GB", + "note": "Free tier is 1GB. upfile.list shows individual files; upfile.remove deletes one by id." + } + ], + "gotchas": [ + "Run upfile.signup once per host if there is no key. Everything else fails with No API key until you do.", + "Read .url from the JSON — the human-readable output is not stable.", + "A plain upload is a permanent, unauthenticated URL. Use upload_private or upload_expiring for anything sensitive.", + "expiry is in SECONDS, not minutes. 3600 is an hour.", + "Free tier is 1GB total, not per file. Use upfile.remove to reclaim space." + ], + "next": [ + "io.pilot.upfile upfile.help '{}'" + ] + }, + "limits": null + }, { "id": "io.pilot.primitive", "name": "Primitive", diff --git a/src/pages/app-store.astro b/src/pages/app-store.astro index ac4ccaf3..6868fae2 100644 --- a/src/pages/app-store.astro +++ b/src/pages/app-store.astro @@ -17,7 +17,7 @@ const canonicalUrl = 'https://pilotprotocol.network/app-store'; const featured = featuredApps(); const hero = featured[0]; const sideFeatured = featured.slice(1, 4); -const freshPinned = ['io.pilot.bowmark', 'io.pilot.primitive', 'io.pilot.didit', 'io.pilot.agentphone', 'io.pilot.orthogonal', 'io.pilot.miren', 'io.pilot.smol', 'io.pilot.wallet', 'io.pilot.slipstream']; +const freshPinned = ['io.pilot.dial', 'io.pilot.deadsimple', 'io.pilot.kinetic', 'io.pilot.rentahuman', 'io.pilot.upfile', 'io.pilot.bowmark', 'io.pilot.primitive', 'io.pilot.didit', 'io.pilot.agentphone', 'io.pilot.orthogonal', 'io.pilot.miren', 'io.pilot.smol', 'io.pilot.wallet', 'io.pilot.slipstream']; const freshExclude = new Set(['io.pilot.postgres', 'io.pilot.docker']); const fresh = [ ...freshPinned.map((id) => apps.find((a) => a.id === id)).filter(Boolean), diff --git a/src/pages/plain/app-store.astro b/src/pages/plain/app-store.astro index a5413708..9764f700 100644 --- a/src/pages/plain/app-store.astro +++ b/src/pages/plain/app-store.astro @@ -1,7 +1,7 @@ --- // Auto-generated by scripts/regen-plain.mjs. Edit the marketing source and re-run. // plain-source: src/pages/app-store.astro -// plain-source-sha256: 5cf4c4c205f936965e2b6484415eb9358359b902286c3176eaa0cdcbac5b5803 +// plain-source-sha256: 04bae3bad432a4b65561a048fad2aabf49b6f2fc590f4b74d4a4823fe007dc37 import PlainLayout from '../../layouts/PlainLayout.astro'; ---