| ... | ... | | @@ -743,58 +766,124 @@ code { |
| 743 | 766 | | <p style="text-align:center; margin-top: 1.5rem; color: var(--text-dim);"> |
| 744 | 767 | | Same <code>pico.sh</code>. Same <code>zmx attach</code>. Same experience. Your infra or ours. |
| 745 | 768 | | </p> |
| 769 | + | <div style="text-align:center; margin-top: 1rem;"> |
| 770 | + | <span style="background: var(--surface); padding: 0.3rem 0.8rem; border-radius: 4px; font-size: 0.85rem; color: var(--yellow);"> |
| 771 | + | Bring your own isolation — docker, namespaces, bare metal. You choose. |
| 772 | + | </span> |
| 773 | + | </div> |
| 774 | + | </div> |
| 775 | + | </section> |
| 776 | + |
|
| 777 | + | <!-- ============================================================ |
| 778 | + | POWERED BY deploy.pico.sh |
| 779 | + | ============================================================ --> |
| 780 | + | <section id="infra"> |
| 781 | + | <div class="container"> |
| 782 | + | <p class="section-label">Infrastructure</p> |
| 783 | + | <h2>Powered by deploy.pico.sh</h2> |
| 784 | + | <div class="two-col"> |
| 785 | + | <div> |
| 786 | + | <p> |
| 787 | + | <strong>ci.pico.sh</strong> runs on <strong>deploy.pico.sh</strong> — our SSH VM service |
| 788 | + | on hardware we own. Not AWS. Not GCP. Not a cloud provider. |
| 789 | + | </p> |
| 790 | + | <p> |
| 791 | + | Push a <code>docker-compose.yml</code> to an SSH endpoint and your containers are live. |
| 792 | + | Label a service and it gets a public HTTP URL. No cloud console, no CLI SDK, |
| 793 | + | no provider lock-in. |
| 794 | + | </p> |
| 795 | + | <p> |
| 796 | + | The same platform that runs your CI runs your apps. |
| 797 | + | </p> |
| 798 | + | <ul class="check-list"> |
| 799 | + | <li>Our hardware — not a hyperscaler</li> |
| 800 | + | <li>Docker Compose via <code>git push</code></li> |
| 801 | + | <li>Expose HTTP services with compose labels</li> |
| 802 | + | <li>Limited inventory — when it's gone, it's gone</li> |
| 803 | + | </ul> |
| 804 | + | </div> |
| 805 | + | <div class="terminal"> |
| 806 | + | <div class="terminal-bar"> |
| 807 | + | <span class="dot red"></span> |
| 808 | + | <span class="dot yellow"></span> |
| 809 | + | <span class="dot green"></span> |
| 810 | + | <span style="margin-left: 0.5rem;">deploy.pico.sh</span> |
| 811 | + | </div> |
| 812 | + | <div class="terminal-body"> |
| 813 | + | <div><span class="comment">--- docker-compose.yml ---</span></div> |
| 814 | + | <div>services:</div> |
| 815 | + | <div> api:</div> |
| 816 | + | <div> image: myapp:latest</div> |
| 817 | + | <div> labels:</div> |
| 818 | + | <div> pico.http.expose: "true"</div> |
| 819 | + | <div> pico.http.host: "api.myapp.pico.sh"</div> |
| 820 | + | <div> </div> |
| 821 | + | <div><span class="prompt">$ </span><span class="cmd">git remote add deploy ssh://deploy.pico.sh/myapp</span></div> |
| 822 | + | <div><span class="prompt">$ </span><span class="cmd">git push deploy main</span></div> |
| 823 | + | <div> </div> |
| 824 | + | <div><span class="info">→ containers deployed</span></div> |
| 825 | + | <div><span class="info">→ api.myapp.pico.sh is live</span></div> |
| 826 | + | </div> |
| 827 | + | </div> |
| 828 | + | </div> |
| 746 | 829 | | </div> |
| 747 | 830 | | </section> |
| 748 | 831 | |
|
| 749 | 832 | | <!-- ============================================================ |
| 750 | | - | FEATURES GRID |
| 833 | + | FEATURES |
| 751 | 834 | | ============================================================ --> |
| 752 | 835 | | <section id="features"> |
| 753 | 836 | | <div class="container"> |
| 754 | 837 | | <p class="section-label">Features</p> |
| 755 | | - | <h2>Everything else just works.</h2> |
| 838 | + | <h2>Built for terminals, agents, and humans.</h2> |
| 756 | 839 | | <div class="feature-grid"> |
| 757 | 840 | | <div class="feature-card"> |
| 758 | | - | <div class="icon">🔌</div> |
| 759 | | - | <h3>SSH-First</h3> |
| 760 | | - | <p>No HTTP APIs. No webhooks to configure. No OAuth tokens. SSH keys are your auth, SSH pubsub is your event bus.</p> |
| 761 | | - | </div> |
| 762 | | - | <div class="feature-card"> |
| 763 | | - | <div class="icon">📊</div> |
| 764 | | - | <h3>JSONL Status Stream</h3> |
| 765 | | - | <p><code>pici monitor | curl -sd"$line" $WEBHOOK</code> — pipe build status to Discord, Slack, or any endpoint.</p> |
| 766 | | - | </div> |
| 767 | | - | <div class="feature-card"> |
| 768 | | - | <div class="icon">🧹</div> |
| 769 | | - | <h3>Auto-Cancel on Push</h3> |
| 770 | | - | <p>New commit? The old job is killed automatically. No stale builds wasting resources.</p> |
| 841 | + | <div class="icon">🤖</div> |
| 842 | + | <h3>AI-Agent Friendly</h3> |
| 843 | + | <p> |
| 844 | + | Terminal workflows, rsync + SSH pubsub, JSONL status streams — everything an agent |
| 845 | + | needs to trigger builds, monitor progress, and attach to failures. No OAuth flows, |
| 846 | + | no API rate limits, no webhooks. An agent can start as many jobs as it wants |
| 847 | + | and read results as structured text. |
| 848 | + | </p> |
| 771 | 849 | | </div> |
| 772 | 850 | | <div class="feature-card"> |
| 773 | | - | <div class="icon">🗑️</div> |
| 774 | | - | <h3>Auto Garbage Collection</h3> |
| 775 | | - | <p>Old sessions cleaned up automatically. No manual cleanup scripts.</p> |
| 851 | + | <div class="icon">🔌</div> |
| 852 | + | <h3>SSH-First</h3> |
| 853 | + | <p> |
| 854 | + | No HTTP APIs to expose. No webhooks to configure. No OAuth tokens to manage. |
| 855 | + | SSH keys are your auth. SSH pubsub is your event bus. |
| 856 | + | If SSH works, CI works. |
| 857 | + | </p> |
| 776 | 858 | | </div> |
| 777 | 859 | | <div class="feature-card"> |
| 778 | | - | <div class="icon">📦</div> |
| 779 | | - | <h3>Live Artifacts</h3> |
| 780 | | - | <p>HTML session pages generated during the build, not just after. See progress in real-time.</p> |
| 860 | + | <div class="icon">📄</div> |
| 861 | + | <h3>Static Site Artifacts</h3> |
| 862 | + | <p> |
| 863 | + | Build artifacts are plain HTML + CSS. No JavaScript. No app server. No build step. |
| 864 | + | Serve the directory with any static host — nginx, s3, pgs.sh, <code>python -m http.server</code>. |
| 865 | + | Zero runtime dependencies. |
| 866 | + | </p> |
| 781 | 867 | | </div> |
| 782 | 868 | | <div class="feature-card"> |
| 783 | 869 | | <div class="icon">🔐</div> |
| 784 | 870 | | <h3>Build Attestation</h3> |
| 785 | | - | <p>Automatic provenance: runner hostname, OS, arch, repo, branch, commit, workspace checksum.</p> |
| 871 | + | <p> |
| 872 | + | Automatic provenance baked into every job: runner hostname, OS, arch, repo, branch, |
| 873 | + | commit, and workspace checksum. Supply-chain ready without extra tooling. |
| 874 | + | </p> |
| 786 | 875 | | </div> |
| 787 | 876 | | </div> |
| 788 | 877 | | </div> |
| 789 | 878 | | </section> |
| 790 | 879 | |
|
| 791 | 880 | | <!-- ============================================================ |
| 792 | | - | COMPARISON — Other CI vs pici |
| 881 | + | COMPARISON |
| 793 | 882 | | ============================================================ --> |
| 794 | 883 | | <section id="compare"> |
| 795 | 884 | | <div class="container"> |
| 796 | 885 | | <p class="section-label">Comparison</p> |
| 797 | | - | <h2>Other CI gives you logs. pici gives you a shell.</h2> |
| 886 | + | <h2>The difference is the terminal.</h2> |
| 798 | 887 | | <div class="code-compare"> |
| 799 | 888 | | <div> |
| 800 | 889 | | <div class="label bad">Other CI</div> |