> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bijection.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Using Bijection with Bun

> Add Bijection to a Bun project

Learn how to query data from Bijection in a Bun project.

For instructions for subscriptions instead of point-in-time queries see
[Bun notes](/client/javascript/bun).

<Steps>
  <Step title="Install the Bijection CLI">
    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    curl -fsSL https://bijection.com/install.sh | sh
    ```

    See [Install Bijection](/get-started/install) for PATH setup and supported
    platforms.
  </Step>

  <Step title="Create a new Bun project">
    Create a new directory for your Bun project.

    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    mkdir my-project && cd my-project && bun init -y
    ```
  </Step>

  <Step title="Add a Bijection backend">
    Run `bijection init` in the project. It adds a `bijection/` folder, where
    you write your backend functions, with a sample schema, query and mutation,
    and `bijection.json`. It also writes the Bijection SDK to
    `node_modules/bijection`, where Bun finds it; you don't add it with
    `bun add`.

    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    bijection init
    ```
  </Step>

  <Step title="Set up a Bijection dev deployment">
    Log this machine in to Bijection, once per machine, then run
    `bijection dev`. The first run creates your dev deployment and saves its URL
    in `.env.local` as `BIJECTION_URL`, which Bun loads by itself. The `dev`
    command then keeps running to push your functions in `bijection/` to your
    dev deployment on every change.

    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    bijection login
    bijection dev
    ```

    <Note>
      Bijection's hosted service is not yet open for public sign-up, and the CLI
      has no default management service. Before running `bijection login`, set
      `BIJECTION_MANAGEMENT_URL` to the management service URL you were given, in
      your shell's startup file so that every later `bijection` command sees it too:

      ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
      export BIJECTION_MANAGEMENT_URL=https://<your management service>
      ```
    </Note>
  </Step>

  <Step title="Create sample data for your database">
    In a new terminal window, create a `sampleData.jsonl`
    file with some sample data.

    ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    {"text": "Buy groceries", "isCompleted": true}
    {"text": "Go for a swim", "isCompleted": true}
    {"text": "Integrate Bijection", "isCompleted": false}
    ```
  </Step>

  <Step title="Add the sample data to your database">
    Now that your project is ready, add a `tasks` table
    with the sample data into your Bijection database with
    the `import` command.

    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    bijection import --table tasks sampleData.jsonl
    ```
  </Step>

  <Step title="Declare the tasks table">
    `bijection init` created `bijection/schema.ts`, which declares the tables of
    your database, starting with a sample `messages` table. Add a `tasks` table
    beside it. The schema gives your functions TypeScript types, and Bijection
    enforces it at runtime.

    ```ts bijection/schema.ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    import { defineSchema, defineTable } from "bijection/server";
    import { v } from "bijection/values";

    export default defineSchema({
      messages: defineTable({
        author: v.string(),
        body: v.string(),
      }),
      tasks: defineTable({
        text: v.string(),
        isCompleted: v.boolean(),
      }),
    });
    ```
  </Step>

  <Step title="Expose a database query">
    Add a new file `tasks.ts` in the `bijection/` folder
    with a query function that loads the data.

    Exporting a query function from this file
    declares an API function named after the file
    and the export name, `api.tasks.get`.

    ```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    import { query } from "./_generated/server";

    export const get = query({
      args: {},
      handler: async (ctx) => {
        return await ctx.db.query("tasks").collect();
      },
    });
    ```
  </Step>

  <Step title="Connect the script to your backend">
    In a new file `index.ts`, create a `BijectionClient` using
    the URL of your development environment.

    ```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    import { BijectionClient } from "bijection/browser";
    import { api } from "./bijection/_generated/api.js";

    const client = new BijectionClient(process.env["BIJECTION_URL"]);

    const unsubscribe = client.onUpdate(api.tasks.get, {}, async (tasks) => {
      console.log(tasks);
    });

    await Bun.sleep(1000);
    unsubscribe();
    await client.close();
    ```
  </Step>

  <Step title="Run the script">
    Run the script from the same directory and see the list of tasks logged to the terminal.

    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    bun index.ts
    ```
  </Step>
</Steps>

See the complete [Bun documentation](/client/javascript/bun).
