Haiping

118 posts

Haiping

Haiping

@haipingfu

Building next generation data platform for AI, ex-AWS/S3

Vancouver, BC, Canada Katılım Mayıs 2023
669 Takip Edilen106 Takipçiler
Sabitlenmiş Tweet
Haiping
Haiping@haipingfu·
Introducing Crab: a serverless Git remote storage solution for teams working with large files. Git is still the best collaboration model we have for software: branches, commits, review, rollback, CI, and history. But modern repositories no longer contain only code. They contain model weights, datasets, media assets, simulation outputs, build artifacts, checkpoints, design files, and other large binary payloads that can easily reach gigabytes or terabytes. That creates a painful tradeoff. Plain Git bloats history. Git LFS adds another server, endpoint, quota model, and operational surface. Manual object-storage buckets keep bytes somewhere durable, but they separate the data from Git history and make collaboration harder to reason about. Crab is built around a simpler idea: Keep Git as the interface. Use your cloud object storage as the backend. Remove the server layer in between. With Crab, developers keep using familiar Git workflows. Commits, branches, reviews, worktrees, CI, and rollback still behave like Git. Large-file bytes are routed into customer-owned object storage such as S3, GCS, or Azure Blob. The repository stays lightweight because Git carries metadata and tiny pointer files, while the real payloads live durably in your bucket. A normal workflow looks like: crab init crab add models/ git commit crab push Or, where configured, teams can keep using familiar Git commands like `git add` and `git push` through Crab’s Git integration. Under the hood, Crab uses Git remote-helper and filter-process concepts to make large-file handling feel native. The developer works in Git, while Crab manages chunking, deduplication, upload, checkout, hydration, and storage layout. The technical model is designed for large binary data. Large files are split into content-defined chunks, so small edits do not necessarily rewrite the entire file. Crab can identify which chunks are already known and which chunks are new. Known chunks skip upload. New chunks upload once. Chunks are packed into xorbs to reduce duplicate storage, bandwidth, and object request volume. That matters when teams are moving ML checkpoints, datasets, media, or build artifacts repeatedly across branches and CI jobs. Clone and checkout are also designed for large repos. Instead of forcing every user or CI job to materialize terabytes immediately, Crab can clone metadata first. Teams can inspect branches, review code, and start work quickly with lightweight pointer checkout, then hydrate real bytes only when needed. Access modes are flexible: crab hydrate downloads selected content. crab dehydrate frees local disk by returning files to pointer form. crab mount supports on-demand reads through a virtual filesystem. CI and desktop workflows can hydrate only the files they actually need. For enterprise teams, the important part is ownership and control. Crab does not require a central LFS server or a new database service. Storage stays in your cloud account. Your buckets, IAM, lifecycle rules, encryption posture, and identity model remain the control plane. Crab is designed to fit enterprise auth and operational requirements: customer-owned buckets, IAM, OIDC, Entra ID, Workload Identity, encrypted local token cache, structured CLI output, and operational commands such as doctor, status, fsck, and gc. This gives infra teams fewer services to run and gives developers a workflow that still feels like Git. The business benefits are straightforward: Less Git bloat. No separate LFS server to operate. Large files stay versioned with the repo. Object storage remains customer-owned. CI can avoid unnecessary downloads. Teams can adopt gradually instead of rewriting everything at once. Costs can be managed with lifecycle policies and storage tiering. Existing Git habits remain intact. Crab is especially useful for teams building with: ML models and checkpoints Training and evaluation datasets Media and creative assets Large generated artifacts Scientific or simulation outputs Game assets Build cache outputs Enterprise repos that have outgrown normal Git storage The goal is not to replace Git. The goal is to let Git keep doing what it is excellent at: collaboration, review, history, and coordination. Crab turns object storage into an enterprise Git remote for large files. Git-native large files. Your cloud. No server layer. DM open for early users ;) Powered by @huggingface xet protocol github.com/huggingface/xe…, @criccomini 's SlateDB github.com/slatedb/slatedb, and @theelbasian 's Gitoxide github.com/gitoxidelabs/g…
English
2
1
31
12.4K
Haiping
Haiping@haipingfu·
@Trion129 The prolly rust implementation has been improved thanks to GPT-5.6 Sol xhigh, the rust prolly point read and range scan are much faster now by utilizing zero-copy technology. x.com/haipingfu/stat…
Haiping@haipingfu

One lesson from my experience working on AWS/S3 has stayed with me: building infrastructure that is universally useful to application developers is extremely hard. S3 became foundational by doing one thing—object storage—exceptionally well. The interface appears simple, but making it durable, scalable, predictable, and useful across millions of applications requires enormous discipline. That philosophy guides my work on Prolly Tree. I want Prolly Tree to do one thing exceptionally well: provide a fast, deterministic, content-addressed foundation for versioned data. Snapshots, structural sharing, diffs, merges, branching, rollback, and verification should be properties of the infrastructure—not features every application team must rebuild. My latest Rust enhancements introduce zero-copy reads, packed immutable nodes, optimized key comparisons, bounded session-local routing, and borrowed point-read and range-scan traversal. In my validated 10M-key benchmark—three-run medians, one worker, in-memory storage—the Rust Prolly implementation won all 18 latency comparisons against the Go Prolly implementation: • Point reads: 1.68–5.75× faster • Full range scans: 6.61–6.77× faster • Writes: 1.99–52.14× faster I’m keeping the results honest. Fresh-random point reads are still below my universal 2× target, and Rust mutation-random memory usage was slightly higher: 6.37 GiB versus 6.16 GiB. Those are areas I intend to improve further. My long-term hope is that Prolly Tree can become a dependable backbone component for both version-control systems and the AI-agent era—where applications increasingly need durable state, history, branching, reproducibility, auditing, and safe collaboration between humans and agents. Infrastructure only becomes universal when builders can adopt it from their existing stacks. That’s why I’m also investing in bindings for Go, Java/Kotlin, and TypeScript—not only the Rust core. The current 10M-key benchmark is only one milestone. Larger-scale performance tests, broader workload coverage, cold-cache behavior, concurrency, and storage-backed benchmarks are all on my TODO list. One focused infrastructure primitive, implemented exceptionally well, and made available to every application builder. Stay tuned. github.com/crabbuild/prol…

English
0
0
0
35
Trion
Trion@Trion129·
@haipingfu Interesting results, I would've thought Rust would end up beating Go in all benchmarks. What causes Go to be better at these scans and reads?
English
1
0
0
36
Haiping
Haiping@haipingfu·
Two prolly trees. Two languages. Different strengths. We benchmarked our Rust prolly-tree implementation against the Go implementation from Dolt using identical deterministic workloads at up to 10M records. Both implementations provide content-addressed, persistent ordered maps. The goal isn’t to crown one universal winner—it’s to give technical teams strong Go and Rust options with clearly measured trade-offs. The Rust implementation currently specializes in high-throughput construction, append-heavy ingestion, and bulk mutation. The Go implementation demonstrates excellent traversal performance, leading full range scans and most fresh-tree point-read workloads in this benchmark. That gives us a clear roadmap for the next Rust release: improve point reads and range scans while preserving its write throughput. We’re profiling traversal, decoding, allocation, and cache-locality hot paths now. Methodology: 1. One worker per implementation 2. In-memory storage 3. 10M fixed-width string keys 4. Deterministic 1–100-byte values 5. Identical workload digests and operation counts 6. Validated point-read values, scan ordering, and cardinality The 10M figures are one complete measured pass; three-run tests through 1M confirmed the same overall direction. 10M records — fresh tree construction (All values are ns/op; lower is better): Rust prolly tree: github.com/crabbuild/prol… Go prolly tree: github.com/dolthub/dolt/t…
Haiping tweet media
English
1
2
13
1.2K
Haiping
Haiping@haipingfu·
One lesson from my experience working on AWS/S3 has stayed with me: building infrastructure that is universally useful to application developers is extremely hard. S3 became foundational by doing one thing—object storage—exceptionally well. The interface appears simple, but making it durable, scalable, predictable, and useful across millions of applications requires enormous discipline. That philosophy guides my work on Prolly Tree. I want Prolly Tree to do one thing exceptionally well: provide a fast, deterministic, content-addressed foundation for versioned data. Snapshots, structural sharing, diffs, merges, branching, rollback, and verification should be properties of the infrastructure—not features every application team must rebuild. My latest Rust enhancements introduce zero-copy reads, packed immutable nodes, optimized key comparisons, bounded session-local routing, and borrowed point-read and range-scan traversal. In my validated 10M-key benchmark—three-run medians, one worker, in-memory storage—the Rust Prolly implementation won all 18 latency comparisons against the Go Prolly implementation: • Point reads: 1.68–5.75× faster • Full range scans: 6.61–6.77× faster • Writes: 1.99–52.14× faster I’m keeping the results honest. Fresh-random point reads are still below my universal 2× target, and Rust mutation-random memory usage was slightly higher: 6.37 GiB versus 6.16 GiB. Those are areas I intend to improve further. My long-term hope is that Prolly Tree can become a dependable backbone component for both version-control systems and the AI-agent era—where applications increasingly need durable state, history, branching, reproducibility, auditing, and safe collaboration between humans and agents. Infrastructure only becomes universal when builders can adopt it from their existing stacks. That’s why I’m also investing in bindings for Go, Java/Kotlin, and TypeScript—not only the Rust core. The current 10M-key benchmark is only one milestone. Larger-scale performance tests, broader workload coverage, cold-cache behavior, concurrency, and storage-backed benchmarks are all on my TODO list. One focused infrastructure primitive, implemented exceptionally well, and made available to every application builder. Stay tuned. github.com/crabbuild/prol…
Haiping tweet media
English
1
1
15
1.3K
Haiping
Haiping@haipingfu·
Zed is now my favourite editor(when I still use editor).
English
1
0
2
343
Haiping retweetledi
Tibo
Tibo@thsottiaux·
Another reset for our Codex and ChatGPT Work users. Actually hit 9M active users way earlier today, but then got distracted by the approximately millions of things the team is doing to keep the systems up and reliable. Should have that sweet 100% weekly usage limit back in a few minutes. Go be your productive self and close twitter. Shoo!
English
2.2K
851
15K
1.4M
Haiping
Haiping@haipingfu·
Couldn’t agree more, it’s why I am building Trail, a prolly tree backed operation database for code and text worktrees. Trail records the work that happens between commits: saves, patches, branches, agent edits, merges, and line-level provenance.
Entire@EntireHQ

Code isn’t the only artifact anymore. Sessions. Prompts. Tool calls. Checkpoints. Intent. Outcomes. Every clone should carry them all. It's time for a new system of record for software development.

English
0
0
5
952
Haiping
Haiping@haipingfu·
Codex 5.6 Sol on Extra High is so capable that I literally prompt: “Don’t use any skills”—just to save tokens. No step-by-step instructions. I state the idea and the goal; Codex figures out the execution. github.com/crabbuild/prol… to introduce proximity map in prolly
Haiping tweet media
English
0
0
1
73
Haiping
Haiping@haipingfu·
Most applications overwrite data in place. Then, when users ask for history, comparison, branching, merging, or rollback, we bolt those capabilities on later. Prolly starts from a different idea: What if version-control semantics were built into the data layer? Prolly is an open-source(MIT), content-addressed, immutable map engine. Every update creates a new snapshot instead of destroying the previous one. Unchanged parts are shared between versions, so the entire dataset does not need to be copied whenever something changes. That gives applications efficient building blocks for history, diff, merge, rollback, synchronization, and reproducibility. We’ve recently added three major capabilities: 1. VersionedMap Use it like a normal ordered key/value map, but with automatic immutable versions and a current head. You can read historical data, compare versions, pin a request to an exact snapshot, merge changes, and roll back safely. 2. Secondary indexes Query the same versioned data through alternate fields such as user, status, tag, email, or timestamp. Source data and indexes are committed atomically, so each snapshot is associated with the exact index state built from it—without torn or inconsistent reads. 3. ProximityMap A deterministic, content-addressed vector index for similarity search inspired by the excellent blog dolthub.com/blog/2025-06-2…. It brings versioning and reproducibility to embeddings and semantic retrieval, instead of treating the vector index as unrelated mutable state. Together, these components make Prolly a useful foundation for applications whose data needs version-control semantics. One example is a versioned agent memory layer. An agent could: • Start every run from an exact memory snapshot • Write proposed memories without overwriting canonical state • Find memories by user, tag, or time through secondary indexes • Retrieve semantically related memories through ProximityMap • Show a human-readable diff before accepting changes • Merge approved memories, resolve conflicts, or roll back • Record the exact memory and retrieval versions used for an answer Agent memory becomes inspectable, reproducible, and recoverable—not just a mutable blob that silently changes over time. And Prolly is not limited to one language or storage system. The repository includes bindings for: • Python • Node.js and TypeScript • Go • Kotlin/JVM and Java • Ruby • Swift • Browser WebAssembly These bindings wrap the same Rust reference engine and share conformance fixtures for consistent behavior across runtimes. The storage layer is pluggable as well. For local and embedded applications, Prolly supports memory, file, SQLite, RocksDB, PGlite, and SlateDB-backed storage. For remote and cloud deployments, adapters are available for PostgreSQL, MySQL, Redis, DynamoDB, Azure Cosmos DB, and Google Cloud Spanner. One versioned data model, with the language and storage backend that best fits your application. The same primitives can support local-first applications, collaborative workspaces, document histories, configuration management, reproducible RAG, data pipelines, audit-friendly systems, and many other products. Prolly is not a full Git clone. It provides the underlying versioned storage primitives; your application defines its commits, permissions, workflows, and user experience. If you’re building version control for application data—not only source code—we’d love for you to try Prolly. github.com/crabbuild/prol… #rustlang #opensource
English
2
0
1
169
Haiping
Haiping@haipingfu·
I just released prolly-map to crates.io — an open-source Rust implementation of prolly trees, and a core data primitive behind Crab/Trail. It is an immutable, content-addressed ordered map designed for data that needs to be versioned, compared, merged, synchronized, and verified. Think B+ tree-style ordered access combined with Merkle-style identity: • Immutable snapshots and cheap branching • Content-addressed nodes with structural sharing • Efficient diff and three-way merge • CRDT-style conflict resolution • Range scans and parallel bulk loading • Verifiable key, range, and diff proofs • Pluggable storage through the Store trait The same content always produces the same tree structure and root CID. Change one key, and only the affected path is rewritten—the unchanged subtrees are reused. This makes it useful for versioned databases, local-first sync, agent memory and checkpoints, reproducible RAG indexes, Git-like data models, and collaborative applications. cargo add prolly-map use prolly::{Config, MemStore, Prolly}; This is the first public release. Feedback, issues, and contributions are welcome. Docs: docs.rs/prolly-map/lat… GitHub: github.com/crabbuild/prol…
English
2
1
1
325
Haiping
Haiping@haipingfu·
@harveyfullstack The vision of Trail is quite ambitious, but for now I am doing lots of tests and verifications on it, my current priority is to make it much easier for my daily workflow when I use code agents.
English
0
0
1
21
Jeremiah
Jeremiah@harveyfullstack·
@haipingfu Very comprehensive! Love it. Have you benefited any use out of it yet? I'm super curious to see how this pans out over long-form work across different sessions.
English
1
0
0
30
Haiping
Haiping@haipingfu·
Introducing Trail! AI coding agents create more than a final diff. They generate prompts, attempts, tool calls, partial patches, checkpoints, test runs, approvals, review notes, and handoffs. But when the work becomes a Git commit, most of that operational context disappears. That’s the problem Trail is built to solve. Trail is a local-first operation database for code and text worktrees. It gives coding agents branch-like memory, transcripts, checkpoints, and rewind—without polluting your active Git branch. Trail does not replace Git. Git remains the publication and synchronization layer: commits, branches, remotes, and PRs. Trail handles the high-frequency local work between commits, preserving what happened, why it happened, and whether it is safe to accept. This makes questions that are difficult to answer with Git alone directly queryable: • Which operation introduced this line? • What did an agent change before the final commit? • What happened during the task? • Is the work blocked by conflicts, pending approvals, a dirty workdir, or missing tests? • Can we rewind to a known-good checkpoint? The core abstraction is a lane: isolated, branch-backed code state plus the context needed to safely complete one task. A lane can record sessions, turns, messages, traces, patches, approvals, test/eval gates, checkpoints, handoffs, and merge readiness. It can stay virtual until a tool actually needs files, or use a materialized or sparse workdir. Under the hood, Trail is written in Rust. A content-addressed graph of operations and worktree roots is the durable source of truth. SQLite powers indexes, lane state, and queues. Prolly maps store paths, files, text, and line order. Stable ChangeId, FileId, and LineId values support provenance and line-aware patching. The same core powers the CLI, a loopback HTTP/OpenAPI interface, an MCP stdio server, and the Rust API. Workspace state remains local under .trail/, with ignore policies, guardrails, approvals, and readiness checks protecting mutations. A basic workflow looks like this: trail init --working-tree trail lane spawn fix-login --from main --materialize=true trail lane record fix-login -m "Fix login validation" trail lane readiness fix-login trail merge-lane fix-login --into main --dry-run Then query the operational history: trail why src/auth.rs:42 trail history src/auth.rs trail transcript fix-login The impact is simple: agent work becomes isolated, explainable, reviewable, recoverable, and safer to merge. Developers can run more agents in parallel without losing control of how the code was produced. Git keeps the accepted history. Trail preserves the operational story behind it. Explore Trail: github.com/crabbuild/trail
English
3
1
43
3.2K
Haiping
Haiping@haipingfu·
@KolbeYang I am still enhancing the Trail’s usability, currently the daily workflow is a bit tedious and requires lots of mind burden from end user, I would hope to improve trail and make it easier to use in coming days : )
English
0
0
1
45
Kolbe Yang
Kolbe Yang@KolbeYang·
@haipingfu Hmm this actually seems pretty useful, might try. Nowadays I’ve just been getting used to massive Claude Code comments to hopefully maintain enough context for future agents.
English
1
0
0
59
Haiping
Haiping@haipingfu·
AI coding agents deserve something better than Git worktrees. A Git worktree gives an agent an isolated branch checkout. That’s useful, but it doesn’t isolate or understand the rest of the task: dependencies, build output, prompts, tool calls, checkpoints, validation, review state, or how the work should safely land. A Trail lane isolates the whole unit of work. Each agent gets a normal-looking filesystem backed by a layered, copy-on-write workspace: a pinned source snapshot, shared immutable dependency and cache layers, and private writable layers for that lane’s source changes and generated output. This changes the scaling equation. Instead of: agents × (checkout + node_modules + build output) You get: one source base + one layer per environment + shared caches + each lane’s actual delta The safety model matters just as much as the storage savings. Agents never share writable dependencies or build state. One agent can install, clean, build, reset, or crash without changing another lane—or touching your real Git worktree. And a lane isn’t merely a filesystem sandbox. It can preserve the prompts, tools, patches, checkpoints, tests, approvals, provenance, and review state behind the diff. Work can be rewound, handed off, validated, queued, and landed deliberately. Git stays exactly where it belongs: the publication and synchronization layer for accepted history. Trail becomes the high-frequency coordination layer before the commit—where parallel agent work stays efficient, isolated, explainable, recoverable, and safe. More exciting features coming to Trail.
English
0
1
14
2.2K
Haiping
Haiping@haipingfu·
@jezell @kylegalbraith It’s really good to see different visions and solutions on how git should work in AI/agent era.
English
0
0
2
24
Kyle Galbraith
Kyle Galbraith@kylegalbraith·
Depot Code, our own source control hosting, is now available in private beta 🚀 It's entirely git under the hood, but with a git server built on top of blob storage for higher throughput, better reliability, and increased scale. Why build source control? It's the next bottleneck we see across the pipelines we power. We've spent the past three years rebuilding software delivery around infrastructure primitives to make delivery exponentially faster. Our rationale is simple: the faster each primitive is, the faster the overall process is. It's exciting to reach a point where we can start the feedback loop and iterate on where this is headed! Check out the full blog post and sign up for private beta access 👇 depot.dev/blog/now-avail…
English
8
4
33
2.4K