41554 blogs · [ { "id": "01a08797-44bb-717d-976f-0b664ce11ea2", "title": "Build better software to build software better", "url": "https://ktema.org/articles/build-better-software-to-build-software-better/", "published_at": "2025-11-06T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b664dbae156", "title": "On Minimalism in Software", "url": "https://ktema.org/articles/on-software-minimalism/", "published_at": "2025-10-12T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b664dd02a44", "title": "Stave", "url": "https://ktema.org/projects/stave/", "published_at": "2025-08-15T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b664e6901aa", "title": "The Worst Thing I Ever Built", "url": "https://ktema.org/articles/the-worst-thing-i-ever-built/", "published_at": "2025-05-30T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b664e876984", "title": "monitor-affinity", "url": "https://ktema.org/projects/monitor-affinity/", "published_at": "2025-01-10T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b664f615aaf", "title": "NSO Paperwork and Statsbooks", "url": "https://ktema.org/talks/nso-paperwork-and-statsbooks/", "published_at": "2024-09-08T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b664ffb4a95", "title": "Scoreboard Operations", "url": "https://ktema.org/talks/scoreboard-operations/", "published_at": "2024-09-08T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665031dffa", "title": "Intro to Tournaments and Sanctioned Play", "url": "https://ktema.org/talks/intro-to-tournaments-and-sanctioned-play/", "published_at": "2024-09-07T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6650d67419", "title": "Non-Skating Official Guides", "url": "https://ktema.org/projects/nonskating-official-guides/", "published_at": "2024-08-04T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6651a88fec", "title": "Tournaments and Sanctioned Play for Non-Skating Officials", "url": "https://ktema.org/talks/tournaments-and-sanctioned-play-for-non-skating-officials/", "published_at": "2024-03-20T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6651fd7d88", "title": "On Creating Automation Products", "url": "https://ktema.org/articles/on-creating-automation-products/", "published_at": "2024-01-20T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6652ca604b", "title": "The Overengineered Resume with Zola, JSON Resume, Weasyprint, and Nix", "url": "https://ktema.org/articles/the-overengineered-resume/", "published_at": "2023-11-09T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665362d4ef", "title": "Supercharge Developer Productivity with Delivery Cloud", "url": "https://ktema.org/talks/supercharge-developer-productivity-with-delivery-cloud/", "published_at": "2023-07-20T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66536566c5", "title": "Understanding Build Orgs, Part 3: Manipulating the Build Org", "url": "https://ktema.org/articles/understanding-build-orgs-manipulating-the-build-org/", "published_at": "2023-02-23T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6653ed0f21", "title": "PayTransparency.work", "url": "https://ktema.org/projects/pay-transparency-work/", "published_at": "2023-02-21T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6654b77382", "title": "Understanding Build Orgs, Part 2: How a Build Org is Built", "url": "https://ktema.org/articles/understanding-build-orgs-how-build-org-is-built/", "published_at": "2023-01-31T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66553581b3", "title": "Understanding Build Orgs, Part 1: Build Orgs and Environmental Dependencies", "url": "https://ktema.org/articles/understanding-build-orgs-environmental-dependencies/", "published_at": "2023-01-24T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665570961b", "title": "The Sneaky Way to Install a JWT Connected App", "url": "https://ktema.org/articles/sneaky-way-to-install-jwt-connected-app/", "published_at": "2023-01-13T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66560ca6ee", "title": "Salesforce DevOps: Top Tech Trends", "url": "https://ktema.org/talks/salesforce-devops-top-tech-trends/", "published_at": "2022-12-07T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6656a846db", "title": "Supercharge Developer Productivity with Cumulus Suite", "url": "https://ktema.org/talks/supercharge-developer-productivity-with-cumulus-suite/", "published_at": "2022-09-22T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6656f307c6", "title": "The Magic of APIs for Admins", "url": "https://ktema.org/talks/magic-of-apis-for-admins/", "published_at": "2022-07-23T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665713f3bb", "title": "Why Does `git rebase` Merge Conflict?", "url": "https://ktema.org/articles/why-does-git-rebase-merge-conflict/", "published_at": "2022-06-25T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6657997374", "title": "Wage Transparency in Colorado and Beyond", "url": "https://ktema.org/articles/wage-transparency-colorado-beyond/", "published_at": "2022-05-30T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665876a137", "title": "The Risks of Copying and Pasting Apex", "url": "https://ktema.org/articles/risks-copying-pasting-apex/", "published_at": "2022-05-18T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6659542c4f", "title": "What Does `unpackagedMetadata` Do for a Second-Generation Package?", "url": "https://ktema.org/articles/2gp-unpackaged-metadata/", "published_at": "2022-02-20T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665a1f32c3", "title": "The Dangers of Anonymous Apex and the Developer Console", "url": "https://ktema.org/articles/dangers-anonymous-apex/", "published_at": "2022-02-19T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665a66d999", "title": "The Bridge Package Pattern", "url": "https://ktema.org/articles/bridge-package-pattern/", "published_at": "2022-02-11T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665a7db593", "title": "Design Safe, Fast, Parallel Salesforce Integrations with Rust and Baris", "url": "https://ktema.org/talks/design-safe-fast-parallel-salesforce-integrations-with-rust-baris/", "published_at": "2022-01-20T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665ad020a2", "title": "Create Your Low-Code, Free, Open Source CI Solution", "url": "https://ktema.org/talks/create-your-low-code-free-open-source-ci-solution/", "published_at": "2021-11-13T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665ae9c737", "title": "Salesforce Developer Podcast: CumulusCI with David Reed", "url": "https://ktema.org/talks/cumulusci-with-david-reed-developer-podcast/", "published_at": "2021-10-04T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665b44d840", "title": "Find Bugs Earlier with Second-Generation Packaging", "url": "https://ktema.org/articles/find-bugs-earlier-with-second-generation-packaging/", "published_at": "2021-09-23T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665b6d3da2", "title": "Extend NPSP with 2GP Unlocked Packages", "url": "https://ktema.org/talks/extend-npsp-with-2gp-unlocked-packages/", "published_at": "2021-08-06T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665be7c4c8", "title": "Bibliothekai: \"What's the best translation of...?\"", "url": "https://ktema.org/projects/bibliothekai/", "published_at": "2021-06-13T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665cd0b207", "title": "How Salesforce.org Uses DevOps", "url": "https://ktema.org/articles/learn-how-salesforce-dotorg-uses-devops/", "published_at": "2021-05-21T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665cd1a224", "title": "Building the NPSP Trailhead Installer with MetaDeploy", "url": "https://ktema.org/talks/building-npsp-trailhead-installer-with-metadeploy/", "published_at": "2021-01-15T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665dc9f2d0", "title": "Automate the App Lifecycle with CumulusCI", "url": "https://ktema.org/talks/automate-the-app-lifecycle-cumulusci-moscow/", "published_at": "2021-01-14T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665de5dcd0", "title": "Baris: Safe, Parallel Salesforce Integrations in Rust", "url": "https://ktema.org/projects/baris/", "published_at": "2021-01-01T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665e569cfd", "title": "Do What You Can With What You Have", "url": "https://ktema.org/talks/do-what-you-can-with-what-you-have/", "published_at": "2020-12-01T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665e6224e8", "title": "Automate the App Lifecycle with CumulusCI", "url": "https://ktema.org/talks/automate-the-app-lifecycle-cumulusci-amsterdam/", "published_at": "2020-11-11T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b665f5dd4a2", "title": "Automate the App Lifecycle with CumulusCI", "url": "https://ktema.org/talks/automate-the-app-lifecycle-cumulusci-apexhours/", "published_at": "2020-09-05T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66601c79e4", "title": "Effective Lifecycle Management with Portable Automation and CumulusCI", "url": "https://ktema.org/talks/effective-lifecycle-management-with-portable-automation-cumulusci/", "published_at": "2020-09-02T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6660359fd0", "title": "Automate the App Lifecycle with CumulusCI", "url": "https://ktema.org/talks/automate-the-app-lifecycle-cumulusci-london/", "published_at": "2020-06-24T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6660cddb6f", "title": "Automate the App Lifecycle with CumulusCI", "url": "https://ktema.org/talks/automate-the-app-lifecycle-cumulusci-munich/", "published_at": "2020-05-06T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6660ea3be6", "title": "Handle the Right Errors: Building Resilient and Reliable Apex", "url": "https://ktema.org/talks/handle-the-right-errors-building-resilient-reliable-apex/", "published_at": "2020-05-04T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6661cc438a", "title": "Working with JSON in Apex: A Primer", "url": "https://ktema.org/articles/json-apex-intro/", "published_at": "2020-04-17T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666235f031", "title": "Automate the App Lifecycle with CumulusCI", "url": "https://ktema.org/talks/automate-the-app-lifecycle-with-cumulusci-kitchener/", "published_at": "2020-04-11T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6662c459c0", "title": "Automate the App Lifecycle with CumulusCI", "url": "https://ktema.org/talks/automate-the-app-lifecycle-cumulusci-denver/", "published_at": "2020-03-17T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6662d76d66", "title": "Build Applications with CumulusCI", "url": "https://ktema.org/projects/build-applications-with-cumulusci/", "published_at": "2020-03-11T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66630444f7", "title": "On Writing Good Exception Handlers", "url": "https://ktema.org/articles/on-writing-good-exception-handlers/", "published_at": "2020-02-26T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666381f08c", "title": "On Not Writing Bad Exception Handlers", "url": "https://ktema.org/articles/on-not-writing-bad-exception-handlers/", "published_at": "2020-01-05T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66641cd81b", "title": "Nested Iteration: A Quick Look at Computational Complexity in Apex", "url": "https://ktema.org/articles/quick-look-computational-complexity-apex/", "published_at": "2019-11-04T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6665153765", "title": "Orchestrating the Salesforce Lifecycle with CCI", "url": "https://ktema.org/talks/orchestrating-salesforce-lifecycle-with-cci/", "published_at": "2019-10-19T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666548352d", "title": "Rolling Up Opportunity Contact Roles with Change Data Capture and Async Apex Triggers", "url": "https://ktema.org/articles/roll-up-opportunity-contact-role-change-data-capture/", "published_at": "2019-06-25T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66657061e8", "title": "Real-World Unit Testing: Get to 100% Coverage, the Right Way", "url": "https://ktema.org/talks/real-world-unit-testing/", "published_at": "2019-05-13T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6665bfebdd", "title": "Unit Testing", "url": "https://ktema.org/talks/unit-testing-salesforceway/", "published_at": "2019-04-08T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6666a8e2f7", "title": "Three Routes to Time-Based Rollup Summary Fields", "url": "https://ktema.org/articles/three-routes-to-time-based-rollup-summary-fields/", "published_at": "2019-03-10T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6666db99be", "title": "“Clicks, Not Code” to “Clicks are Code”: Add Git to your #AwesomeAdmin Superpowers", "url": "https://ktema.org/talks/clicks-not-code-to-clicks-are-code/", "published_at": "2019-02-05T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6667110f4b", "title": "Amaxa: A Multi-Object Data Loader for Salesforce", "url": "https://ktema.org/projects/amaxa/", "published_at": "2019-01-31T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66674f7a4f", "title": "Locating Salesforce Compound and Component Fields in Apex and Python", "url": "https://ktema.org/articles/locating-compound-component-fields-apex-python/", "published_at": "2019-01-01T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6667ef5dbf", "title": "Building Unit Test Learning Resources on Salesforce Stack Exchange", "url": "https://ktema.org/articles/unit-test-learning-resources-salesforce-stack-exchange/", "published_at": "2018-12-31T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6668a4600d", "title": "Running Reports as Selected Users with JWT OAuth and the Reports and Dashboards API", "url": "https://ktema.org/articles/schedule-reports-as-user/", "published_at": "2018-11-10T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6669470dcf", "title": "Handling URLs in Lightning Data Tables", "url": "https://ktema.org/articles/lightning-data-table-record-link/", "published_at": "2018-10-22T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6669bd7eaf", "title": "What Can You `GROUP BY`?", "url": "https://ktema.org/articles/soql-group-by-fields/", "published_at": "2018-10-10T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6669c3bbd4", "title": "Continuous Integration with Salesforce DX: Concepts and Connections", "url": "https://ktema.org/talks/continuous-integration-salesforce-dx-concepts-connections/", "published_at": "2018-10-08T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666ab0d2c5", "title": "Templating with `String.format()` and `String.join()` for Better Dynamic SOQL", "url": "https://ktema.org/articles/better-dynamic-soql-string-format/", "published_at": "2018-08-02T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666b91569b", "title": "Testing Chatter in Apex without `seeAllData=true`", "url": "https://ktema.org/articles/testing-chatter-apex-without-seealldata-true/", "published_at": "2018-07-23T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666be62f3e", "title": "Filtering in Lightning's Activity Timeline", "url": "https://ktema.org/articles/filtering-lightnings-activity-timeline/", "published_at": "2018-07-11T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666cc98669", "title": "Everyday Salesforce Patterns: Filtering Parent Objects By Child Objects", "url": "https://ktema.org/articles/filtering-parent-objects-child-objects-soql/", "published_at": "2018-07-05T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666d8835f6", "title": "Continuous Integration with Salesforce DX: Practices and Principles for All", "url": "https://ktema.org/talks/continuous-integration-salesforce-dx-practices-principles/", "published_at": "2018-05-29T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666de8b826", "title": "The Curious Nature of the Salesforce Boolean", "url": "https://ktema.org/articles/curious-boolean-nature/", "published_at": "2018-05-28T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666df28ec5", "title": "DML-ish Operations in the Visualforce Controller Constructor", "url": "https://ktema.org/articles/visualforce-constructor-dml-ish/", "published_at": "2018-05-17T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666e7aafc9", "title": "Integration Testing Off-Platform Code with Salesforce DX and `simple_salesforce`", "url": "https://ktema.org/articles/integration-testing-salesforce-dx-simple-salesforce/", "published_at": "2018-03-27T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666e864247", "title": "Salesforce Lifecycle and Tooling: Testing on Multiple Org Types with Salesforce DX and CircleCI Workflows", "url": "https://ktema.org/articles/circleci-sfdx-multiple-org-shapes/", "published_at": "2018-03-17T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666e982307", "title": "Everyday Salesforce Patterns: Child-Parent SOQL on Task and Event", "url": "https://ktema.org/articles/parent-child-soql-task-event/", "published_at": "2018-03-13T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666ed8bba5", "title": "Deduplicating File Trees with Python", "url": "https://ktema.org/projects/dedupe-trees/", "published_at": "2018-03-05T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b666fbd2c26", "title": "Everyday Salesforce Patterns: The Wrapper Class", "url": "https://ktema.org/articles/everyday-salesforce-patterns-wrapper-class/", "published_at": "2018-02-17T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66703d686f", "title": "Integrating Static Analysis with PMD in the Salesforce Development Lifecycle", "url": "https://ktema.org/articles/static-analysis-pmd-salesforce/", "published_at": "2018-02-08T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6671234d6f", "title": "Salesforce Lifecycle and Tooling: CircleCI and Salesforce DX", "url": "https://ktema.org/articles/salesforce-dx-circleci/", "published_at": "2018-02-02T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6671bec791", "title": "Distinguishing Custom Settings in Apex", "url": "https://ktema.org/articles/distinguishing-custom-settings-apex/", "published_at": "2017-09-10T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b667257ef6f", "title": "Visualforce Traps for Experienced Programmers", "url": "https://ktema.org/articles/visualforce-traps/", "published_at": "2017-06-17T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b667313c404", "title": "Free Events in Click & Pledge", "url": "https://ktema.org/articles/free-events-click-and-pledge/", "published_at": "2017-01-09T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6673aff255", "title": "Bridging Click & Pledge and Salesforce Campaigns with Process and Flow", "url": "https://ktema.org/articles/bridging-click-and-pledge-and-salesforce-campaigns/", "published_at": "2016-12-28T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6673e0435d", "title": "Null Relationships and Short-Circuiting Behavior in Salesforce Formulas, Process Builder, Flow, and Apex", "url": "https://ktema.org/articles/null-relationships-short-circuiting-salesforce/", "published_at": "2016-12-08T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6674514634", "title": "Staying on Top of Salesforce & NPSP Releases", "url": "https://ktema.org/talks/staying-on-top-of-salesforce-npsp-releases/", "published_at": "2016-10-04T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6674a480f6", "title": "Importing Notes in Salesforce", "url": "https://ktema.org/articles/importing-notes-into-salesforce/", "published_at": "2016-08-24T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b6675876f3d", "title": "Private Email Lists using MailChimp and Salesforce", "url": "https://ktema.org/articles/private-email-lists-using-mailchimp-and-salesforce/", "published_at": "2016-08-15T00:00:00+00:00" }, { "id": "01a08797-44bb-717d-976f-0b66762b0d0d", "title": "FileMaker into Salesforce", "url": "https://ktema.org/articles/filemaker-into-salesforce/", "published_at": "2016-07-09T00:00:00+00:00" } ] posts Claim your blog
Back to ktema.org
Blog · corpus.blog/blogs/ktema.org/posts

ktema.org

ktema.org

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016