# Paul Gross's Blog - Complete Article Index > Technical blog by Paul Gross, a Principal Software Engineer with 15+ years of experience in payments, PostgreSQL, high availability systems, and developer tools. ## About the Author Paul Gross is a Principal Software Engineer based in Seattle with deep expertise in building payment systems and scalable infrastructure. Now, he primarily does independent consulting. His career includes: - **Rvvup** - Principal Software Engineer - **Ripple** - Senior Software Engineer working on cryptocurrency payments - **Braintree/PayPal** - Lead Software Developer, built and scaled the payment gateway - **ThoughtWorks** - Consultant Contact: - Website: https://www.pgrs.net - Email: pgross@gmail.com - GitHub: https://github.com/pgr0ss - Twitter: https://twitter.com/pgr0ss - LinkedIn: https://www.linkedin.com/in/pgr0ss/ - Mastodon: https://hachyderm.io/@pgr0ss - Bluesky: https://bsky.app/profile/pgr0ss.bsky.social - Keybase: https://keybase.io/pgr0ss ## Open Source Projects ### pgledger A pure PostgreSQL double-entry ledger implementation. - Repository: https://github.com/pgr0ss/pgledger - Features: Atomic transactions, account versioning, multi-currency support, full SQL queryability - Performance: 10,000+ transfers per second on modest hardware --- ## Complete Article List by Topic ### PostgreSQL & Databases #### PostgreSQL Scripting Tips (2026) https://www.pgrs.net/2026/01/06/postgresql-scripting-tips/ Tips for writing PostgreSQL scripts including: storing response variables with \gset, transposing data with \crosstabview, and showing SQL statements with output in the same file. #### pgledger in PostgreSQL is Fast (2025) https://www.pgrs.net/2025/05/16/pgledger-in-postgresql-is-fast/ Performance benchmarks for pgledger showing it can handle 10,000+ transfers per second on PostgreSQL. #### pgledger: Ledger Implementation in PostgreSQL (2025) https://www.pgrs.net/2025/03/24/pgledger-ledger-implementation-in-postgresql/ Introduction to pgledger, a pure PostgreSQL double-entry ledger. Explains why ledgers are fundamental to financial software and why implementing in PostgreSQL provides atomicity benefits. #### Two Exciting PostgreSQL Features to Improve Null Handling (2023) https://www.pgrs.net/2023/11/14/two-exciting-postgresql-features-to-improve-null-handling/ Coverage of IS DISTINCT FROM operator and NULLS NOT DISTINCT constraint in PostgreSQL for better null handling. #### Safe Operations For High Volume PostgreSQL (2014) https://www.pgrs.net/2014/05/14/safe-operations-for-high-volume-postgresql/ Practical guide to running schema migrations without downtime on high-traffic PostgreSQL databases. Lists safe operations (add column, drop column, add index concurrently, drop constraint, add default) vs unsafe operations with workarounds. #### Scaling PostgreSQL at Braintree: Four Years of Evolution (2012) https://www.pgrs.net/2012/10/16/scaling-postgresql-at-braintree-four-years-of-evolution/ Journey from MySQL to PostgreSQL at Braintree Payments including: migration from MySQL, implementing horizontal sharding by merchant, moving from DRBD to streaming replication, and automated failover with Pacemaker. #### PostgreSQL Allows Duplicate Nulls in Unique Columns (2008) https://www.pgrs.net/2008/01/11/postgresql-allows-duplicate-nulls-in-unique-columns/ Explanation of PostgreSQL's behavior allowing multiple NULL values in unique columns. ### DuckDB & Data Analysis #### Visualizing Financial Data with DuckDB and Plotly (2025) https://www.pgrs.net/2025/05/22/visualizing-financial-data-with-duckdb-and-plotly/ Using DuckDB with Plotly for financial data visualization. #### DuckDB over Pandas/Polars (2024) https://www.pgrs.net/2024/11/01/duckdb-over-pandas-polars/ Comparison of DuckDB vs Pandas/Polars for data analysis. Argues SQL with DuckDB is simpler for occasional users than learning Polars/Pandas APIs. #### DuckDB as the New jq (2024) https://www.pgrs.net/2024/03/21/duckdb-as-the-new-jq/ Using DuckDB for command-line JSON and CSV processing as an alternative to jq. ### Payments & Financial Systems #### Double-Entry Ledgers: The Missing Primitive in Modern Software (2025) https://www.pgrs.net/2025/06/17/double-entry-ledgers-missing-primitive-in-modern-software/ Comprehensive argument for why double-entry ledger modeling should be used more widely in software. Includes examples for: recording payments with receivables and refunds, reward points tracking, API usage credits, content moderation, and inventory management. #### Lessons Learned From Payments Startups (2024) https://www.pgrs.net/2024/01/26/lessons-learned-from-payments-startups/ Comprehensive guide from building payment platforms: - Use existing tools before adding new ones - Optimize for change with simple solutions - Focus on iteration and incremental delivery - Balance test speed vs accuracy (fakes over mocks) - Modular monolith architecture - Put everything in the database for debugging - Make database querying easy (Metabase) - Job drain pattern for data consistency - Check in generated files for diffing - Decision logs for institutional knowledge - Continuous deployment #### Storing External Requests (2023) https://www.pgrs.net/2023/12/14/storing-external-requests/ Pattern for storing API request/response data in your database rather than just logs. Enables better debugging by correlating requests with database state. ### High Availability & Infrastructure #### Continuous Deployment Isn't Just for Applications (2019) https://www.pgrs.net/2019/01/22/continuous-deployment-isnt-just-for-applications/ Applying continuous deployment to internal libraries using version schemes like major.datetime.description.git_revision and publishing test versions from pull requests. #### Testing Isn't Enough: Fighting Bugs with Hacks (2014) https://www.pgrs.net/2014/12/20/testing-isnt-enough-fighting-bugs-with-hacks/ Defense-in-depth strategies for preventing bugs in critical systems beyond just testing. #### Development Hacks to Prevent Mistakes (2013) https://www.pgrs.net/2013/10/04/development-hacks-to-prevent-mistakes/ Practical techniques to catch errors during development. #### High Availability at Braintree (2013) https://www.pgrs.net/2013/02/21/high-availability-at-braintree/ RubyConf Australia talk on building highly available payment systems including architecture patterns and operational practices. #### How We Moved Our Data Center 25 Miles Without Downtime (2012) https://www.pgrs.net/2012/01/10/how-we-moved-our-datacenter-25-miles-without-downtime/ Techniques for zero-downtime infrastructure migrations including traffic pausing strategies. #### How Braintree Builds a Platform for Developers (2012) https://www.pgrs.net/2012/05/02/how-braintree-builds-a-platform-for-developers/ Building developer-focused payment APIs. #### Web Proxy in Node.js for High Availability (2010) https://www.pgrs.net/2010/02/01/web-proxy-in-node-js-for-high-availability/ Using Node.js as a proxy layer for high availability. ### Developer Tools & Productivity #### Personal Notes Tooling (2025) https://www.pgrs.net/2025/01/29/personal-notes-tooling/ Setup for personal knowledge management and note-taking. #### The Many Ways to Read Tech News (2024) https://www.pgrs.net/2024/03/29/the-many-ways-to-read-tech-news/ Survey of approaches for consuming technical news and staying current. #### ULID Identifiers and ULID Tools Website (2023) https://www.pgrs.net/2023/01/10/ulid-identifiers-and-ulid-tools-website/ Introduction to ULIDs (Universally Unique Lexicographically Sortable Identifiers) as an alternative to UUIDs. #### Simple Command Line Function to Decode JWTs (2022) https://www.pgrs.net/2022/06/02/simple-command-line-function-to-decode-jwts/ Using jq to decode JWTs locally without web tools. Includes functions for zsh and Fish shell. #### JDBI with Custom Types (2021) https://www.pgrs.net/2021/07/20/jdbi-with-custom-types/ Using JDBI Java database library with custom types. #### Vim Fun (2018) https://www.pgrs.net/2018/01/05/vim-fun/ Vim tips and tricks. #### Dropwizard Can Be Simple (2016) https://www.pgrs.net/2016/12/05/dropwizard-can-be-simple/ Building simple Java services with Dropwizard. #### Java REPL with JShell and Bazel (2015) https://www.pgrs.net/2015/09/14/java-repl-with-jshell-and-bazel/ Using Java's REPL with Bazel build system. #### Migrating from Gradle to Bazel (2015) https://www.pgrs.net/2015/09/01/migrating-from-gradle-to-bazel/ Experience report migrating from Gradle to Bazel build system. #### Partial Function Application in Java 8 (2015) https://www.pgrs.net/2015/04/23/partial-function-application-in-java-8/ Functional programming techniques in Java 8. #### Exporting YNAB to Ledger (2016) https://www.pgrs.net/2016/10/20/exporting-ynab-to-ledger/ Converting YNAB (You Need A Budget) data to Ledger CLI format. ### Ruby & Rails #### RailsConf: Rails in the Large (2009) https://www.pgrs.net/2009/06/27/railsconf-presentation/ Talk on scaling Rails applications. #### Useful Unix Tricks Series - Part 1: https://www.pgrs.net/2007/09/06/useful-unix-tricks/ - Part 2: https://www.pgrs.net/2007/10/08/useful-unix-tricks-part-2/ - Part 3: https://www.pgrs.net/2009/02/20/useful-unix-tricks-part-3/ - Part 4: https://www.pgrs.net/2011/08/16/useful-unix-tricks-part-4/ #### Curator and Data Migrations - Untangle Domain and Persistence Logic with Curator: https://www.pgrs.net/2012/02/21/untangle-domain-and-persistence-logic-with-curator/ - Data Migrations for NoSQL with Curator: https://www.pgrs.net/2012/03/08/data-migrations-for-nosql-with-curator/ #### Testing Patterns - Testing Interactions with a State-Based Approach: https://www.pgrs.net/2012/07/07/testing-interactions-with-a-state-based-approach/ - Automated Testing of Database Rollback Scripts: https://www.pgrs.net/2007/09/21/automated-testing-of-database-rollback-scripts-in-rails/ ### Capistrano & Deployment - Deploying Trunk or Tags with Capistrano: https://www.pgrs.net/2008/10/29/deploying-trunk-or-tags-with-capistrano/ - Capistrano with Pairing Stations: https://www.pgrs.net/2008/07/19/capistrano-with-pairing-stations/ - Capistrano Dry Run: https://www.pgrs.net/2008/09/06/capistrano-dry-run/ --- ## Key Themes ### Building Payment Systems Paul has extensive experience building payment platforms from scratch, with lessons on architecture, testing, and operational practices. ### PostgreSQL Expertise Deep knowledge of PostgreSQL operations, scaling, and best practices for high-volume systems. ### High Availability Practical experience with zero-downtime deployments, datacenter migrations, and building reliable systems. ### Developer Productivity Focus on tools and practices that help developers work efficiently. --- ## Presentations - Testing Isn't Enough: Fighting Bugs with Hacks - High Availability at Braintree (RubyConf Australia) - Rails in the Large (RailsConf 2009) - How Braintree Builds a Platform for Developers (Intuit CTOF) - Migrating from MySQL to PostgreSQL (PgEast) - Capistrano (Chicago Ruby)