Skip to main content
Glama

GravityPort

English | 简体中文

CI License: PolyForm Shield 1.0.0 Platforms: macOS arm64 | Windows x64

Every AI creation leaves a trail 把 AI 生成的每一张图,连同 Prompt、来源和版本,留在自己的电脑上。

GravityPort is an AI asset manager. It automatically collects the images and videos generated by ChatGPT, Gemini, Flow, Google AI Studio, Codex, Grok, and Jimeng — together with their Prompts, reference images, and provenance — into one library on your own computer.

GravityPort gallery with the Inspector open

  • Auto-Capture: Saves generated images and videos straight to your library.

  • Prompts & Context: Keeps prompts, reference images, and sources with every asset.

  • Version Tree: Records every round of edits in a conversation.

  • Smart Stacks: Groups related assets by source and conversation.

  • 100% Local: Stores all assets and records locally on your computer.

  • GravityPort MCP: Lets AI assistants manage your library assets directly.

  • Free Download: macOS · Windows · gravityport.azhuilab.com

Downloads · First launch · 中文使用指南 · Privacy · Documentation

Downloads

Get GravityPort from the official download page. It always lists the current packages with their sizes; the Windows package also shows its SHA-256 value.

  • GravityPort Desktop for macOS (Apple Silicon): a DMG. Drag GravityPort.app into Applications.

  • GravityPort Desktop for Windows 10/11 (x64): an installer. Double-click it; it installs GravityPort for your Windows account without asking for an administrator, adds it to the Start menu and the desktop, and opens it. Remove it in Settings → Apps; your library stays. (0.3.3 and earlier came as a portable ZIP: extract it and run GravityPort.exe.)

  • GravityPort Web Capture (Chrome / Chromium, optional): a ZIP; load it after the desktop app is running and the two pair automatically. See the install guide.

Installed desktop apps check for updates themselves in Settings → About. The release manifest is the machine-readable source for the newest version.

Related MCP server: Personal Research Assistant MCP

First launch

  • macOS: the first time you open GravityPort, macOS asks whether to open an app downloaded from the internet. Click Open. Only once.

  • Windows: the installer is not code-signed yet, so SmartScreen may say "Windows protected your PC". Click More info → Run anyway. Only once, when you install.

Why GravityPort

An image alone rarely tells you how to use it again. The Prompt may be in another conversation, the source tool may be forgotten, and the version you actually want may be buried among near-duplicates.

GravityPort reconnects each asset with the context that makes it reusable: its available Prompt, generation source, provenance, and version history. The library remains under your control on your machine.

What you can do

Keep the context with the asset

Archive generated images and videos together with their available Prompt, source, model or tool context, timestamps, and provenance. GravityPort records when a Prompt is unavailable instead of inventing one.

Organize by drag and drop

Browse and search one gallery with adjustable column counts, marquee selection, and multi-select. Drag cards onto a sidebar group to file them, onto another card to build or join a stack, inside a stack to reorder it, or out of the window to hand the files to another app. A stack built or joined by drag can be undone for a few seconds.

Iterate on the version tree

The Inspector shows each asset's version tree, with generations from a ChatGPT conversation grouped by conversation round so you can see how the image evolved turn by turn. Any two versions in a family can be compared side by side.

Let AI agents search your library

GravityPort MCP lets Claude, Codex, and other MCP clients list, search, and record assets, Prompts, versions, and generation history in the same local library. asset_search combines text and a time range. The desktop app ships the server: copy a ready-made config for Claude Desktop, Claude Code, or Codex from Settings → Connect, with no Node.js or source checkout needed. From source, run npm run mcp. See MCP 与接口 for setup and the tool list.

Recover deleted work

Removed assets move to Trash, where they are kept for 90 days with a per-asset countdown. Right after a deletion an undo button offers to reverse it; Trash has its own menu for restoring, deleting permanently, and emptying.

Settings → Feedback sends bug reports and ideas, optionally with a redacted diagnostic log that you can read in full before sending. The Pinterest entry is already shown in the app; connecting opens up once Pinterest approves production API access.

MCP setup

GravityPort MCP is a local stdio server built into the desktop app. It opens no port and needs no Node.js or npm package.

  1. Install GravityPort and open it once.

  2. Go to Settings → Connect → AI assistants (MCP), pick Claude Desktop, Claude Code or Codex, and click Copy.

  3. Paste the config into that client and restart it.

On macOS the config looks like this. On Windows the paths depend on where the app is installed, so use the Copy button in Settings.

{
  "mcpServers": {
    "gravityport": {
      "command": "/Applications/GravityPort.app/Contents/MacOS/GravityPort",
      "args": ["/Applications/GravityPort.app/Contents/Resources/app.asar/mcp/server.mjs"],
      "env": { "ELECTRON_RUN_AS_NODE": "1" }
    }
  }
}

Tools

GravityPort MCP provides 25 tools:

  • Search: asset_search (text and time range), asset_list, asset_get

  • Add: asset_create, asset_import_folder

  • Edit: asset_update_metadata, asset_attach_prompt, asset_duplicate

  • Trash: asset_trash (move to Trash), asset_restore (restore from Trash)

  • Stacks: stack_list, stack_get, stack_create, stack_rename, stack_add_assets, stack_remove_assets, stack_dissolve

  • Versions: asset_version_create, asset_version_history, asset_recipe_history

  • Generation history: generation_record, generation_list, generation_relation_record, generation_lineage

  • Export: asset_provenance_export (provenance without file paths or user names)

Fits into your workflow

You create in

GravityPort keeps

Codex Desktop

Generated images and the matching local generation context when available

ChatGPT, Gemini, Flow, Google AI Studio, or Jimeng in Chrome

Optional visible web-generated images/videos and conservative page-scoped context through the local extension

ChatGPT desktop app

Images from desktop chats, picked up by the same extension (auto capture on) through your browser's ChatGPT session

Grok (Grok Build CLI)

Images and videos from local sessions, with matched tool context when available

Cowart canvas archiving and other integrations are also supported; see the Chinese guide for setup.

Whatever the source, everything lands in the same local gallery with groups, stacks, Trash with undo, and the version tree. GravityPort does not generate media or replace any of these tools.

Platform status

Target

Status

macOS arm64

Main desktop target. DMG for first install, in-app updates afterwards.

Windows 10/11 x64

Installer for first install, in-app updates afterwards. Not code-signed yet.

Run from source

For development, or to run GravityPort as a local web app without the desktop shell. Requires Node.js 22 or newer and npm.

git clone https://github.com/fengseekling-coder/gravityport.git
cd gravityport
npm ci      # installs dependencies and builds the UI
npm start   # starts the local service on 127.0.0.1:43517

Open http://127.0.0.1:43517. Run npm test to check your checkout. Codex Desktop and the Cowart plugin are optional integrations; the Chinese guide covers their setup and the complete source-by-source behavior.

The Electron desktop shell uses the same Web UI and local runtime:

npm run desktop:start

# macOS arm64 DMG
npm run desktop:make

# Windows 10/11 x64 package directory
npm run desktop:package:windows

Desktop packaging needs Node.js 22.x; the repository pins 22.23.1 in .nvmrc and .node-version, and packaging commands stop with a clear message on any other major. Release tracks, signing, notarization, and manifest publishing are described in the release guide.

Local by design

  • GravityPort is a local Web UI bound to loopback; it is not a cloud service and must not be exposed through a public port or reverse proxy.

  • It reads only its configured Codex, Grok, and approved Cowart locations. It does not scan Downloads, Desktop, or arbitrary image folders.

  • Web Capture is optional. Packaged Desktop provisions its local ingest Token and fixed approved extension origins automatically; a standalone npm start runtime keeps capture disabled until those values are configured explicitly. The extension sends captured image bytes and page provenance only to the configured local GravityPort address. ChatGPT retains message-scoped context when available; the other supported sites retain only narrowly associated visible user Prompt text when it can be safely matched and mark it unverified — the extension's full site list is documented in PRIVACY.md. With auto capture on, the extension also captures images from conversations you just used in the ChatGPT desktop app by opening them briefly in a minimized browser window; see PRIVACY.md.

  • Eligible reference images are stored as private, content-hash-deduplicated generation-record attachments, not ordinary gallery assets.

  • The desktop app ships and downloads no AI model. GravityPort adds no remote sync or automatic upload of your library.

  • Packaged desktop builds send minimal install/activity metadata, keyed by a random installation ID, through a separate bodyless request to the same first-party release endpoint used for update metadata. This contains only the installation ID, version, platform, architecture, and first-launch/daily-active event, and never includes assets, Prompts, or local paths. See PRIVACY.md, which also explains how to turn it off.

See PRIVACY.md for the full data boundary and SECURITY.md for private vulnerability reporting.

Community

Documentation

User guides:

Running and developing GravityPort:

  • Operations guide (English): operating modes, migration, backup, verification, bridge health, and recovery boundaries.

  • Release guide (English): distribution tracks, signing, update manifests, release notes, and optional pack publishing.

  • Architecture (中文): current runtime, storage, and integration layout.

  • Design system (中文): colors, type, spacing, components, and copy rules for the desktop interface.

  • Contributing guide: development workflow, checks, and privacy requirements.

Policies and history:

License

GravityPort is source-available under the PolyForm Shield License 1.0.0.

  • Anyone can use GravityPort for free, including at work and for client projects.

  • You can modify it and share copies, as long as you keep the license terms and the required copyright notice.

  • You may not use GravityPort's code to provide a product that competes with GravityPort, including renamed or lightly modified copies, even when offered for free. If you are unsure whether your use competes, see COMMERCIAL-LICENSE.md.

GravityPort is source-available software, not OSI-approved open-source software. v0.1.0 is the final release published under the MIT License; versions 0.2.0 through 0.3.5 were published under the PolyForm Noncommercial License 1.0.0, and copies obtained under those terms keep them.

Third-party attribution is documented separately in THIRD_PARTY_NOTICES.md and does not change GravityPort's own license terms.

Available Tools

25 tools
asset_attach_promptC

Attach or replace the full prompt recipe for a saved asset.

Inputs: prompt (required), assetId (required).

asset_createA

Copy an image into the GravityPort library and save prompt recipe metadata. The image path must be an absolute path on this machine. Symbolic links are rejected. Only supported image and video formats are imported. Identical bytes already in the library (outside Trash) return the existing asset with deduplicated: true instead of creating a copy.

Inputs: imagePath (required), tags, group, ratio, +15 more.

asset_duplicateB

Create an independent editable copy that starts a new version root while retaining duplicate provenance.

Inputs: assetId (required), assetIdNew.

asset_getA
Read-only

Get one saved asset and its full prompt recipe. asset_list and asset_search return only compact summaries; call this for the full recipe and metadata.

Inputs: assetId (required).

asset_import_folderA

Import every image and video found in a local folder into the GravityPort library, applying the same prompt/sourceType/source to each file. The folder path must be an absolute path on this machine. Symbolic links are skipped; with recursive: true the folder itself is level 1 and its contents are read down to level 5 (at most four subfolder levels below it), and deeper subfolders are skipped; a single call imports at most 1000 files, otherwise it fails and asks for batches. Identical bytes already in the library are reported as deduplicated. Files import one by one; a failed file is reported and does not stop the rest. Files already in the library are listed in duplicates with the existing assetId.

Inputs: folderPath (required), prompt, source, recursive, +1 more.

asset_listA
Read-only

List saved GravityPort assets for a project, optionally filtered by search text. Returns compact per-asset summaries with the total count (20 per page by default, at most 100; pass cursor to page further); use asset_get for an asset's full recipe and metadata.

Inputs: limit, query, cursor.

asset_provenance_exportA
Read-only

Export a portable GravityPort provenance bundle plus an unsigned C2PA assertion payload. Prompts and user messages are excluded by default; pass includePrompts: true only when the user explicitly asks to include prompts. Local filesystem paths and usernames are never exported under any circumstances. This does not create a signed Content Credential; a C2PA signer must bind and sign the assertion separately.

Inputs: assetId (required), includePrompts.

asset_recipe_historyA
Read-only

Read immutable generation recipe snapshots for one asset and identify the currently active snapshot.

Inputs: assetId (required).

asset_restoreA
Idempotent

Restore an asset from Trash back to the active library.

Inputs: assetId (required).

asset_trashA
DestructiveIdempotent

Move an asset to Trash. Trashed assets can be restored with asset_restore or inside the GravityPort app, and are permanently purged after 90 days. Use this when the user asks to delete or remove an asset. Do NOT use this when the user asks to archive or stash an asset.

Inputs: assetId (required).

asset_update_metadataC

Update metadata fields for a saved asset. Pass references to record reference rights and permitted uses for a saved asset; that annotation is not a generation input, so it appends a new recipe snapshot.

Inputs: assetId (required), tags, group, ratio, +12 more.

asset_version_createC

Save a new recipe version as a child of an existing asset without overwriting the parent.

Inputs: assetId (required), version_change (required), tags, group, +16 more.

asset_version_historyB
Read-only

Read the complete root-to-descendant recipe version tree for an asset, including archived versions.

Inputs: assetId (required).

generation_lineageA
Read-only

Read the connected generation lineage graph around one generation event, including parent/child IDs and evidence-bearing relations.

Inputs: generationId (required).

generation_listC
Read-only

List generation occurrences, optionally filtered by output asset or provider identifiers.

Inputs: assetId, captureContextId, providerToolCallId, providerGenerationCallId.

generation_recordB

Record one generation occurrence independently from the deduplicated output asset. Use this when an agent knows that a specific generation produced a saved GravityPort asset.

Inputs: outputAssetId (required), model, batchId, evidence, +15 more.

generation_relation_recordA

Record an explicit generation-to-generation relationship such as edited_from or variant_of. Do not infer a parent unless the evidence supports it. When verificationLevel is omitted the relation is recorded as user_confirmed (you are asserting it on the user's behalf); pass "observed" or "inferred" to record a weaker evidence level.

Inputs: childGenerationId (required), parentGenerationId (required), evidence, createdAt, +2 more.

stack_add_assetsA

Add saved assets to an existing stack, after its current members. Assets already in this stack are skipped and listed in alreadyInStack. If any asset belongs to a different stack the call fails with ASSET_ALREADY_STACKED and nothing changes.

Inputs: stackId (required), assetIds (required).

stack_createA

Group two or more saved assets into a new stack, the same as stacking a selection in the GravityPort app. coverAssetId defaults to the first asset. name (optional, at most 80 characters) is the stack's display name. An asset can belong to only one stack: if any asset is already in a stack the call fails with ASSET_ALREADY_STACKED and nothing changes; take it out with stack_remove_assets first. To show the same image in several stacks, copy it with asset_duplicate and stack the copy. Archived assets cannot be stacked.

Inputs: assetIds (required), name, coverAssetId.

stack_dissolveA
Destructive

Dissolve a stack: its assets return to the library as separate assets; nothing is deleted or archived. They are not stacked again automatically.

Inputs: stackId (required).

stack_getA
Read-only

Read one stack: its name, cover, member count, and member asset IDs in stack order. Members in Trash or archived are left out.

Inputs: stackId (required).

stack_listB
Read-only

List the stacks shown in the GravityPort library (two or more visible members), most recently updated first, optionally filtered by text in the stack name.

Inputs: limit, query.

stack_remove_assetsA
Destructive

Take assets out of a stack; the assets stay in the library. Every assetId must belong to this stack, otherwise the call fails with ASSET_NOT_IN_STACK and nothing changes. A stack left with one asset is dissolved (dissolved: true). Assets taken out are not stacked again automatically.

Inputs: stackId (required), assetIds (required).

stack_renameB

Set a stack's display name (trimmed, 1 to 80 characters). The name is kept even when the stack was created automatically from a conversation.

Inputs: name (required), stackId (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 25 tools

    Disambiguation4/5

    Most tools map to a distinct resource+action, with clear groupings around assets, stacks, and generations. The main friction is between asset_version_history, asset_recipe_history, and asset_get, which all read some form of asset history/recipe and could be confused, plus asset_update_metadata vs asset_attach_prompt which both mutate recipe data.

    Naming Consistency5/5

    Every tool follows a strict resource-prefix + action pattern (asset_*, stack_*, generation_*) in snake_case with no deviations. The prefixes themselves act as a natural taxonomy, making the surface highly predictable.

    Tool Count3/5

    25 tools is at the heavy end for a single server and pushes against the comfortable 3-15 range. The three domains (assets, stacks, generations) justify some breadth, but several near-duplicate history/recipe readers suggest the surface could be trimmed.

    Completeness4/5

    Coverage is strong: assets have create/import/list/search/get/trash/restore/duplicate/version/prompt/provenance, stacks have full create/add/remove/rename/dissolve/get/list, and generations have record/relation/lineage/list. Minor gaps exist, such as no permanent purge, no stack cover/ordering update, and no generation edit/delete operations.

    Maintenance

    ActivityActive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude Desktop to search and query personal document collections (PDF, Word, Markdown, text) using semantic search and conversational AI with full context preservation across exchanges.
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables semantic search and conversational querying across a personal research library of PDFs, DOCX, and other documents using a vector database. It provides tools for document summarization, finding related papers, and high-accuracy retrieval for AI clients like Claude Desktop.
      -
    • F
      license
      Not graded
      quality
      C
      maintenance
      Personal RAG database and semantic search built from inside your AI chat. Store knowledge, voice, and skills; Claude and ChatGPT create work that sounds like you.
      -