plX: The Excellent transpiler for Typescript and PostgreSQL

plX allows you to write safe postgresql procedures in typescript that transpile down to plpgsql. It is open source and licensed under the MIT license.

commandprompt.github.io
u/linuxhiker — 23 hours ago

pgColumnar 1.0-alpha2 released: Iceberg support, Object Storage and more!

Release date: 2026-08-18
Previous release: 1.0-alpha (2026-08-04)

pgColumnar is a columnar table access method for PostgreSQL. This is the second
alpha. It adds read-only Apache Iceberg support, reads and writes over
S3-compatible object storage, a maintenance daemon, and a broad round of
statistics, planner, performance, and security work. The on-disk native format
(PGCN v1) is unchanged; existing tables are read and written as before.

This release requires one upgrade command. See "Upgrading" at the end.

Highlights

  • Apache Iceberg, read-only. Read an Iceberg table at its current snapshot three ways: by metadata path, through a REST catalog, or as a foreign table. Row-level deletes of all three kinds (position, equality, and format-version-3 deletion vectors) are applied under their sequence rules, columns resolve by schema field id, and the foreign-data wrapper prunes whole data files from a query predicate.
  • Object storage. The Parquet and Iceberg readers, the Parquet export functions, and the foreign-data wrapper read from and write to s3://, http://, and https:// URLs. Remote access goes through a separate module, is confined to an operator-set endpoint allow-list, and refuses link-local addresses.
  • Maintenance and operations. A new pgcolumnar.autovacuum daemon performs online upkeep, pgcolumnar.maintenance_due reports what a table needs, and a stripe flush can run across background workers.
  • Security and hardening. Six memory-safety and denial-of-service fixes on the read and object-store paths, several from an adversarial audit, each with a regression test and a proof that removing the fix reintroduces the failure.

Apache Iceberg support (read-only)

  • Filesystem tables. pgcolumnar.iceberg_scan(metadata_path) reads a table given a column definition list. It resolves each output column to a schema field id, so a data file written before a column rename still reads. It applies position deletes, equality deletes, and format-version-3 deletion vectors (Puffin roaring bitmaps), each under its own sequence and scope rule, and verifies deletion-vector checksums, offsets, and cardinality. A data file with no field ids is bound by the table's schema.name-mapping.default; one with neither field ids nor a name mapping is refused rather than guessed. Only Parquet data files are read. Recorded paths are rebased onto the table's actual location and refused if they resolve outside it. Introspection functions iceberg_current_snapshoticeberg_data_filesread_avro_manifest, and read_manifest_list are included.
  • REST catalog. pgcolumnar.iceberg_rest_scan(catalog_uri, namespace, table_name) resolves a table through a catalog and reads it with the same projection and delete rules. The first argument may instead name a foreign server of the pgcolumnar_iceberg_catalog wrapper, which holds the catalog URI in server options and the bearer token or OAuth2 client credentials in a user mapping, so one role's secret is private from another and never appears in a function argument or the statement log. When the catalog vends short-lived storage credentials in its load-table reply, the reader uses them for the data files. iceberg_rest_namespaces and iceberg_rest_tables list a catalog.
  • Foreign-data wrapper. A foreign table over an Iceberg table (pgcolumnar_iceberg, option metadata_path) receives the query predicate and prunes whole data files before opening them: by partition value for identity, bucket[N]truncate[W], and the temporal transforms, and by stored minimum and maximum for integer and boolean columns. Pruning only removes files that cannot match, so results are unchanged, and EXPLAIN (ANALYZE) reports Files Pruned.

Object storage

  • The Parquet read and export functions, the Parquet foreign-data wrapper, and the Iceberg reader accept s3://http://, and https:// URLs wherever they accept a local path. s3:// requests are signed with AWS Signature Version 4; https:// verifies the server certificate when the object-store module is built with OpenSSL.
  • Remote access lives in a separate module, pgcolumnar_objstore, loaded on first use, so no second TLS stack enters the main server process by default.
  • pgcolumnar.objstore_allowed_endpoints lists the endpoints remote access may reach. It is empty by default, which refuses every remote endpoint, and it is superuser-only. Link-local and instance-metadata addresses are refused after name resolution.
  • Object-store credentials come from the server process environment, never a function argument or a log line.

Maintenance and operations

  • pgcolumnar.autovacuum is a maintenance daemon for the online upkeep that core autovacuum does not perform on a columnar table.
  • pgcolumnar.maintenance_due(rel, compact_due_fraction, recluster_due_fraction) reports whether a table is due for compaction or reclustering.
  • pgcolumnar.parallel_flush dispatches a stripe flush across background workers.
  • pgcolumnar.fsst_verdict_reuse caches a column's FSST keep-or-drop verdict, so a repeated write does not re-run the substring search.

Statistics and the planner

  • pgcolumnar.analyze() now collects most_common_vals and most_common_freqs, places histogram_bounds at PostgreSQL's own positions, honours the per-column statistics target, and counts null_frac over live rows.
  • EXPLAIN (ANALYZE) reports Columnar Usable Skip Predicates beside the skip counters.
  • The index-fetch cost penalty sizes row groups by a table's effective stripe_row_limit, and the grouped vector aggregate shares the scan node's input-cost estimate, so the planner prices a columnar scan more accurately.
  • The Iceberg foreign-data wrapper estimates a scan's row count from the manifests rather than a constant, so join planning above a large Iceberg table is sound.

Performance

  • A parameterized predicate (col >= $1 from a prepared statement or PL/pgSQL) now drives chunk-group skipping. On a generic plan such a scan previously read every chunk group.
  • Group and per-vector skipping read only the columns a query's predicates reference, rather than every column's zone map. On a wide table a one-predicate scan reads far fewer zone-map rows.
  • Reads of the delete_vector catalog use its index rather than a sequential scan, so a scan of a table with deletes is no longer proportional to the catalog size.
  • The Iceberg foreign-data wrapper decodes only the columns a query references.
  • The ungrouped batch fold gathers only the referenced columns per row, and a columnar scan whose filter cannot be pushed down skips decoding the filtered columns.

Security

  • The native varlena decoder bounds a value's stored length against its buffer, so a corrupt chunk or catalog row is refused with a clean error rather than an out-of-bounds read or a detoast through a bad pointer.
  • The local file read path no longer has a stat-before-open race, and the Iceberg, Avro, Parquet, Arrow, and parallel-copy readers refuse a FIFO or other non-regular file with a non-blocking open rather than a cancel-resistant hang.
  • The Iceberg reader refuses several classes of malformed or hostile table metadata, including a null manifest path that had crashed the backend, a null or negative position-delete ordinal, a null manifest-list sequence number, and a dangling current-schema-id.
  • The Thrift and Avro field-skip loops are interruptible, so a crafted Parquet footer or Avro manifest can no longer spin the backend uncancellably.
  • The object-store client refuses a URL path or host carrying CR or LF, closing an HTTP request-line injection.
  • The native dictionary decode path no longer reads uninitialized memory, and the Parquet dictionary decode path no longer reads out of bounds on a crafted file.

Correctness fixes

  • Concurrent UPDATE or DELETE of the same columnar row serializes on the row identity, so the losing writer gets a retryable serialization failure rather than a lost update.
  • A predicate on a column declared over a domain, and a bigint column compared against an unadorned integer literal, now prune chunk groups.
  • CREATE TABLE ... USING pgcolumnar AS SELECT no longer fails when the source is another access method.
  • pgcolumnar.sort_status works for a non-superuser who owns the table.
  • Failed export_parquet and export_arrow no longer leave a partial file.

Internal changes

  • The extension's exported C symbols are namespaced under pgcolumnar, and the custom scan node is PgColumnarScan. The native encoding-descriptor wire layout and the delete-vector visibility logic are each single-sourced, with the on-disk format unchanged and verified byte-identical.
  • default_version is 1.0-alpha2. Upgrade scripts from both previously shipped versions (1.0-dev, which the v1.0-alpha tag installed, and 1.0-alpha) ship with the extension, so a single ALTER EXTENSION pgcolumnar UPDATE reaches 1.0-alpha2 from either.

Upgrading

Install this build, then run the following in every database that has the
extension:

ALTER EXTENSION pgcolumnar UPDATE;

This is required. The C-symbol rename moves the symbol names each installed
function recorded when it was created; without the catalog update those records
point at symbols the new library does not export, and reading an existing
columnar table fails with could not find function "columnar_handler". No data
is converted and no SQL you write changes. The upgrade replaces catalog entries
only.

See docs/installation.md for the commands, including how to list the databases
that need the update.

Scope and limitations

  • Iceberg support is read-only, at a table's current snapshot, and reads Parquet data files only.
  • Object-storage reads take exact object keys.
  • HTTPS and S3 over TLS require the pgcolumnar_objstore module built with OpenSSL.
  • This is an alpha. Interfaces may change before 1.0.
u/linuxhiker — 2 days ago
▲ 24 r/Victron

Victron imports to be limited

I was checking the new FCC ban on foreign inverters and sure enough Victron is going to be hit. We will still be able to get any Victron that has a current FCC id, but in a year, we will all be running outdated hardware compared to other parts of the world.

reddit.com
u/linuxhiker — 16 days ago

pgColumnar : A new Columnar database extension for PostgreSQL 15+

pgColumnar is a column-oriented storage extension for PostgreSQL, implemented as a table access method. A table created USING pgcolumnar stores its data by column, with per-column compression, chunk-group skipping, and a vectorized aggregate path. It targets analytic workloads: large scans, aggregates, and column projections over append-mostly data.

pgColumnar builds from one source tree on PostgreSQL 15 through 19. It is licensed under the MIT License.

commandprompt.github.io
u/linuxhiker — 16 days ago
▲ 24 r/ruby+4 crossposts

GitHub - commandprompt/plx: PostgreSQL extension: write stored functions in Ruby, PHP, JavaScript, or Python dialects that transpile to plpgsql.

What plx is

plx is a PostgreSQL extension that lets you write stored functions and triggers in a Ruby, PHP, JavaScript, or Python dialect. When you run CREATE FUNCTION, plx transpiles the body to plpgsql and stores that plpgsql in pg_proc.prosrc. At run time the function is executed by PostgreSQL's own plpgsql interpreter. There is no separate language runtime loaded into the backend, and nothing new to run in production.

CREATE FUNCTION grade(score int) RETURNS text LANGUAGE plxruby AS $$
  return "A" if score >= 90
  return "B" if score >= 80
  return "F"
$$;

The front end is dialect-pluggable, and the set of dialects is growing. The dialects available today are:

Every plpgsql statement type is reachable from every dialect. See doc/PARITY.md for the construct matrix. The language names carry a plx prefix, so the extension coexists with the native PL/Ruby and PL/PHP languages in the same database.

Why it exists

PostgreSQL rewards moving logic into the database: triggers, constraints, set-returning functions, and cursors all run closest to the data. The standard way to write that logic is plpgsql. plpgsql is fast and trusted, but its syntax is unfamiliar to developers who spend their day in Ruby, PHP, JavaScript, or Python, and that unfamiliarity is often enough to keep logic in the application tier where it does not belong.

The usual alternative is an untrusted procedural language such as plpython3u or plperlu. Those give you a familiar syntax, but at a cost: they load a full language interpreter into the backend, most are untrusted and therefore superuser-only, and every row they touch is marshalled across an SPI boundary into the interpreter's own data structures.

plx takes a different position. A new language surface does not require a new execution engine. plx changes only the syntax you write, not what runs:

  • It is still plpgsql. The stored function body is plpgsql, executed by the plpgsql handler. You get plpgsql's performance and its safety as a trusted language, with no interpreter loaded into the backend.
  • Nothing is hidden. The generated plpgsql is stored in pg_proc.prosrc, where you can read exactly what will run. plx embeds the original source as a comment so the function is idempotent to re-transpile, but the executable body is ordinary plpgsql you can inspect, pg_dump, and review.
  • The cost is paid once. Translation happens at CREATE FUNCTION time, not per call. At run time there is no translation layer and no per-row marshalling beyond what plpgsql already does.

The goal is to meet developers where they are on syntax without changing what the database actually executes.

Who it is for

  • Application developers who want to push logic into the database using syntax they already know, rather than learning plpgsql first.
  • Teams standardizing on PostgreSQL who want triggers and functions written in a familiar dialect but running with plpgsql's performance and trust model.
  • Anyone who wants the generated plpgsql to be visible and reviewable rather than executed by an opaque runtime.

How it works

Each dialect provides a PlxSurface describing its keywords, block style, comment syntax, string interpolation, and variable sigil. A shared transpiler lexes the body, restructures statements, hoists typed DECLAREs, rewrites a fixed set of operators and interpolations, and passes the remaining expression text through to plpgsql and SQL unchanged. The call handler is plpgsql's own handler, so execution is plpgsql. See doc/ARCHITECTURE.md and doc/TRANSPILER.md.

Example

One function, written in three dialects, each producing the same plpgsql:

CREATE FUNCTION grade(score int) RETURNS text LANGUAGE plxruby AS $$
  grade #:: text
  if score >= 90
    grade = "A"
  elsif score >= 80
    grade = "B"
  else
    grade = "F"
  end
  return grade
$$;

CREATE FUNCTION grade(score int) RETURNS text LANGUAGE plxphp AS $$
  if ($score >= 90) { $grade = "A"; }
  elseif ($score >= 80) { $grade = "B"; }
  else { $grade = "F"; }
  return $grade;
$$;

CREATE FUNCTION grade(score int) RETURNS text LANGUAGE plxjs AS $$
  let grade = "F";
  if (score >= 90) { grade = "A"; }
  else if (score >= 80) { grade = "B"; }
  else { grade = "F"; }
  return grade;
$$;

The stored plpgsql (in pg_proc.prosrc) for each is:

DECLARE
  grade text;
BEGIN
  IF score >= 90 THEN grade := 'A';
  ELSIF score >= 80 THEN grade := 'B';
  ELSE grade := 'F';
  END IF;
  RETURN grade;
END;

Performance

Because functions execute as plpgsql, the plx dialects match plpgsql (within about 11 percent across five workloads) and inherit its performance profile: several times faster than the embedded-interpreter PLs on row iteration, and competitive on arithmetic, branching, and call overhead.

github.com
u/linuxhiker — 1 month ago
▲ 2 r/OffGridLiving+1 crossposts

Android_solar_dashboard

Changelog

All notable changes to Solar Dashboard for Android are documented here. Dates are in YYYY-MM-DD.

[1.0.0] - 2026-07-12

First public release. Signed APK attached to the GitHub release.

Added

  • Load-energy based "$ Saved" estimate. The dashboard Energy card estimates the value of the energy delivered to loads so far today, priced at the national average residential electricity rate. Basing it on load energy (not solar harvested) means it accrues day and night and never double-counts solar that flows through the battery. Backed by a persisted daily accumulator that resets at local midnight.
  • Energy card on the dashboard showing Harnessing (solar watts now), Expending (AC load watts now), and $ Saved (day total).
  • Low-battery alerts. Notify by email (Gmail SMTP with an App Password), SMS (from the phone's own SIM), and/or a local notification when the average battery state of charge crosses below a configurable threshold. Fires once per dip and re-arms only after recovering above threshold plus a margin. Alert configuration, including the Gmail App Password, is stored encrypted using the Android Keystore. Includes a "Send test alert" action.
  • BLE device discovery in the settings editor for both Victron and BMS devices: scan and pick a device by name and MAC to fill in the MAC automatically. Victron devices are matched by manufacturer data; BMS devices by advertised name and module OUI. Already-configured devices are excluded from the results.
  • Advertisement key sanitization. A pasted Victron key that includes separators or a leading MAC prefix is accepted (the trailing 32 hex are used).
  • "Next update" time shown next to the last-updated timestamp on the dashboard.
  • Collapsible sections on both the dashboard (device groups) and the settings screen (Devices, Polling & History, Low-Battery Alerts, Database Maintenance).
  • In-app Help screen documenting setup, the advertisement key, the Energy card, alerts, and troubleshooting.
  • First-run welcome screen.
  • Database maintenance: delete stored history by date range or in full, gated behind biometric or PIN authentication.
  • Restore on launch: the dashboard shows the last stored readings and chart history immediately, before the first live scan.
  • User manual with screenshots under docs/MANUAL.md.

Fixed

  • Victron devices never decoded. The advertisement parser read the record type from the wrong byte (the high nibble of byte 3 instead of byte 4). Verified against real SmartSolar MPPT and VE.Bus inverter hardware.
  • Victron devices appeared permanently offline. Victron Instant Readout is broadcast via BLE extended advertising, which Android's default legacy-only scan drops. The scanner now reports extended advertisements (setLegacy(false) and all supported PHYs).
  • False decode from stray beacons. Some Victron devices emit stray manufacturer-data beacons that could decode as garbage within a plausible range. The parser now verifies the key-check byte (the first byte of the advertisement key) before decoding, which also hardens wrong-key handling.
  • Dashboard stuck on "Waiting for first poll". Readings are now published incrementally as each device is read, so a single slow or offline device no longer blocks the first render.
  • Discovery showed "(unnamed)" devices. The advertised name is now captured whenever a non-null name arrives, not only on the first packet seen.

Changed

  • Codebase and user-facing text use plain punctuation (no em-dashes) and drop filler adjectives.

Security

  • Alert credentials (including the Gmail App Password) are stored with EncryptedSharedPreferences (Android Keystore), falling back to plain storage only if the Keystore is unavailable.
  • Destructive database-maintenance actions require device re-authentication (biometric or PIN).

[0.1.0] - Initial

  • Native Android port of the Python solar_dashboard BLE monitor for JBD/Vatrer BMS batteries and Victron charging/inverting devices.
  • Protocol parsers (JBD register 0x03, Victron Instant Readout AES-128-CTR) in pure Kotlin with a JUnit parity suite ported from the reference tests.
  • Foreground service polling BMS over GATT and scanning Victron advertisements, persisting readings to a local SQLite history database.
  • Jetpack Compose dashboard with per-device cards and history charts, and a settings screen for device and polling configuration.
github.com
u/linuxhiker — 1 month ago

Audax Data Manager (PgManage) 1.5 Released

Source and Packages:

Release Notes

  • New features:
    • implemented support for keyboard navigation in Database Explorer using Page-Up, Page-Down, Home, End and arrow keys #747
    • implemented support for opening context menu with keyboard "Context Menu" key in Data Editor and Query Tabs #745
    • implemented support for copying/pasting cell regions in the Data Editor #782
    • implemented hotkey support for Copy/Paste and Clear actions in data grids #749
    • implemented full-screen mode support for Data Editor and ERD tabs #791
    • implemented quick access to theme and font size settings in the app sidebar #787
    • implemented the "unsaved data" warning when user tries to close a workspace or tab #779
    • implemented command history deduplication to hide identical subsequent commands from history #780
    • implemented support for editing cell data in a dedicated modal window in addition to inline editing #781
    • implemented proper handling of Postgres byte array data in Query and Data Editor tabs #821
    • implemented clipboard Copy/Paste context menu options in Database Console and SSH Terminal tabs #820
    • implemented Oracle support in Schema Editor #840
    • implemented support for renaming database indexes in MySQL, MariaDB, SQLite3 and MS SQL Server #823
    • implemented support for updating column comments for Postgres, MySQL and MariaDB in schema editor
    • implemented support for multiple versions of Postgres binaries #827
  • UI/UX Improvements:
    • all modal windows can now be closed by Escape key #750
    • it is now possible to quickly select a query history record and load it in Query Editor by double clicking on it, thanks u/ccurvey #750
    • added "mac-style" text truncation in workspace tabs #288
    • extended clickable area of Database Explorer rows #776
    • extended clickable area of Data and Schema Editor grid action icons #800
    • extended clickable area of Quick Search icon and DDL tab Edit icon
    • clicking on the settings icon of the Welcome Screen shortcuts area now opens the Shortcuts tab in the Settings modal #801
    • adaptive layout is now used for data grids when entering fullscreen mode in Query tab #793
    • full-screen toggle controls now display a different icon based on the current state #792
    • prevent slight tab width shifts between active and inactive tab states #789
    • use more subtle colors for Database Explorer tree view toggle controls #788
    • increased default UI font size from 12px to 16px to match modern display pixel density #817
    • adjusted database tabs UI to scroll the newly opened tab into view #662
    • move database query error messages the Messages tab; automatically activate Messages tab it if error occurs. Thanks u/ccurvey for reporting the issue #700
    • improved Database Explorer responsiveness and loading speed when working with thousands of tables #837
    • improved DB explorer expanded node positioning to fully remain in the view port after node is auto-scrolled #847
    • improved DB explorer expanded node positioning to fully remain in the view port after Quick Search/Jump-to #846
    • clicking on minimized DDL / Properties component will expand it #849
    • added helpful tooltips to Settings, Backup and Restore tabs #824
    • reorganized context menus in Snippets module to be consistent with the rest of the app #809
    • unify data grid context menu styles to be consistent with the rest of the app #807
    • improved Database Explorer layout scaling when font size change #868
  • Bugs fixed:
    • fixed color markers not showing in the Data Editor after clipboard copy was used on that row #765
    • fixed hotkey conflicts by disallowing the registration of certain standard key combinations #748
    • fixed right-click on the Databases node in MySQL/MariaDB changing the selected database #806
    • fixed Data Editor cell data being fully cleared when cell is being edited and Backspace key is used
    • fixed Oracle DB Tree APIs when working with quoted tables #839
    • fixed SQL templates not working with quoted tables #859
    • fixed ERD tab not showing columns of tables with quoted name #858
    • fixed Query data context menu item doesn't work with quoted tables #860
    • fixed Data Editor not working with quoted tables #861
    • fixed Data Editor not recognizing record changes when editing data in quoted tables (postgresql) #866
    • made pigz and postgres native backup compression options mutually exclusive to prevent double compression of DB backups #832
    • fixed deadlocks in QueryTablesFields when working with SQLite3 databases #837
    • fixed Schema editor -> Foreign keys -> Column dropdown not showing all values #845
    • fixed DDL / Properties content not refreshed after search/jump-to #848
    • fixed snippet editor tab remaining open when the snippet is deleted #851
    • fixed incorrect database schema order in Database Explorer #843
    • fixed incorrect database partition order in Database Explorer #853
    • fixed Database Explorer API request failing when working with quoted tables in Oracle #839
  • Other Changes
    • exposed cherrypy socket queue and thread pool size as config parameters of pgmanage-server
    • implemented various enhancements in the web file manager dialog to handle huge files #826
    • extended logging_filter rules to strip DB credentials from log lines containing DB connection strings
    • optimized database metadata loading to make fewer trips to the database #837
    • bump django from 4.2.23 to 5.2.12
    • bump pymysql from 1.1.1 to 1.1.2
    • bump psutil from 6.1.1 to 7.2.2
    • bump oracledb from 3.2 to 3.4.2
    • bump sqlparse from 0.5.3 to 0.5.5
    • bump pymssql from 2.3.7 to 2.3.10
    • bump Node.js version from 18x to 22x
    • bump vite from 5.4.10 to 6.3.5
    • bump vitest from 2.1.9 to 3.2.4
    • bump u/vitest/ui from 2.1.9 to 3.2.4
    • bump u/vitest/coverage-v from 2.1.9 to 3.2.4
    • bump vite-plugin-node-polyfills from 0.22.0 to 0.25.0
    • bump u/vitejs/plugin-vue from 5.1.5 to 5.2.4
    • bump happy-dom from 15.11.7 to 20.6.2
u/linuxhiker — 1 month ago

Transparent Data Encryption for native PostgreSQL.

I was inspired by pgEdge's article on why there isn't #TDE (Transparent Data Encryption) for #PostgreSQL. I was curious about this because I knew that Percona had an Open Source TDE extension for our most beloved database.

EDIT: I misread the article. Percona isn't gatekeeping features. Their version just requires their fork of PostgreSQL. This version applies directly to Postgresql.org's version.

It runs on upstream PostgreSQL 16, 17, and 18 (no vendor server fork), keeps the file and KMIP key providers, keeps OpenBao (the Apache-2.0 KV v2 provider) while dropping HashiCorp Vault, and adds pluggable ciphers (AES-128/256-XTS for data files, AES-CTR for WAL) selectable via the open_pg_tde.data_cipher GUC, temporary file encryption, and FIPS enforcement. See the comparison with Percona pg_tde.

This extension provides the tde_heap access method

This access method:

  • Works with upstream PostgreSQL 16, 17, and 18, patched with the open_pg_tde core patch (see Installation)
  • Uses extended Storage Manager and WAL APIs
  • Encrypts table data, indexes, TOAST, WAL, and temporary files
  • Does not encrypt system catalogs or statistics (see the threat model)

Capabilities

  • Per-table encryption via tde_heap, with the cipher recorded per table
  • Data-file ciphers: AES-128-XTS (default), AES-256-XTS, AES-128-CBC, AES-256-CBC
  • WAL encryption (AES-CTR) for the whole cluster
  • Temporary file encryption (encrypt_temp_files)
  • Key management through a keyring file, KMIP-compatible systems, or OpenBao
  • FIPS enforcement: all cryptography uses FIPS-approved modes, and the server can require OpenSSL FIPS mode (FIPS compliance)
  • Runs on upstream PostgreSQL 16, 17, and 18 through a gated core patch
github.com
u/linuxhiker — 1 month ago
▲ 24 r/SQL+3 crossposts

plruby 2.4.0

PL/Ruby is a procedural-language handler that lets you write database functions in Ruby, stored and executed inside PostgreSQL. You get the expressiveness of Ruby and its standard library with the full power of a native PostgreSQL function: plain functions, set-returning functions, triggers, event triggers, and procedures with transaction control.

You can get it here (github).

Documentation

u/linuxhiker — 1 month ago
▲ 11 r/PostgreSQL+1 crossposts

plPHP v2.0 released

PL/php is a procedural-language handler that lets you write database functions in PHP, stored and executed inside PostgreSQL. You get the convenience of PHP's standard library with the full power of a native PostgreSQL function — plain functions, set-returning functions, triggers, event triggers, and procedures with transaction control.

github.com
u/linuxhiker — 2 months ago

[Free] PostgresWorld Webinars June

Free Registration

  • June 10th, 1pm ET: To AI or not to AI - Q&A

To AI or not to AI

  • June 18th, 1pm ET: The Open Source Approach: Building Production-Ready AI Apps with Postgres

The Open Source Approach: Building Production-Ready AI Apps with Postgres

  • June 23rd, 1pm ET: Multigres: One stop PostgreSQL Management and Scaling

Multigres: One stop PostgreSQL Management and Scaling

  • June 30th, 1pm ET: When AI Agents Write Your Code, Who Protects Your Database?

When AI Agents Write Your Code, Who Protects Your Database?

reddit.com
u/linuxhiker — 3 months ago
▲ 16 r/Victron+1 crossposts

Feedback on Victron (and JBD) Dashboard

Community, I have been working on a dashboard for my Victron + JBD setup and have reached a point where I would like to share. You can find it here:

https://github.com/ChronicallyJD/solar_dashboard

I would love some feedback. I wanted something dumb simple and it grew from there. It supports:

Victron BMV Victron Inverters Victron MPPT

JBD based batteries.

Runs locally, as a web server, as a TUI and has an API and MCP Server. It can also use SQLLite to store historical data.

It is free and BSD licensed. Enjoy!

u/linuxhiker — 3 months ago
▲ 4 r/skoolies+1 crossposts

Looking for feedback on Solar Dashboard

Community, I and my bro Claude having been working on an Open Source project to monitor our solar infrastructure. I know a lot of us run Victron and JBD based stuff. If you do, I am looking for your feedback (also considering adding Ecoflow). You can find the project here:

https://github.com/ChronicallyJD/solar_dashboard/

This is what it currently looks like (web and console):

  • Console

https://preview.redd.it/zr2pz6ck7w3h1.png?width=2521&format=png&auto=webp&s=2ccf9c40987bd1b3c4996b1b90f4b2e39f0ceb0a

  • Web

https://preview.redd.it/5ze2z0jo7w3h1.png?width=2521&format=png&auto=webp&s=9bb53e404b33fedbc69a2f9aa8eaae156bf6a3fd

reddit.com
u/linuxhiker — 3 months ago
▲ 13 r/OffGridLiving+1 crossposts

Solar Dashboard

I know there are a lot of options out there for a Solar Dashboard but I wanted something dumb simple that just gave me the information I was looking for with minimal setup. So, over the last 24 hours... I learned how Claude works and built a dashboard. It supports JBD based BMS batteries and Victron.

It is free and Open Source (BSD License).

https://github.com/ChronicallyJD/solar_dashboard/

u/linuxhiker — 3 months ago

May 26th 1PM ET (Online): Database DevOps: CD for Stateful Applications

RSVP Free here

Running stateful applications can provide many of the same advantages as stateless applications. In this talk, Stephen will share some thoughts on managing stateful applications as part of a CD Pipeline so that applications - and the application's data - can be versioned and deployed safely and repeatedly. This talk will discuss managing structural changes to a PostgreSQL database as part of a CD process. The talk will dive into automation approaches and tooling for managing data migrations between environments and running database schema migrations within a CI/CD pipeline. The talk will feature real-world examples where we discuss specific schema migrations, their possible performance impacts and downtime implications. We will demonstrate how a complex migration can be done with 0 downtime. With AI and CI/CD we can provide something better than before: A more testable, repeatable, and open way to deploy stateful applications. This talk features a practical demo of how CD tooling can empower users to automate data schema migrations within Kubernetes.

reddit.com
u/linuxhiker — 3 months ago