<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on fyannk</title><link>https://fyannk.github.io/projects/</link><description>Recent content in Projects on fyannk</description><generator>Hugo</generator><language>en</language><atom:link href="https://fyannk.github.io/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>pgToolBox</title><link>https://fyannk.github.io/projects/pgtoolbox/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fyannk.github.io/projects/pgtoolbox/</guid><description>&lt;p&gt;pgToolBox is a Kubernetes and OpenShift operator. For each &lt;code&gt;PgConsole&lt;/code&gt; you&#10;declare, it composes a dedicated pod next to one CloudNativePG cluster: an&#10;authentication proxy, pgConsole, an embedded pgAdmin, and optionally&#10;pgObjectStoreViewer.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;One console per cluster, never shared.&lt;/strong&gt; Dedicated proxy, dedicated&#10;pgAdmin, dedicated credentials: isolation wins over resource sharing.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Users are Kubernetes objects.&lt;/strong&gt; A &lt;code&gt;PgToolBoxUser&lt;/code&gt; binds an identity to&#10;&lt;code&gt;view&lt;/code&gt;, &lt;code&gt;poweruser&lt;/code&gt; or &lt;code&gt;dba&lt;/code&gt;. A &lt;code&gt;PgToolBoxAccessRequest&lt;/code&gt; lets an unknown&#10;user ask a &lt;code&gt;dba&lt;/code&gt; for access from the proxy&amp;rsquo;s 403 page.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Any mix of sign-in methods.&lt;/strong&gt; OIDC, OpenShift OAuth and local accounts at&#10;once, so a local account still works when the identity provider is down.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Every exposure type.&lt;/strong&gt; OpenShift &lt;code&gt;Route&lt;/code&gt;, &lt;code&gt;Ingress&lt;/code&gt;, Gateway API&#10;&lt;code&gt;HTTPRoute&lt;/code&gt; or &lt;code&gt;ClusterIP&lt;/code&gt;, behind a generated default-deny &lt;code&gt;NetworkPolicy&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;It will ship as a Helm chart and an OLM bundle once it leaves pre-alpha.&lt;/p&gt;</description></item><item><title>pgConsole</title><link>https://fyannk.github.io/projects/pgconsole/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fyannk.github.io/projects/pgconsole/</guid><description>&lt;p&gt;pgConsole is an operational console for one CloudNativePG &lt;code&gt;Cluster&lt;/code&gt;. It shows&#10;operator status and conditions, instance pods, recent events, backups, pooler&#10;metrics and bounded log tails, and offers a small set of day-2 actions you&#10;enable explicitly.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Every claim has a source.&lt;/strong&gt; Operator-reported, Kubernetes-observed and&#10;derived state stay visibly distinct.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Failure stays visible.&lt;/strong&gt; Broken watches, forbidden reads and stale or&#10;truncated data become &lt;code&gt;unknown&lt;/code&gt; or &lt;code&gt;stale&lt;/code&gt;, never healthy.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;A small, guarded mutation surface.&lt;/strong&gt; Backup, reload, restart and promote&#10;are all it can do, each behind access levels, confirmation, CSRF protection,&#10;audit and a feature flag.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;It reports what CloudNativePG and Kubernetes claim. It does not independently&#10;prove replication health, data integrity or restorability.&lt;/p&gt;</description></item><item><title>pgObjectStoreViewer</title><link>https://fyannk.github.io/projects/pgobjectstoreviewer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fyannk.github.io/projects/pgobjectstoreviewer/</guid><description>&lt;p&gt;pgObjectStoreViewer inspects PostgreSQL backup repositories in S3, Azure Blob&#10;Storage and GCS. It turns object-store metadata into an inventory, a Barman&#10;Cloud backup catalog, WAL continuity diagnostics and conservative recovery&#10;coverage.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Read-only by construction.&lt;/strong&gt; It can list and read bounded metadata. It has&#10;no upload, delete or restore path.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WAL-aware.&lt;/strong&gt; Timelines, duplicates, partial files, and candidate or&#10;confirmed gaps.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Honest about gaps in its own view.&lt;/strong&gt; Incomplete, stale, truncated or&#10;unsupported evidence stays &lt;code&gt;unknown&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;It reports structural evidence. It does not prove that a restore will succeed.&#10;pgBackRest support is planned.&lt;/p&gt;</description></item><item><title>NodeEcho</title><link>https://fyannk.github.io/projects/nodeecho/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fyannk.github.io/projects/nodeecho/</guid><description>&lt;p&gt;NodeEcho is a controller that copies selected node state onto the pods running&#10;on that node, so a namespace-scoped operator can react to cordons, drains and&#10;topology without cluster-wide access to &lt;code&gt;Node&lt;/code&gt; objects.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Reflects cordon state and selected taints onto bound pods.&lt;/li&gt;&#10;&lt;li&gt;Copies only the node labels and annotations you allow, including custom&#10;topology.&lt;/li&gt;&#10;&lt;li&gt;Writes nothing when there is nothing to echo, and never overwrites another&#10;writer&amp;rsquo;s keys.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The first use case is CloudNativePG: keeping drain-aware switchovers when the&#10;operator cannot read nodes. Upstream CloudNativePG does not consume these&#10;labels yet. Not production-ready, and no version is released.&lt;/p&gt;</description></item><item><title>pgAdmin images</title><link>https://fyannk.github.io/projects/pgadmin/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fyannk.github.io/projects/pgadmin/</guid><description>&lt;p&gt;Two pgAdmin container images that run without added capabilities, published to&#10;&lt;code&gt;ghcr.io/fyannk/pgadmin&lt;/code&gt;.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt;&lt;/strong&gt; is the official &lt;code&gt;dpage/pgadmin4&lt;/code&gt; release with only the&#10;privileged Python capability removed.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;version&amp;gt;-hardened&lt;/code&gt;&lt;/strong&gt; rebuilds that pgAdmin release from source on a fresh&#10;base, with refreshed OS and Python dependencies and without Postfix or&#10;&lt;code&gt;sudo&lt;/code&gt;. &lt;code&gt;latest&lt;/code&gt; always points here.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Both listen on &lt;code&gt;8080&lt;/code&gt; or &lt;code&gt;8443&lt;/code&gt; by default. pgToolBox runs the hardened&#10;image unless told otherwise.&lt;/p&gt;</description></item><item><title>Code Personal</title><link>https://fyannk.github.io/projects/vscode-personnal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fyannk.github.io/projects/vscode-personnal/</guid><description>&lt;p&gt;I wanted one clear app for work, with work accounts and work AI assistants,&#10;and one for me, with my accounts, my AIs and my own projects. Code Personal&#10;is that second app, fully separate from the first: its own name, executable, data folders, URL protocol and icon. It doesn&amp;rsquo;t&#10;conflict with &lt;code&gt;code&lt;/code&gt;, &lt;code&gt;visual-studio-code-bin&lt;/code&gt; or &lt;code&gt;codium&lt;/code&gt; and copies nothing&#10;from the work install.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Upstream, barely touched.&lt;/strong&gt; It builds the stable release of&#10;&lt;a href="https://github.com/microsoft/vscode"&gt;VS Code OSS&lt;/a&gt; with only three upstream&#10;inputs customized and no TypeScript or CSS patches. No VSCodium patch set is&#10;used.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Full-featured.&lt;/strong&gt; Copilot is built from upstream source and bundled.&#10;Extensions come from &lt;a href="https://open-vsx.org/"&gt;Open VSX&lt;/a&gt; with signature&#10;verification kept on, through an adapter for Open VSX&amp;rsquo;s Ed25519 signatures.&#10;A Remote SSH extension is bundled, and it only ever downloads its own server.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Telemetry off by default.&lt;/strong&gt; VS Code OSS has no Microsoft telemetry&#10;endpoint, but bundled Copilot reports usage to GitHub unless&#10;&lt;code&gt;telemetry.telemetryLevel&lt;/code&gt; is &lt;code&gt;off&lt;/code&gt;, so that is the default. You can still&#10;opt in.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Built like I&amp;rsquo;d want a server package built.&lt;/strong&gt; A pinned Arch container&#10;checks upstream every six hours, builds, verifies identity separation and&#10;the bundled Copilot, launches the app headless, installs a real Open VSX&#10;extension, and insists that a tampered package fails verification. Only&#10;then does it publish an Arch package for CachyOS and a &lt;code&gt;.deb&lt;/code&gt;, the latter&#10;test-installed on Ubuntu 24.04.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The builds are traceable, not claimed to be byte-for-byte reproducible.&lt;/p&gt;</description></item></channel></rss>