# Quickstart Source: https://fragment.dev/guides/quickstart [Documentation index](https://fragment.dev/llms.txt) ## Overview To get started developing with Fragment: 1. Design your Schema 2. Generate an SDK 3. Deploy your Ledger 4. Integrate the API ## Use your coding agent ```plaintext title="Agent Quickstart Prompt" Read https://fragment.dev/skills/quickstart.md and follow it to build and run a working Fragment example. ``` [Visual: CopyAgentPromptButton. View on the HTML page.](https://fragment.dev/guides/quickstart) After this is done you'll have a script that demonstrates the integration against a Fragment Ledger. - [Design a Schema](https://fragment.dev/markdown/guides/accounting-101.md) to fit your use-case - Go to production by [embedding Fragment into your CI](https://fragment.dev/markdown/guides/embed-in-ci.md) - [Migrate your existing ledger](https://fragment.dev/markdown/guides/import-data.md) to Fragment ## Follow the guide ### Design your Schema A Schema customizes a Fragment Ledger for a specific use-case. [Download](https://fragment.dev/quickstart-schema.json) this toy Schema to begin the quickstart: ```json title=quickstart-schema.json expandable=true { "key": "quickstart-schema", "chartOfAccounts": { "defaultConsistencyConfig": { "totalBalanceUpdates": "strong" }, "defaultCurrencyMode": "multi", "accounts": [ { "key": "assets", "type": "asset" }, { "key": "liabilities", "type": "liability" }, { "key": "income", "type": "income" }, { "key": "expense", "type": "expense" } ] }, "ledgerEntries": { "types": [ { "type": "simple-entry", "lines": [ { "key": "line-WPZ6bsw08YyW", "account": { "path": "assets" }, "currency": { "code": "USD" }, "amount": "{{gross_amount}}" }, { "key": "line-m4spJaQWFqnw", "account": { "path": "liabilities" }, "currency": { "code": "USD" }, "amount": "{{gross_amount}}-{{fee_revenue}}" }, { "key": "line-bvZiWSE69k4m", "account": { "path": "income" }, "currency": { "code": "USD" }, "amount": "{{fee_revenue}}" } ] } ] }, "scenes": [ { "name": "Simple Scenario", "events": [ { "eventType": "entry", "entry": { "type": "simple-entry", "typeVersion": 1, "parameters": { "fee_revenue": "250", "gross_amount": "10000" } } } ] } ] } ``` ### Generate an SDK Generate a strongly-typed SDK specific to your Schema using the Fragment CLI. 1. Install the CLI via NPM or Homebrew: ```bash title="npm" npm install -g @fragment-dev/cli ``` ```bash title="homebrew" brew tap fragment-dev/tap &&\ brew install fragment-dev/tap/fragment-cli ``` 2. Authenticate the CLI against your Fragment workspace: ```bash fragment login ``` 3. Generate an SDK for your language: ```bash group="typescript" fragment gen-graphql \ --path=quickstart-schema.jsonc \ --output=queries.graphql &&\ npm install --save @fragment-dev/node-client &&\ npx fragment-node-client-codegen \ --input=queries.graphql \ --outputFilename=fragment-client.ts ``` ```bash group="python" fragment gen-graphql \ --path=quickstart-schema.jsonc \ --output=queries.graphql &&\ pip install fragment-python &&\ fragment-python-client-codegen \ --input-dir=. \ --target-package-name=sdk \ --output-dir=. ``` ```bash group="go" fragment gen-graphql \ --path=quickstart-schema.jsonc \ --output=queries.graphql &&\ go get 'github.com/fragment-dev/fragment-go/v3' &&\ go run github.com/fragment-dev/fragment-go/v3 \ --input=queries.graphql \ --output=generated.go \ --package=main ``` ```bash group="ruby" fragment gen-graphql \ --path=quickstart-schema.jsonc \ --output=queries.graphql &&\ gem install fragment-dev # The Ruby SDK reads queries.graphql at runtime, # so no code generation step is required. ``` 4. Create an API client in the [dashboard](https://dashboard.fragment.dev/). 5. Initialize your Fragment client using the generated SDK and API client credentials: ```typescript title="quickstart.ts" import { createFragmentClient } from '@fragment-dev/node-client'; import { getSdk } from './fragment-client'; const fragment = createFragmentClient({ params: { clientId: "", clientSecret: "", apiUrl: "", authUrl: "", scope: "", }, getSdk, }); ``` ```python title="quickstart.py" from .sdk.client import Client client = Client( client_id="", client_secret="", api_url="", auth_url="", auth_scope="", ) ``` ```go title="quickstart.go" import ( "github.com/fragment-dev/fragment-go/v3/client" ) graphqlClient, err := client.NewClient( &client.GetTokenParams{ ClientID: "", ClientSecret: "", Scope: "", AuthURL: "", ApiURL: "", }, ) ``` ```ruby title="quickstart.rb" require 'fragment_client' fragment = FragmentClient.new( "", "", api_url: "", oauth_url: "", oauth_scope: "" ) ``` ### Deploy your Ledger To deploy your Ledger: 1. Store the Schema 2. Create a Ledger from the Schema ```typescript title="quickstart.ts" import { readFileSync } from 'node:fs'; // Load the Schema you downloaded with `fragment get-schema`. const schema = JSON.parse( readFileSync('quickstart-schema.jsonc', 'utf8') ); const { storeSchema } = await fragment.storeSchema({ schema, }) const { createLedger } = await fragment.createLedger({ ik: `test-ledger`, ledger: { name: `quickstart ledger`, }, schemaKey: schema.key, }) ``` ```python title="quickstart.py" import json # Load the Schema you downloaded with `fragment get-schema`. with open("quickstart-schema.jsonc") as f: schema = json.load(f) await client.store_schema(schema=schema) await client.create_ledger( ik="test-ledger", ledger={"name": "quickstart ledger"}, schema_key=schema["key"], ) ``` ```go title="quickstart.go" import ( "context" "encoding/json" "os" "github.com/fragment-dev/fragment-go/v3/queries" ) // Load the Schema you downloaded with `fragment get-schema`. data, _ := os.ReadFile("quickstart-schema.jsonc") var schema queries.SchemaInput json.Unmarshal(data, &schema) queries.StoreSchema(context.Background(), graphqlClient, schema) queries.CreateLedger( context.Background(), graphqlClient, "test-ledger", queries.CreateLedgerInput{Name: "quickstart ledger"}, schema.Key, ) ``` ```ruby title="quickstart.rb" require 'json' # Load the Schema you downloaded with `fragment get-schema`. schema = JSON.parse(File.read('quickstart-schema.jsonc')) fragment.store_schema({ schema: schema }) fragment.create_ledger({ ik: 'test-ledger', ledger: { name: 'quickstart ledger' }, schemaKey: schema['key'] }) ``` ### Integrate the API Begin integrating the API into your product by: 1. Posting a Ledger Entry 2. Reading a Ledger Account's balance ```typescript title="quickstart.ts" import { ReadBalanceConsistencyMode } from '@fragment-dev/node-client/types'; // Post the `simple-entry` Ledger Entry type // with the required parameters const { addLedgerEntry } = await fragment.PostSimpleEntry({ ik: `quickstart-entry`, // The Ledger the Ledger Entry should post to. ledgerIk: `test-ledger`, gross_amount: '10000', // $100.00 fee_revenue: '250', // $2.50 }) const { ledgerAccount } = await fragment.getLedgerAccountBalance({ ledgerIk: `test-ledger`, path: `income`, balanceConsistencyMode: ReadBalanceConsistencyMode.Strong, }) console.log(ledgerAccount.balance); ``` ```python title="quickstart.py" # Post the `simple-entry` Ledger Entry type # with the required parameters await client.post_simple_entry( ik="quickstart-entry", # The Ledger the Ledger Entry should post to. ledger_ik="test-ledger", gross_amount="10000", # $100.00 fee_revenue="250", # $2.50 ) response = await client.get_ledger_account_balance( ledger_ik="test-ledger", path="income", balance_consistency_mode="strong", ) print(response.ledger_account.balance) ``` ```go title="quickstart.go" // Post the `simple-entry` Ledger Entry type // with the required parameters queries.Post_SimpleEntry( context.Background(), graphqlClient, "quickstart-entry", // The Ledger the Ledger Entry should post to. "test-ledger", "10000", // gross_amount, $100.00 "250", // fee_revenue, $2.50 ) response, _ := queries.GetLedgerAccountBalance( context.Background(), graphqlClient, "income", "test-ledger", nil, nil, queries.ReadBalanceConsistencyModeStrong, ) fmt.Println(response.LedgerAccount.Balance) ``` ```ruby title="quickstart.rb" # Post the `simple-entry` Ledger Entry type # with the required parameters fragment.post_simple_entry({ ik: 'quickstart-entry', # The Ledger the Ledger Entry should post to. ledgerIk: 'test-ledger', gross_amount: '10000', # $100.00 fee_revenue: '250' # $2.50 }) response = fragment.get_ledger_account_balance({ ledgerIk: 'test-ledger', path: 'income', balanceConsistencyMode: 'strong' }) puts response.data.ledger_account.balance ``` ### Next steps - [Design a Schema](https://fragment.dev/markdown/guides/accounting-101.md) to fit your use-case - Go to production by [embedding Fragment into your CI](https://fragment.dev/markdown/guides/embed-in-ci.md) - [Migrate your existing ledger](https://fragment.dev/markdown/guides/import-data.md) to Fragment