<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: joram87</title><link>https://news.ycombinator.com/user?id=joram87</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 02 May 2026 11:58:45 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=joram87" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[Show HN: VeilStream – Per-Branch Preview Environments]]></title><description><![CDATA[
<p># Show HN: VeilStream - Per-Branch Preview Environments<p>## Optionally with sanitized production data<p>I've been building VeilStream to solve a problem I kept running into: Rigorous evaluation of changes, such that they won't break production is hard. Staging is shared and often broken. Pulling to local setups are a pain. So PRs get a quick code skim and a "LGTM."
VeilStream spins up isolated preview environments from your `docker-compose.yml`, (optionally) complete with a sanitized snapshot of your production database.<p>## What happens when you open PR #247<p>1. GitHub webhook hits our API<p>2. We pull your branch and parse your compose file<p>3. Kubernetes manifests render from your compose services (and applied to our cluster)<p>4. A fresh namespace gets created with your containers<p>5. Optionally, postgres containers are seeded with your data<p>6. Health checks pass, you get a stable URL: `https://<unique-string>.env.veilstreamapp.com`<p>7. that link is commented back on any open PRs from that branch<p>Total time from push to working environment: about 2 minutes.<p>### The reviewer experience<p>Your teammate clicks the link. They're using your app with real data structure, real relationships, real edge cases—but emails are fake, SSNs are masked, and PII never leaves your production boundary.<p>No shared staging. No "wait, who's testing on staging right now?" No stepping on each other's test data. No risk to prod.<p>### When PR #247 gets merged or closed<p>The namespace, containers, and database are automatically destroyed. Nothing lingers.<p>## What it's not<p>- Not serverless/edge - this is for apps that run containers<p>- Not a Vercel competitor - we're focused on the full stack from a docker-compose perspective<p>- Not a database replication tool - the proxy works like a man-in-the-middle, not on the WAL<p>## MCP Server for AI Agents<p>We built an MCP server so Claude Code, Cursor, and other AI coding agents can deploy preview environments directly. Your agent can spin up an environment, run tests against it, and tear it down—all without leaving your editor.<p>## Tech Stack<p>- <i>Backend</i>: Go (API + reconciler)<p>- <i>Frontend</i>: React + TypeScript<p>- <i>Infrastructure</i>: Kubernetes, with dynamic namespace provisioning<p>- <i>Database proxy</i>: Custom Go proxy that interfaces with a database, and exposes the standard psql wire protocol, mimicing a server<p>## Links<p>- Landing page: <a href="https://www.veilstream.com" rel="nofollow">https://www.veilstream.com</a><p>- Application: <a href="https://app.veilstream.com" rel="nofollow">https://app.veilstream.com</a><p>- Example project: <a href="https://github.com/veilstream/example-music-company" rel="nofollow">https://github.com/veilstream/example-music-company</a><p>- Demo video: <a href="https://www.linkedin.com/posts/jonessteven_i-have-only-made-this-letter-longer-because-activity-7422806480107651073-R9BM" rel="nofollow">https://www.linkedin.com/posts/jonessteven_i-have-only-made-...</a><p>- Docs: <a href="https://docs.veilstream.com" rel="nofollow">https://docs.veilstream.com</a><p>Happy to answer questions.<p>Also: htaccess-style password protection is available for your preview environments.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=46874014">https://news.ycombinator.com/item?id=46874014</a></p>
<p>Points: 6</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 03 Feb 2026 17:28:20 +0000</pubDate><link>https://www.veilstream.com</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=46874014</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46874014</guid></item><item><title><![CDATA[New comment by joram87 in "Show HN: VeilStream – prod-like data without the PII"]]></title><description><![CDATA[
<p>We've not tried it with dblab engine. that would be an excellent combo (from my quick reading up on it). I'll add to my todo list to experiment with the pairing. It does look like some overlap in functionality, but mostly they are symbiotic.</p>
]]></description><pubDate>Thu, 19 Jun 2025 17:08:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=44320549</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=44320549</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44320549</guid></item><item><title><![CDATA[New comment by joram87 in "Show HN: VeilStream – prod-like data without the PII"]]></title><description><![CDATA[
<p>re: streamlining the custom filters<p>we were considering allowing the user to inject stored procedures themselves, and then use those, but currently, we're opting to implemented them ourselves, so we have better control over the user experience. In the future, for very custom stored procedures, I think we may allow the custom path.</p>
]]></description><pubDate>Wed, 18 Jun 2025 19:04:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=44312468</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=44312468</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44312468</guid></item><item><title><![CDATA[New comment by joram87 in "Show HN: VeilStream – prod-like data without the PII"]]></title><description><![CDATA[
<p>Oh yes! We made that possible through conditionals. We default to unconditional modification, but if you toggle the conditional option, you can provide a list of conditions which, if they all pass, trigger the modifications.<p>A future improvement to that: currently the conditions are all ANDed together, I'd like to support more types of boolean logic in the future. :)</p>
]]></description><pubDate>Wed, 18 Jun 2025 18:48:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=44312333</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=44312333</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44312333</guid></item><item><title><![CDATA[New comment by joram87 in "Show HN: VeilStream – prod-like data without the PII"]]></title><description><![CDATA[
<p>- jsonb : kinda, we do static json replacement, with more complex rules on the horizon, where you could replace some regex-like path with a random func.<p>- uuids: no, but I should. adding to my list :)<p>- ip addresses: yes ip4 and ip6, but I want to go further and let you configure the replacement ips to be within specified cidr blocks<p>- arrays: again, not yet. Do you mind if I ask the use case? Arrays are commonly done as single rows and foreign keys/look ups, which we can do.<p>We've internally got the path for adding new filter types (dashboard configuration, api layer storage, and proxy rule implementation) pretty optimized. it takes us a day or two to add simple requested filters. longer for more complex ones.</p>
]]></description><pubDate>Wed, 18 Jun 2025 18:23:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=44312147</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=44312147</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44312147</guid></item><item><title><![CDATA[New comment by joram87 in "Show HN: VeilStream – prod-like data without the PII"]]></title><description><![CDATA[
<p>ah yeah, I linked the web app, the landing page is here: <a href="https://www.veilstream.com/" rel="nofollow">https://www.veilstream.com/</a>
Currently we don't have much publicly on the GitHub page.</p>
]]></description><pubDate>Wed, 18 Jun 2025 14:35:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=44310275</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=44310275</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44310275</guid></item><item><title><![CDATA[New comment by joram87 in "Show HN: VeilStream – prod-like data without the PII"]]></title><description><![CDATA[
<p>Good questions.<p>We do not do connection pooling yet. currently it's a fresh connection per query (which adds a bit of latency). We're intending to add basic connection pooling shortly after launch. That said, if you put it in-front of pgbouncer, that would work well.<p>PostGIS and other extensions are on the radar, but currently are not supported. The proxy works with the extensions, but can't mask the data yet. If we get requests for specific extensions to be fully supported, we'll implement (same with extra masking data types). I look forward to the GIS data implementation, as I've met one of the postGIS contributors and have discussed several of those masking complexities.</p>
]]></description><pubDate>Wed, 18 Jun 2025 14:33:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=44310262</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=44310262</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44310262</guid></item><item><title><![CDATA[Show HN: VeilStream – prod-like data without the PII]]></title><description><![CDATA[
<p># TL;DR
We built VeilStream, a drop-in, read-only PostgreSQL proxy that strips, masks, or anonymizes sensitive values as queries stream through. In less than two minutes, you can put a proxy in front of a PostgreSQL database, whether hosted on your laptop, Neon, Supabase, or a cloud provider, and the user is able to start configuring filter rules.<p>The use cases we're trying to solve are:<p>- Production-like data in development environments<p>- Improve incident handling by masking all data that is not relevant<p>- Share a subset of your data<p>- Protecting data being shipped into a data lake<p>- Safe data to expose in internal tooling, metrics, or BI dashboards<p>- Empower non-technical staff to vibe-code against sanitized data<p># How it fits in your stack<p>- Role based policies: define masking rules in our web dashboard<p>- The proxy picks up the configuration and starts applying rules automatically.<p>## You host it<p>- it's a docker container, two environment variables: an api key, and the database URI connection<p>## We host it<p>- Drop-in proxy: no code changes. Point your connection string at a new endpoint, that's it.<p># How it works (and how fast it is)<p>Restructuring the query AST based on the config. AST rewrites depend on the text/structure of the query, not on how many rows the database eventually returns, so they are effectively O(1) with respect to result size.<p># Status & feedback wanted<p>VeilStream is GA, but billing isn’t switched on yet so it's currently free at all tiers. We’d love your thoughts on:<p>- throughput / latency in real workloads<p>- Filter rules & DevX<p>- weird edge-case queries (pg_dump, logical replication, etc.)<p>I’ll be around all day to answer questions and dig into issues.<p># tagline<p>Ship features with data you can trust and privacy you don't have to worry about.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44310026">https://news.ycombinator.com/item?id=44310026</a></p>
<p>Points: 22</p>
<p># Comments: 12</p>
]]></description><pubDate>Wed, 18 Jun 2025 14:06:36 +0000</pubDate><link>https://app.veilstream.com</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=44310026</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44310026</guid></item><item><title><![CDATA[New comment by joram87 in "PostgreSQL Anonymizer"]]></title><description><![CDATA[
<p>I probably should mention the name of the tool I'm working on... oops, it's VeilStream :)</p>
]]></description><pubDate>Fri, 17 Jan 2025 19:59:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=42742607</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=42742607</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42742607</guid></item><item><title><![CDATA[New comment by joram87 in "PostgreSQL Anonymizer"]]></title><description><![CDATA[
<p>I've been working on something similar, starting a company around the idea! We realized that a lot of people had concerns or challenges with installing an extension on their production database and also that they wanted non-technical folks in compliance or HR to be able to configure and maintain the rules for individual employees. pgAnonymizer is a database extension but we structured ours to be a proxy server that hides/anonymizes/filters the data. We made a web dashboard that simplifies the configuration process, and allows you to configure what to do if columns get added to the database (default mask or hide new columns). We're about to go GA and if anyone has any feedback or wants to a free beta testing trial, I'd love to chat</p>
]]></description><pubDate>Fri, 17 Jan 2025 19:57:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=42742589</link><dc:creator>joram87</dc:creator><comments>https://news.ycombinator.com/item?id=42742589</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42742589</guid></item></channel></rss>