samograph 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,176 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
package/README.md ADDED
@@ -0,0 +1,228 @@
1
+ # samograph
2
+
3
+ > Build agents that show up to the meeting, not just the codebase.
4
+
5
+ samograph lets your AI agent (Claude Code, Codex, and others) join Zoom and Google Meet calls as an active participant — listening, responding, and taking action in real time.
6
+
7
+ Give this CLI, a meeting URL, and the needed tokens to your AI agent. samograph handles the meeting plumbing through Recall.ai: joining calls, streaming the live transcript, sending explicit chat messages, and inspecting the current call view on demand.
8
+
9
+ ## Setup
10
+
11
+ Requirements:
12
+
13
+ - Bun.
14
+ - `RECALL_API_KEY`.
15
+ - `ngrok` installed and authenticated (free plan is enough for transcription; the presence camera needs an interstitial-free tunnel — see Dynamic Bot Presence). `join` starts and manages ngrok automatically — you don't run it yourself. ngrok is optional when using `--webhook-base` with an external tunnel (localtunnel, cloudflared, etc.).
16
+
17
+ Install the CLI from npm:
18
+
19
+ ```bash
20
+ npm install -g samograph
21
+ export RECALL_API_KEY=...
22
+ samograph join "https://meet.google.com/..." --name Leo
23
+ ```
24
+
25
+ During development use `bun install`, `bun run build`, then `bun run samograph ...`.
26
+
27
+ ## What It Provides
28
+
29
+ samograph gives an AI agent a small set of meeting tools:
30
+
31
+ - `join` - bring a Recall.ai bot into a Zoom or Google Meet call.
32
+ - `watch` - stream live transcript lines to the agent.
33
+ - `notes` - maintain a structured Google Doc agenda with important points, decisions, and action items.
34
+ - `chat` - send a deliberate message into the meeting chat.
35
+ - `presence` - update the bot camera state shown in the meeting.
36
+ - `frame` - export the current call view on demand.
37
+ - `leave` - remove the bot and clean up local state.
38
+ - `status` - show the current Recall bot state.
39
+ - `transcript` - print the transcript (local file, or post-call from Recall).
40
+ - `screenshot` - capture the local Mac screen (fallback when no call frame is available).
41
+ - `dicts` - list available Deepgram keyword dictionaries.
42
+ - `doctor` - check local prerequisites before joining a call.
43
+
44
+ The agent still decides what to say, when to inspect a frame, and how to use the meeting context. samograph is the local adapter that exposes those call capabilities.
45
+
46
+ ```text
47
+ AI agent
48
+ | runs CLI tools
49
+ v
50
+ samograph on your machine
51
+ | starts bot + local callback server + ngrok tunnel (or external tunnel via --webhook-base)
52
+ v
53
+ Recall.ai bot in Zoom/Meet
54
+ | transcript, chat, WebSocket video events
55
+ v
56
+ samograph watch/notes/chat/frame
57
+ ```
58
+
59
+ ## Integration
60
+
61
+ `join` starts a local callback server and exposes it with `ngrok http` so Recall.ai can deliver HTTPS/WSS events back to your machine. The free ngrok HTTP plan is enough for webhooks and transcription, but its browser interstitial blocks the presence camera page — `join` then warns and joins without the camera (see Dynamic Bot Presence). Alternatively, pass `--webhook-base <URL>` to use an existing external tunnel (localtunnel, cloudflared, etc.) and skip spawning ngrok entirely; localtunnel has the same interstitial limitation.
62
+
63
+ ngrok TCP is only needed for the optional RTMP path (`--rtmp`) and requires a credit/debit card on file at ngrok.com (free plan — the card is not charged). The standard WebSocket frame path does not need TCP or card verification.
64
+
65
+ Webhook, frame, and presence routes are token-protected, and default runtime files stay under `~/.samograph/`.
66
+
67
+ ## Agent Workflow
68
+
69
+ ```bash
70
+ samograph join "https://meet.google.com/..." --name Leo --dict postgresfm
71
+ samograph watch
72
+ samograph notes init --doc-id 1abc... --credentials ~/.samograph/google.json --title "Customer migration call"
73
+ samograph notes point "Migration risk is the blocker" --speaker Alice
74
+ samograph notes decision "Use logical replication for phase 1"
75
+ samograph notes action "Open migration checklist issue" --owner Nik --due 2026-06-07
76
+ samograph presence thinking "Checking the shared screen"
77
+ samograph frame
78
+ samograph chat "I can see the screen now."
79
+ samograph leave
80
+ ```
81
+
82
+ Run `watch` immediately after `join` and keep it running for the whole call. It prints one utterance per line:
83
+
84
+ ```text
85
+ [2026-05-30 15:42:10] Speaker Name: words spoken in the meeting
86
+ ```
87
+
88
+ `watch` exits automatically when `leave` is run. If there is no active session, it prints `No active session.` to stderr and exits.
89
+
90
+ Use `chat` only when you intentionally want to write into the meeting chat. Otherwise respond in your agent session.
91
+
92
+ ## Dynamic Bot Presence
93
+
94
+ `join` gives the Recall bot a token-protected local camera page through the same public tunnel used for webhooks. The page URL carries a read-only token (valid only for viewing the page; `/presence.json` requires the same token in the `X-Samograph-Presence-Token` header, which the page sends when polling); presence updates require a separate write token that `join` keeps in local state and `samograph presence` sends in a header. The page starts as `listening` and refreshes itself from the local callback server every second. Pick the background mode with `join --presence-bg <sphere|field|static|cycle>` (`sphere` is the default; `static` is the cheapest to render; `cycle` alternates between field and sphere; unknown values fall back to `sphere`). The mode is fixed at join time.
95
+
96
+ The presence camera requires the tunnel to serve the page cleanly to a browser. Free-ngrok and localtunnel show an interstitial page to browser user agents, which blocks the camera: `join` detects this in a preflight check, prints a warning, and joins **without** the presence camera — transcription, chat, and frames are unaffected, but `samograph presence` is unavailable for that call. Use a paid/clean tunnel (e.g. a paid ngrok plan or cloudflared) for the presence camera, or pass `join --no-presence` to skip the camera and the preflight entirely.
97
+
98
+ Update it from the agent loop:
99
+
100
+ ```bash
101
+ samograph presence listening
102
+ samograph presence thinking "Checking logs"
103
+ samograph presence speaking "Answering in chat"
104
+ samograph presence acting "Opening PR review"
105
+ samograph presence idle
106
+ ```
107
+
108
+ Presence is in-memory runtime state. It is meant for lightweight meeting signaling, not persistence.
109
+
110
+ ## Google Doc Notes
111
+
112
+ `notes` follows GitLab-style live doc meetings: the doc is an agenda and collaboration surface, not a transcript dump. The agent watches the transcript, decides what matters, then writes concise points into the right section.
113
+
114
+ ```bash
115
+ export GOOGLE_DOC_ID=1abc...
116
+ export GOOGLE_APPLICATION_CREDENTIALS=~/.samograph/google-service-account.json
117
+ samograph notes init --title "Customer migration call"
118
+ samograph notes point "Customer is blocked on cutover risk" --speaker Alice
119
+ samograph notes decision "Run a shadow replay before scheduling cutover"
120
+ samograph notes action "Create replay checklist issue" --owner Nik --due 2026-06-07
121
+ ```
122
+
123
+ The credentials file must be a Google service-account JSON key, and the target doc must be shared with that service account's `client_email` as an editor.
124
+
125
+ If you really want raw transcript mirroring, make that explicit:
126
+
127
+ ```bash
128
+ samograph notes transcript --from-start
129
+ ```
130
+
131
+ ## Frames
132
+
133
+ Frame capture is on by default. Recall sends separate PNG frames over WebSocket; samograph keeps the latest frames in memory, indexed by source, and only writes to disk when you call `frame`.
134
+
135
+ `frame` fails with `FRAME_UNAVAILABLE` if no frame has arrived yet — call it after the bot has been in the meeting for a few seconds.
136
+
137
+ ```bash
138
+ samograph frames
139
+ samograph frame
140
+ ```
141
+
142
+ By default it writes outside the repo:
143
+
144
+ ```text
145
+ ~/.samograph/frames/latest.png
146
+ ~/.samograph/frames/latest.json
147
+ ```
148
+
149
+ Use `--out` for an explicit path, or `--archive` to create a timestamped copy alongside the latest:
150
+
151
+ ```bash
152
+ samograph frame --source screen --out /tmp/screen.png
153
+ samograph frame --source participant:100
154
+ samograph frame --out /tmp/call.png
155
+ samograph frame --archive
156
+ ```
157
+
158
+ `frames` lists buffered source keys such as `type:screen_share` or `participant:100`. `frame --source` accepts those keys, plus aliases like `screen`, `screen_share`, and `webcam`.
159
+
160
+ Archive filenames include call id, UTC timestamp, source type, and participant id. Source type and participant id come from the Recall event metadata and may be `unknown` if Recall does not provide them.
161
+
162
+ ## Important Flags
163
+
164
+ - `join --no-ws-video` - disable the default WebSocket frame path (e.g. when using RTMP instead).
165
+ - `join --webhook-base URL` - use an existing public tunnel (localtunnel, cloudflared quick tunnel, etc.) pointing at `--port` instead of starting ngrok. Useful when ngrok is unavailable or its free-tier bandwidth cap is hit (`ERR_NGROK_727`): run `npx localtunnel --port 8080`, then pass the printed `https://*.loca.lt` URL here.
166
+ - `join --variant web_4_core` - ask Recall to run the output-media webpage on a larger bot instance. Use this when the camera webpage reports low render FPS or looks choppy. `web` is the default Recall instance; `web_gpu` is available for WebGL-heavy pages.
167
+ - `join --no-presence` - join without the presence camera page and skip the camera preflight (e.g. when the tunnel serves an interstitial).
168
+ - `join --presence-bg MODE` - presence camera background: `sphere` (default), `field`, `static` (cheapest), or `cycle` (alternates field/sphere); fixed at join time.
169
+ - `join --frame-dir DIR` - where on-demand frame files are written.
170
+ - `join --dict postgresfm` - Deepgram keyterm hints from `dictionaries/postgresfm.txt`.
171
+ - `join --transcript-dir DIR` - timestamped transcript file location, default `~/.samograph/`.
172
+ - `join --rtmp` - mixed-video RTMP path using ngrok TCP; requires ngrok card verification.
173
+ - `join --rtmp-url rtmp://host:1935/live/call` - explicit mixed-video RTMP receiver.
174
+ - `notes --doc-id ID` - Google Doc ID or URL for live meeting notes; defaults to `GOOGLE_DOC_ID`.
175
+ - `notes --credentials FILE` - Google service-account JSON; defaults to `GOOGLE_APPLICATION_CREDENTIALS`.
176
+ - `notes --section NAME` - section for `notes point`, such as `important`, `agenda`, `decisions`, or `actions`.
177
+ - `notes --speaker NAME` - speaker prefix for `notes point`.
178
+ - `notes --owner NAME` and `--due DATE` - action-item metadata.
179
+ - `notes --from-start` - with `notes transcript`, replay existing transcript lines before tailing live lines.
180
+ - `frame --source SOURCE` - select `latest`, `screen`, `webcam`, `type:<type>`, or `participant:<id>`.
181
+
182
+ ## Commands
183
+
184
+ - `join <meeting-url>` - start local server, ngrok tunnel, and Recall bot.
185
+ - `watch` - stream live transcript until `leave` writes the end sentinel; exits immediately if no session is active.
186
+ - `notes init` - add a live meeting doc template.
187
+ - `notes point <text>` - add an important point under a section.
188
+ - `notes decision <text>` - add a decision.
189
+ - `notes action <text>` - add an action item.
190
+ - `notes transcript [--from-start]` - explicitly mirror raw transcript lines.
191
+ - `chat <message>` - send meeting chat.
192
+ - `presence <listening|thinking|speaking|acting|idle> [message]` - update the bot camera state; explicit messages are shown as live Comments activity on the camera page, bare state toggles only switch the state with its default message, and transcript webhooks add recent "heard" lines automatically without changing the agent-set state.
193
+ - `frames` - list buffered WebSocket frame sources and metadata.
194
+ - `frame [--source SOURCE] [--out FILE] [--archive]` - write an in-memory frame to disk on demand.
195
+ - `status` - show bot id, name, Recall status code, transcript line count, transcript file path, and frame source metadata.
196
+ - `transcript` - print the Recall post-call transcript if available, otherwise print the local transcript file.
197
+ - `screenshot [--out FILE]` - capture the local Mac screen with `screencapture`; use as a fallback when frame is not available.
198
+ - `leave` - remove bot, stop local processes, and clean state.
199
+ - `dicts` - list keyword dictionaries.
200
+
201
+ ## Storage
202
+
203
+ Runtime files live under `~/.samograph/` by default:
204
+
205
+ - `state.json` - active bot id, process ids, URLs, paths.
206
+ - `YYYYMMDD_HHMMSS_transcript.txt` - per-call live transcript; `join` never overwrites older transcripts.
207
+ - `frames/latest.png` and `frames/latest.json` - written only by `samograph frame`.
208
+
209
+ Generated runtime files are ignored by git. Do not point `--frame-dir` or `--out` into the repo unless you intentionally want a local artifact.
210
+
211
+ ## Environment Variables
212
+
213
+ `join` sets these automatically when it spawns the callback server (`_serve`); set them yourself only when running `samograph _serve` manually behind your own tunnel:
214
+
215
+ - `SAMOGRAPH_WEBHOOK_TOKEN` - token required by `POST /webhook` (`?token=` query parameter).
216
+ - `SAMOGRAPH_FRAME_TOKEN` - token required by the frame routes and `/video-ws`.
217
+ - `SAMOGRAPH_PRESENCE_TOKEN` - read token for the presence page and `/presence.json`.
218
+ - `SAMOGRAPH_PRESENCE_WRITE_TOKEN` - write token required by `POST /presence`.
219
+
220
+ Path overrides, mainly for tests and packaging:
221
+
222
+ - `SAMOGRAPH_HOME` - base directory for runtime files (default: your home directory; files live in `<base>/.samograph/`).
223
+ - `SAMOGRAPH_STATE_FILE` - path of `state.json` (default: `~/.samograph/state.json`).
224
+ - `SAMOGRAPH_DICT_DIR` - directory containing keyword dictionaries (default: `dictionaries/` in the package).
225
+
226
+ ## License
227
+
228
+ Apache License 2.0. See [LICENSE](LICENSE).
@@ -0,0 +1,100 @@
1
+ Nikolay Samokhvalov
2
+ Michael Christofides
3
+ Oleg Bartunov
4
+ Heikki Linnakangas
5
+ Andres Freund
6
+ Peter Geoghegan
7
+ Melanie Plageman
8
+ Alexander Korotkov
9
+ Alicja Kucharczyk
10
+ Álvaro Hernández
11
+ Lætitia Avrot
12
+ Markus Winand
13
+ Tomas Vondra
14
+ Masahiko Sawada
15
+ Tom Lane
16
+ Robert Haas
17
+ Peter Eisentraut
18
+ Bruce Momjian
19
+ Lukas Fittl
20
+ Jonathan Katz
21
+ Andrew Atkinson
22
+ Chelsea Dole
23
+ Haki Benita
24
+ Laurenz Albe
25
+ Claire Giordano
26
+ Andreas Scherbaum
27
+ Brendan Gregg
28
+ Erwin Brandstetter
29
+ Andrey Borodin
30
+ Alexander Kukushkin
31
+ Franck Pachot
32
+ Andrei Lepikhov
33
+ Gülçin Yıldırım Jelínek
34
+ Ryan Lambert
35
+ Joe Nelson
36
+ Ian Barwick
37
+ Kirk Wolak
38
+ Regina Obe
39
+ Paul Ramsey
40
+ pgvector
41
+ pgvectorscale
42
+ pgBackRest
43
+ Patroni
44
+ PgBouncer
45
+ PostGIS
46
+ TimescaleDB
47
+ Citus
48
+ OrioleDB
49
+ WAL-G
50
+ CloudNativePG
51
+ Spilo
52
+ repmgr
53
+ pg_auto_failover
54
+ pganalyze
55
+ pgBadger
56
+ pg_stat_statements
57
+ pg_stat_kcache
58
+ pg_wait_sampling
59
+ pg_buffercache
60
+ pg_qualstats
61
+ pg_repack
62
+ pg_partman
63
+ pg_cron
64
+ pg_duckdb
65
+ pg_ivm
66
+ pg_upgrade
67
+ pg_basebackup
68
+ pg_amcheck
69
+ pg_hint_plan
70
+ pg_squeeze
71
+ pg_stat_io
72
+ pg_stat_wal
73
+ pg_stat_monitor
74
+ pg_profile
75
+ pg_ash
76
+ pg_tle
77
+ pgmq
78
+ pgreplay
79
+ pgcopydb
80
+ Neon
81
+ Supabase
82
+ Crunchy Data
83
+ EnterpriseDB
84
+ Tembo
85
+ Xata
86
+ PeerDB
87
+ PlanetScale
88
+ YugabyteDB
89
+ AlloyDB
90
+ ClickHouse
91
+ DuckDB
92
+ FerretDB
93
+ MVCC
94
+ TOAST
95
+ PITR
96
+ autovacuum
97
+ WAL-E
98
+ HyperLogLog
99
+ HNSW
100
+ ivfflat