The Silo Java client carries the same object model as the TypeScript client — immutable handles, typed entries, filter builders, window-driven pagination, and aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/org-quicko/silo/llms.txt
Use this file to discover all available pages before exploring further.
RouteInventory that lists every route the client covers — adapted for Java idioms. A consumer reading both clients should not meet two vocabularies for one service. Three things that could not cross the language boundary are called out explicitly below.
Installation
in.org.quicko.silo:client. Built on OkHttp and Jackson, requiring Java 25 or newer.
Basic usage
The path model is identical to TypeScript: client → project → environment → collection.silo.project("moviespace").environment("prod") sends no request — it only builds the path.
Entry shape
The Java client splits the flat TypeScript row intoEntry<F>. TypeScript can express Fields & EntryEnvelope as a single flat type because it has structural typing; Java cannot name a type that is both the caller’s Movie and an envelope without requiring every consumer DTO to extend a library base class.
Instant on the same reasoning: the flat TypeScript row went back out unchanged, so strings were kept there; the Java row never does.
CRUD operations
Reading raw before editing
Silo resolves{{VARIABLE}} references on the way out. Read raw before editing to avoid writing a resolved value back over a template reference.
Filters
Filters are untyped — there is no Java equivalent of TypeScript’skeyof Movie. Use string field names directly.
The Java method is
isEqualTo where TypeScript uses equals. See the naming differences table below.isEqualTo, notEqualTo, contains, greaterThan, atLeast, lessThan, atMost, oneOf, exists — combined with and, or, not.
Pagination
all() and pages() iterate for you:
All calls block
Every method blocks the calling thread. There is noCompletableFuture counterpart — Java 25 virtual threads supply the concurrency model underneath, and a parallel API would double the surface for the same result.
Use CancellationSignal to cancel or time out a call:
Variables
Declare a variable once per project, then give it a value per environment. Silo substitutes{{NAME}} in entries on the way out.
{{CDN_URL}} standing in the response. An empty value substitutes as empty.
Search
The reach is wherever you callsearch — it cannot be widened by forgetting a parameter.
Media
The media library is instance-global and hangs off the client.Optional Caffeine caching
Enable caching onSiloOptions:
@Cache(ttl = 30, maxSize = 1024) decorates the entry read methods. Both values are optional in the annotation — what a read states wins, and what it leaves out is taken from CacheOptions. A number neither side names is refused rather than invented.
Only entry reads are cached. Successful writes (create, replace, delete, rename, schema delete) invalidate the affected collection’s cached responses. Schemas, searches, variables, and media always reach the server. Each Silo instance owns its own cache; withKey() and withUrl() start empty.
Naming differences from TypeScript
Five names differ from their TypeScript counterparts, each because of a collision or a language convention:| Java | TypeScript | Reason |
|---|---|---|
isEqualTo | equals | Object.equals collision |
CollectionCatalog | CollectionPage | java.util.Collection collision |
RequestTimeoutException | TimeoutError | Java Error vs Exception convention |
SiloException | SiloError | Java Error vs Exception convention |
within / preview / matching | for / preview / where | for is a reserved keyword |
RouteInventoryDriftTest parses the TypeScript route inventory and holds the two lists equal, so the clients stay in sync as routes are added.
Error handling
SiloException is the base for anything Silo refused: ValidationFailedException, UnauthorizedException, ForbiddenException, NotFoundException, ConflictException, MediaInUseException, MediaDeleteStalledException, and InternalException.
NetworkException, RequestTimeoutException, RequestAbortedException, and InvalidResponseException are not SiloException — Silo never answered.
Anonymous access
Omit the key to reach collections whose schema does not require authentication.Source and releases
The Java client lives inpackages/silo-client-java in the Silo repository and releases independently under silo-client-java-v* tags.
A
module-info.java is written but deferred — the compiler plugin in use cannot parse Java 25 class files. Treat the transport package as internal by convention until the descriptor ships.