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

# appendNote()

> Append content to an existing note (creates if it doesn't exist).

Git notes allow you to attach metadata to commits without modifying the commit itself. Notes are
written to `refs/notes/commits` by default. Pass `ref` to append on another notes ref.

See [Git Notes](/docs/guides/git-notes) for notes ref rules and write behavior.

<CodeGroup>
  ```typescript TypeScript theme={null} theme={"theme":{"light":"github-light","dark":"min-dark"}}
  const result = await repo.appendNote({
    sha: 'abc123def456...',
    note: '\n---\nReviewed by @alice - LGTM',
    ref: 'reviews', // optional
    author: { name: 'Review Bot', email: 'review@example.com' },
  });

  console.log(`Note updated, new ref: ${result.newRefSha}`);
  ```

  ```python Python theme={null} theme={"theme":{"light":"github-light","dark":"min-dark"}}
  result = await repo.append_note(
      sha="abc123def456...",
      note="\n---\nReviewed by @alice - LGTM",
      ref="reviews",  # optional
      author={"name": "Review Bot", "email": "review@example.com"},
  )

  print(f"Note updated, new ref: {result['new_ref_sha']}")
  ```

  ```go Go theme={null} theme={"theme":{"light":"github-light","dark":"min-dark"}}
  // Append to a git note
  result, err := repo.AppendNote(context.Background(), storage.AppendNoteOptions{
  	SHA:  "abc123def456",
  	Note: "\n---\nReviewed by @alice - LGTM",
  	Ref:  "reviews", // optional
  	Author: &storage.NoteAuthor{
  		Name:  "Review Bot",
  		Email: "review@example.com",
  	},
  })
  fmt.Printf("Note updated, new ref: %s", result.NewRefSHA)
  ```
</CodeGroup>

## Options

<ParamField path="sha" type="string" required>
  Commit SHA to attach the note to
</ParamField>

<ParamField path="note" type="string" required>
  Note content to append
</ParamField>

<ParamField path="ref" type="string">
  Notes ref to append on. Accepts short names like `reviews`, `notes/reviews`, or full refs like
  `refs/notes/reviews`; all are normalized to a full `refs/notes/*` ref. Defaults to
  `refs/notes/commits`. Go: `Ref`.
</ParamField>

<ParamField path="author" type="string">
  Author signature (`name` and `email`)
</ParamField>

<ParamField path="expectedRefSha" type="string">
  Expected SHA of the target notes ref for optimistic concurrency control
</ParamField>

<ParamField path="ttl" type="string">
  Token TTL. Token TTL in seconds.
</ParamField>

<ParamField path="refPolicies" type="object[]">
  Ordered per-ref policy rules (`{ pattern, ops? }`) embedded in the per-call JWT. Evaluated against the target notes ref. Python: `ref_policies`. Go: `RefPolicies` with type `storage.RefPolicyList`. See the [Branch Protection guide](/docs/guides/branch-protection).
</ParamField>

## Response

<ResponseField name="sha" type="string">
  The commit SHA the note is attached to
</ResponseField>

<ResponseField name="targetRef" type="string">
  The canonical notes ref that was updated
</ResponseField>

<ResponseField name="baseCommit" type="string">
  Previous notes ref commit SHA
</ResponseField>

<ResponseField name="newRefSha" type="string">
  New notes ref SHA after the operation
</ResponseField>

<ResponseField name="result" type="object">
  Operation result with `success`, `status`, and optional `message`
</ResponseField>
