Bosca / Developers

Bosca for Developers

Build on Bosca,
the way Bosca is built.

Bosca is a full platform — content, work, identity, Git, and more — and you extend it the same way it's built: repositories, services, GraphQL types, REST routes, and jobs, written in Kotlin and wired together at compile time.

How it works

Declare, wire, serve.

01

Declare

Define your types in the GraphQL schema, then write the model, repository, service, and controller in Kotlin that back them.

02

Wire

At build time, the compiler reads your annotations and connects it all — generating the JDBC from your SQL, and wiring your services, controllers, and routes into the server.

03

Serve

Your feature is live in the same server, on the same schema — and can call content, work, Git, and every other subsystem through their services, the way they call each other.

The toolkit

The tools you build with

The building blocks are the ones the platform itself is made of — repositories, services, controllers, routes, and jobs, written in Kotlin and wired together at compile time.

Repositories from SQL

@Repository with @Query turns raw SQL and named parameters into a typed, suspending JDBC repository.

Services & injection

@ServiceImplementation registers a service with the container — resolved and constructor-injected at startup.

GraphQL controllers

@TypeController and @Field bind a controller to your schema types, right beside every other subsystem's.

REST routes

@RouteController maps a handler to a path and method, with its authentication declared inline.

Jobs & events

@JobDefinition and @JobEvent generate typed enqueue helpers and a dispatch() that runs work and publishes events.

No runtime reflection

Every binding is generated at build time. What ships is the code you would have written by hand.

Modular & versioned

Bosca is a set of independently-versioned modules, published as artifacts — depend on the contracts you build against.

Live subscriptions

The composed schema carries GraphQL subscriptions over a WebSocket, for pushing live updates to clients.

Compile-time wiring

Annotations in, wiring out

You write the intent; the build writes the wiring. Each annotation has a generator that emits real Kotlin into your build output — the JDBC calls, the controller dispatch, the route handlers — and it's never checked in.

  • Generated code lives in the build output, never committed.
  • No runtime reflection — the wiring is ordinary code at run time.
  • The same annotations power every subsystem in the platform.
annotations · generates
@RepositoryJDBC from your SQL
@ServiceImplementationdependency injection
@TypeControllerGraphQL controllers
@RouteControllerREST endpoints
@JobDefinitiona job executor
@JobEventdispatch() + pub/sub
@Schemaschema merged in

One platform, one schema

Your types, in the same graph

Every subsystem contributes to a single GraphQL schema, and your feature joins it. A query can walk from your type into content, work, identity, or commerce in one round trip, and subscriptions push live updates over a WebSocket — the same way the rest of the platform does.

  • Your types sit next to every built-in type, in one schema.
  • Resolve across subsystems in a single query.
  • Stream live changes with GraphQL subscriptions.
schema.graphql
type Query {
  content(id: ID!): Content
  task(id: ID!): Task
  widget(id: ID!): Widget   # yours
}

Yours to run

Self-hosted, on your terms

Run the whole platform yourself with the official Helm charts. Caching, messaging, the job queue, and storage all sit behind interfaces — pick the backend that fits your stack through configuration, and the code never changes.

  • Official Helm charts; the server compiles to a native image.
  • PostgreSQL at the core, for every subsystem's operational data.
  • Swap the backend behind each interface through configuration.
infrastructure
cacheRedis · NATS
pub / subRedis · NATS
job queueNATS · Redis
storageS3 · GCS

The same platform, running your code

Content, work, identity, Git, commerce — everything Bosca already does is there for your feature to build on. It runs in the same server, on the same graph, and reaches all of it through the same service interfaces, on infrastructure you host yourself.