> ## 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.

# Node.js Quickstart

> Add Bijection to a Node.js project

Learn how to query data from Bijection in a Node.js project.

For instructions for subscriptions instead of point-in-time queries and more
project configurations (TypeScript, bundlers, CJS vs ESM) see
[Node.js notes](/client/javascript/node).

<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. This quickstart runs its script with your own Node.js, version
    22.12 or later; Bijection itself needs no Node.js install.
  </Step>

  <Step title="Create the project">
    `bijection init` creates the project directory with a `bijection/` folder,
    where you write your backend functions, a sample schema, query and mutation,
    and `bijection.json`. It also writes the Bijection SDK to
    `node_modules/bijection`, so your script can import it without a package
    manager.

    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    bijection init my-project && cd my-project
    ```
  </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`. 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 `script.mjs`, create a `BijectionHttpClient` using
    the URL of your development environment.

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

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

    client.query(api.tasks.get).then(console.log);
    ```
  </Step>

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

    ```sh theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    node --env-file=.env.local script.mjs
    ```
  </Step>
</Steps>

See the complete [Node.js documentation](/client/javascript/node).
