ChatGPT + Supernotes

tl;dr:

  • I use ChatGPT extensively to generate output.
  • Often, I need to provide it with my own data, which usually means uploading files.
  • I’ve also wished for an easier way to send that output to a repository.
  • Turns out, Supernotes has the infrastructure to make this work.

Backstory:

I’m an AI-augmentation workflow guy. I help teams break down their workflows into smaller steps and explore how AI can enhance each step to achieve breakthrough productivity.

Naturally, I spend a lot of time testing things in ChatGPT.

Two major pain points kept coming up:

  1. To get reliable output, I need to provide context. That often involves gathering data from elsewhere, downloading it, and then uploading it to ChatGPT.
  2. I frequently find myself copying and pasting ChatGPT’s output into a Google Doc. While that works, Google Docs/Drive isn’t really built for personal knowledge management (PKM)—things just get buried too easily.

Over the past two years, I’ve experimented with a wide range of note-taking apps: Obsidian, Reflect, Capacities, NotePlan, Day One, Supernotes (previously), Apple Notes, and Google Keep. None of them offered a true bi-directional flow of information—from “Notes to GPT” and from “GPT to Notes”.

That changed with the introduction of Custom GPTs in November 2023. Still, I hadn’t explored the “Actions” section under the Configure tab. (see photo).

Recently, a client project led me to test linking a Custom GPT to a dynamic Google Sheet via Actions. After some experimentation, we discovered that it was possible, and surprisingly easy!

That’s when the lightbulb moment happened.

Since I still had an active subscription with Reflect, I tried connecting it via API to Custom GPT. It worked partially: I could send output from GPT to Note, but not the other way around.

Next, I tested Capacities. It did better, I could query notes by title, but it doesn’t provide a “Note to GPT” flow.

Finally, I revisited Supernotes. I had tried it before but passed because it didn’t support saving PDFs (hint!).

This time, I checked the API documentation and discovered that it does support both directions: from “Note to GPT” and from “GPT to Note”.

That was the missing piece!

1 Like

If you were hoping for the schema I used with my custom GPT, you can find it below.

PS: you do need a ChatGPT Plus subscription for this to work.


openapi: 3.1.0
info:
  title: Supernotes API
  description: Core endpoints for PKM and Intelligent Assistant workflows.
  version: 1.0.0
servers:
  - url: https://api.supernotes.app
paths:
  /v1/cards/{card_id}:
    get:
      operationId: getCardById
      summary: Get a card by ID
      parameters:
        - name: card_id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: A single card
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  markup:
                    type: string
      security:
        - APIKeyHeader: []

  /v1/cards/enroll/{card_id}:
    put:
      operationId: enrollAndGetChildren
      summary: Enroll in a card and retrieve child cards
      parameters:
        - name: card_id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Child cards response
          content:
            application/json:
              schema:
                type: object
                properties:
                  children:
                    type: array
                    items:
                      type: object
      security:
        - APIKeyHeader: []

  /v1/cards/get/select:
    post:
      operationId: selectCards
      summary: Get Selected Cards
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                search:
                  type: string
                limit:
                  type: integer
                created_when:
                  type: object
                  properties:
                    from_when:
                      type: string
                      format: date-time
                    to_when:
                      type: string
                      format: date-time
      responses:
        '200':
          description: Filtered cards
          content:
            application/json:
              schema:
                type: object
                properties:
                  cards:
                    type: array
                    items:
                      type: object
      security:
        - APIKeyHeader: []

  /v1/cards/get/{card_id}/related:
    post:
      operationId: getRelatedCards
      summary: Get related cards
      description: Returns 404 if the card has no related cards. This is not an error, just an empty result.
      parameters:
        - name: card_id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Related cards
          content:
            application/json:
              schema:
                type: object
                properties:
                  related:
                    type: array
                    items:
                      type: object
      security:
        - APIKeyHeader: []

  /v1/cards/get/{card_id}/parents:
    post:
      operationId: getParentCards
      summary: Get parent cards
      description: Returns 404 if the card has no parent cards. This is not an error, just an empty result.
      parameters:
        - name: card_id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Parent cards
          content:
            application/json:
              schema:
                type: object
                properties:
                  parents:
                    type: array
                    items:
                      type: object
      security:
        - APIKeyHeader: []

  /v1/cards/simple:
    post:
      operationId: createSimpleCard
      summary: Create a simple card
      description: |
        The API requires a 'name' field in addition to 'markup'.
        The first Markdown heading in the markup may be used as the visual title,
        but the 'name' field must still be included in the payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - markup
              properties:
                name:
                  type: string
                  description: Title of the card
                markup:
                  type: string
                  description: Markdown content of the card
                parent_ids:
                  type: array
                  items:
                    type: string
                tags:
                  type: array
                  items:
                    type: string
                color:
                  type: string
                icon:
                  type: string
                visibility:
                  type: integer
                source:
                  type: string
                meta:
                  type: object
                  properties:
                    additionalProp1:
                      type: string
                    additionalProp2:
                      type: string
                    additionalProp3:
                      type: string
      responses:
        '207':
          description: Card created
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
      security:
        - APIKeyHeader: []

  /v1/cards/daily:
    put:
      operationId: appendToDaily
      summary: Append to or create a daily card
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                markup:
                  type: string
      responses:
        '200':
          description: Daily note updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
      security:
        - APIKeyHeader: []

components:
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: Authorization
  schemas: {}

As I didn’t need all the actions, these were the essential ones I use:

  • getCardById
  • enrollAndGetChildren
  • selectCards
  • getRelatedCards
  • getParentCards
  • createSimpleCard
  • appendToDaily
2 Likes

Thanks for sharing. Didn‘t test it out yet but linking ChatGPT with Supernotes is on top of my list …

Do you have prompts to use the Actions or how do you work with them?

A few keywords I use:

  • Search for [keyword] in my notes
  • Retrieve [title - from the step above] in full
  • Add [output] into a new note

Those are my key ones, for now.

1 Like