41554 blogs · [ { "id": "01a08c77-e022-72c1-bad0-8163da53b8b8", "title": "You can ask your coding agent for a selector to compare UI options", "url": "https://bhserna.com/you-can-ask-your-coding-agent-for-a-selector-to-compare-ui-options", "published_at": "2026-06-25T12:00:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163db1b2855", "title": "Make a method a recurring task with solid queue", "url": "https://bhserna.com/make-a-method-a-recurring-task-with-solid-queue", "published_at": "2026-06-23T12:00:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163db880941", "title": "MdRecord: File-backed models for Rails", "url": "https://bhserna.com/md-record-file-backed-models-for-rails", "published_at": "2025-12-29T12:00:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163db97eb48", "title": "Fixing a bug in my lateral joins queries with rails", "url": "https://bhserna.com/fixing-a-bug-in-my-lateral-joins-queries-with-rails", "published_at": "2025-01-21T12:00:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163dc2dd1a7", "title": "Simple Searchable module for searching with Rails and SQLite's LIKE", "url": "https://bhserna.com/simple-searchable-module-for-searching-with-rails-and-sqlite-like", "published_at": "2024-02-09T23:33:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163dd7fcc48", "title": "Copy shoes.rb and use stacks and flows to build layouts", "url": "https://bhserna.com/copy-shoes-rb-and-use-stacks-and-flows-to-build-layouts", "published_at": "2024-01-24T00:07:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163dd973c10", "title": "Fix n+1 queries by caching computed values", "url": "https://bhserna.com/fix-n+1-queries-by-caching-computed-values", "published_at": "2023-07-19T23:19:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163de6bd61a", "title": "Truncate in the middle with truncate rails helper", "url": "https://bhserna.com/truncate-in-the-middle-with-truncate-rails-helper", "published_at": "2023-06-19T23:08:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163df2841ff", "title": "A form with two buttons with formation and formmethod", "url": "https://bhserna.com/a-form-with-two-buttons-with-formation-and-formmethod", "published_at": "2023-06-08T12:17:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e0241800", "title": "What to do when you need a button_to within a form in Rails", "url": "https://bhserna.com/what-to-do-when-you-need-a-button_to-within-a-form-in-rails", "published_at": "2023-06-05T12:12:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e03527cc", "title": "Simple image manager with active storage", "url": "https://bhserna.com/simple-image-manager-with-active-storage", "published_at": "2023-05-22T23:25:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e11135ec", "title": "Add many attachments without deleting previous ones using ActiveStorage", "url": "https://bhserna.com/add-many-attachments-without-deleting-previous-ones-using-activestorage", "published_at": "2023-05-16T12:09:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e16eb775", "title": "Use after_touch to avoid to handle race conditions saving computed values", "url": "https://bhserna.com/use-after_touch-to-avoid-to-handle-race-conditions-saving-computed-values", "published_at": "2023-03-02T23:16:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e1bf3d1f", "title": "Use with_lock to handle race conditions saving computed values", "url": "https://bhserna.com/use-with_lock-to-handle-race-conditions-saving-computed-values", "published_at": "2023-03-01T00:00:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e1d21519", "title": "Pick a safe previous date to avoid race conditions saving computed values", "url": "https://bhserna.com/pick-a-safe-previous-date-to-avoid-race-conditions-saving-computed-values", "published_at": "2023-02-14T00:39:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e2b5823a", "title": "Touch + fragment caching to avoid race conditions saving computed values", "url": "https://bhserna.com/touch-fragment-caching-to-avoid-race-conditions-saving-computed-values", "published_at": "2023-01-31T23:16:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e2e21332", "title": "Will it save the wrong value?", "url": "https://bhserna.com/will-it-save-the-wrong-value", "published_at": "2023-01-03T23:18:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e316f864", "title": "Saving incorrect computed values thanks to race conditions", "url": "https://bhserna.com/saving-incorrect-computed-values-thanks-to-race-conditions", "published_at": "2022-12-22T23:31:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e3a1b7ff", "title": "Examples to explore possible race conditions when caching custom computed values in Rails", "url": "https://bhserna.com/custom-computed-values-and-race-conditions-examples-rails", "published_at": "2022-12-07T23:42:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e3db7ab6", "title": "Broadcast multiple actions with broadcast_render", "url": "https://bhserna.com/broadcast-multiple-actions-with-broadcast_render", "published_at": "2022-09-19T22:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e48d641c", "title": "Building a dynamic data grid with search and filters using rails, hotwire and ransack", "url": "https://bhserna.com/building-data-grid-with-search-rails-hotwire-ransack", "published_at": "2022-09-03T12:24:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e54dba7e", "title": "Fetching the top n per group with window functions", "url": "https://bhserna.com/fetching-the-top-n-per-group-with-window-functions", "published_at": "2022-08-22T22:34:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e5580174", "title": "Fetching the top n per group with a lateral join with rails", "url": "https://bhserna.com/fetching-the-top-n-per-group-with-a-lateral-join-with-rails", "published_at": "2022-08-16T22:29:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e5af1cd3", "title": "Active Record Playground Runner Introduction", "url": "https://bhserna.com/active-record-playground-runner-introduction", "published_at": "2022-08-08T22:53:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e659c73f", "title": "Mistakes we make with counts in rails", "url": "https://bhserna.com/mistakes-we-make-with-counts-in-rails", "published_at": "2022-06-06T22:51:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e67138f1", "title": "A tool and examples to help you implement the first or last per record in rails with one query", "url": "https://bhserna.com/tool-to-implement-first-or-last-per-record-rails", "published_at": "2022-05-31T11:58:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e7206ad2", "title": "Solve n+1 queries and slow counts with counter caches", "url": "https://bhserna.com/solve-nplus1-queries-and-slow-counts-with-counter-caches", "published_at": "2022-05-19T11:45:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e73c3f6c", "title": "4 things you can try before using a counter cache in rails", "url": "https://bhserna.com/what-can-you-try-before-using-a-counter-cache-in-rails", "published_at": "2022-05-16T22:18:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e810a00b", "title": "When do you need a counter cache in rails?", "url": "https://bhserna.com/when-do-you-need-a-counter-cache", "published_at": "2022-05-09T22:12:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e829e0ad", "title": "Use dom_id helper on capybara with rspec and rails", "url": "https://bhserna.com/rails-dom_id-helper-capybara-rspec", "published_at": "2022-05-02T22:14:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e8bd8d27", "title": "How to preload counts in a list with ActiveRecord", "url": "https://bhserna.com/preload-counts-active-record", "published_at": "2022-04-25T22:19:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e9370737", "title": "Difference between count, length and size in an association with ActiveRecord", "url": "https://bhserna.com/count-size-length-active-record", "published_at": "2022-04-18T22:11:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163e975e3aa", "title": "Active record playground, for rails developers that want an easy way to practice with active record in isolation", "url": "https://bhserna.com/active-record-playground", "published_at": "2022-03-29T12:21:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163ea07d123", "title": "Specific preloading with scoped associations", "url": "https://bhserna.com/specific-preloading-with-scoped-associations", "published_at": "2022-03-16T12:44:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163eabbf499", "title": "How to use react with hotwire?", "url": "https://bhserna.com/use-react-with-hotwire", "published_at": "2022-02-28T23:14:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163eb9688cf", "title": "Should you split your rails app into backend and frontend?", "url": "https://bhserna.com/should-you-split-your-rails-app-into-backend-and-frontend", "published_at": "2022-02-14T23:23:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163ec76319e", "title": "How the turbo_frame_tag helper transforms an object to an html id?", "url": "https://bhserna.com/turbo_frame_tag-and-dom_id", "published_at": "2022-02-08T23:24:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163ed6a9ba7", "title": "Styler and tachyons examples", "url": "https://bhserna.com/styler-tachyons-examples", "published_at": "2022-01-28T23:30:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163edd8e369", "title": "Inline CRUD with rails and hotwire", "url": "https://bhserna.com/inline-crud-hotwire", "published_at": "2022-01-11T00:08:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163ede450f7", "title": "Remote modals with rails, hotwire and bootstrap", "url": "https://bhserna.com/remote-modals-with-rails-hotwire-and-bootstrap", "published_at": "2022-01-04T13:08:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163efaecf01", "title": "Dynamic filters with rails and hotwire", "url": "https://bhserna.com/dynamic-filters-with-rails-and-hotwire", "published_at": "2021-12-14T00:40:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f0a75b40", "title": "Styler, a tool to compose css classes with ruby", "url": "https://bhserna.com/styler-a-tool-to-compose-css-classes-with-ruby", "published_at": "2021-12-07T12:36:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f0e6d342", "title": "Capybara cheatsheet as pdf", "url": "https://bhserna.com/capybara-cheatsheet-as-pdf", "published_at": "2021-11-29T13:27:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f0f881d7", "title": "Preloading associations cheatsheet", "url": "https://bhserna.com/preloading-associations-cheatsheet", "published_at": "2021-11-19T12:32:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f1c19757", "title": "How to detect n+1 queries by watching the logs", "url": "https://bhserna.com/detect-n-plus-one-queries-by-watching-the-logs", "published_at": "2021-11-16T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f218dc9d", "title": "How can I determine if my n+1 queries fix can hurt the performance?", "url": "https://bhserna.com/determine-if-my-n-plus-one-queries-can-hurt-performance", "published_at": "2021-11-02T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f26dbbc9", "title": "Joins does not preload", "url": "https://bhserna.com/joins-does-not-preload", "published_at": "2021-10-24T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f35f90b7", "title": "Example app to understand why some times fixing some n+1 queries can hurt performance", "url": "https://bhserna.com/fixing-n-plus-one-queries-can-hurt-performance-example-app", "published_at": "2021-10-12T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f3d42ac4", "title": "Why some people say that fixing some n+1 queries could hurt performance?", "url": "https://bhserna.com/fixing-n-plus-1-queries-can-hurt-performance", "published_at": "2021-10-08T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f492665f", "title": "Preload object on the guide for preloading associations", "url": "https://bhserna.com/add-preload-object-to-guide-for-preloading-associations-in-rails", "published_at": "2021-09-13T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f52e85ef", "title": "Using an objet to represent a complex preload", "url": "https://bhserna.com/preload-object", "published_at": "2021-08-23T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f5950fbc", "title": "A guide for preloading associations in rails", "url": "https://bhserna.com/guide-for-preloading-associations-in-rails", "published_at": "2021-08-09T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f5de2bc4", "title": "What is an n+1 queries problem?", "url": "https://bhserna.com/what-is-an-n-plus-1-queries-problem", "published_at": "2021-07-27T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f690c3d6", "title": "Tool to run the examples for the 5 ways to fetch the latest-n-of-each record", "url": "https://bhserna.com/tool-to-run-the-latest-n-of-each-record-examples", "published_at": "2021-07-22T12:56:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f758243f", "title": "How to test that an email was sent on a unit/micro test", "url": "https://bhserna.com/how-to-test-that-an-specific-mail-was-sent-in-rails", "published_at": "2021-07-12T00:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f76cbf54", "title": "How to test that an email was sent on a system spec", "url": "https://bhserna.com/test-that-an-email-was-sent-feature-spec", "published_at": "2021-07-02T00:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f84e11dc", "title": "Guide to name scopes based on column types", "url": "https://bhserna.com/guide-to-name-scopes-based-on-column-types", "published_at": "2021-06-29T00:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f91d0fc6", "title": "List of alternatives to heroku", "url": "https://bhserna.com/list-of-alternatives-to-heroku", "published_at": "2021-06-22T00:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163f990370f", "title": "Guide to justify the heroku's price to your boss or clients", "url": "https://bhserna.com/guide-to-justify-heroku-price", "published_at": "2021-06-14T00:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163fa0a3ae1", "title": "List of questions to check if heroku is really expensive for your project", "url": "https://bhserna.com/list-to-check-if-heroku-is-expensive-for-your-project", "published_at": "2021-06-08T00:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163fad15f4a", "title": "Extracting domain knowledge from a query method", "url": "https://bhserna.com/extracting-domain-knowledge-from-a-query-method", "published_at": "2021-05-27T00:28:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662abee2fc", "title": "Building a DateTime range to query for the records created a \"week before\"", "url": "https://bhserna.com/query-date-ranges-rails-active-record", "published_at": "2021-05-06T00:28:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662ae39942", "title": "How to read the noCertificado from a CSD for a mexican CFDI", "url": "https://bhserna.com/csd-nocertificado-ruby", "published_at": "2021-05-05T00:28:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662b7b65a0", "title": "How to test a PDF download with capybara", "url": "https://bhserna.com/test-pdf-download-capybara", "published_at": "2021-05-03T00:28:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662c2d0cea", "title": "A simple way of testing a CSV download with capybara", "url": "https://bhserna.com/test-csv-download-capybara", "published_at": "2021-04-20T00:28:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662cb0c63a", "title": "A \"read-more\" behavior truncating with rails truncate helper and Stimulus.js", "url": "https://bhserna.com/read-more-rails-truncate-stimulus", "published_at": "2021-04-19T00:28:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163dcca4866", "title": "A \"read-more\" behavior truncating by number of lines with css line-clamp and Stimulus.js", "url": "https://bhserna.com/read-more-line-clamp-stimulus", "published_at": "2021-04-03T00:28:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662ceafee8", "title": "A \"read-more\" behavior truncating by number of lines with custom javascript and Stimulus.js", "url": "https://bhserna.com/truncating-multiple-line-text-read-more", "published_at": "2021-04-02T00:28:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662d22530c", "title": "Capybara cheatsheet", "url": "https://bhserna.com/capybara-cheatsheet", "published_at": "2021-03-24T01:53:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662d80862d", "title": "Custom capybara matchers with compound expectations", "url": "https://bhserna.com/custom-capybara-matchers-with-compound-expectations", "published_at": "2021-03-17T13:12:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163dd9c7667", "title": "Tools to help you detect n+1 queries", "url": "https://bhserna.com/tools-to-help-you-detect-n-1-queries", "published_at": "2021-03-01T12:57:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662e5e29e4", "title": "Quiz to practice the difference between preload, includes or eager_load", "url": "https://bhserna.com/quiz-to-practice-the-difference-between-preload-includes-or-eager_load", "published_at": "2021-02-22T13:05:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662ebc50e8", "title": "Which specs would you prefer for this presentation object?", "url": "https://bhserna.com/which-specs-would-you-prefer-for-this-presentation-object", "published_at": "2021-02-17T16:36:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662ecf1252", "title": "Code to run the examples for preload, includes or eager_load", "url": "https://bhserna.com/preload-includes-eager-load-examples-code", "published_at": "2021-02-16T00:18:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662f13b574", "title": "Examples to learn the difference between preload, includes or eager_load", "url": "https://bhserna.com/examples-to-learn-the-difference-between-preload-includes-eager-load", "published_at": "2021-02-04T00:18:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5662fa99c2a", "title": "How to attach an active storage file to an email", "url": "https://bhserna.com/how-to-attach-an-active-storage-file-to-an-email", "published_at": "2021-01-27T13:00:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e56630423ebf", "title": "When is better to use preload or eager_load vs includes?", "url": "https://bhserna.com/when-is-better-to-use-preload-or-eager-load-vs-includes", "published_at": "2021-01-19T00:09:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e566313a62c0", "title": "What is the difference between includes, preload, eager_load and joins in ActiveRecord?", "url": "https://bhserna.com/includes-preload-eager-load-joins-in-rails", "published_at": "2021-01-07T22:22:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e56631b56bef", "title": "5 ways to fetch the latest-N-of-each record on Rails", "url": "https://bhserna.com/5-ways-to-fetch-the-latest-n-of-each-record-on-rails", "published_at": "2020-12-23T22:22:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e566325fa078", "title": "10 Examples to learn when your ActiveRecord query will be executed", "url": "https://bhserna.com/10-examples-to-learn-when-your-activerecord-query-will-be-executed", "published_at": "2020-12-08T23:29:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5663264cfb8", "title": "Why Active Record seems to ignore your \"includes\" and runs a query for each record?", "url": "https://bhserna.com/why-active-record-seems-to-ignore-your-includes-and-runs-a-query-for-each-record", "published_at": "2020-11-20T13:26:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5663360c9ca", "title": "PDF with the benchmarks for the fixes to the latest-comment n+1 problem", "url": "https://bhserna.com/pdf-with-the-benchmarks-for-the-fixes-to-the-latest-comment-n-1-problem", "published_at": "2020-11-19T22:19:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e56633ea01d5", "title": "Tool to run the benchmark for fixes for the latest-comment n+1 queries problem", "url": "https://bhserna.com/tool-to-run-the-benchmark-for-fixes-for-the-latest-comment-n-1-queries-problem", "published_at": "2020-11-14T12:57:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e56634e112b7", "title": "Cheatsheet to help you decide which fix for the last-comment n+1 problem is the best for you", "url": "https://bhserna.com/cheatsheet-to-help-you-decide-which-fix-for-the-last-comment-n-1-problem-is-the-best-for-you", "published_at": "2020-11-13T02:38:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e56635063410", "title": "Tool to run the fixes for the latest-comment n+1 queries problem", "url": "https://bhserna.com/tool-to-run-the-fixes-for-the-latest-comment-n-1-queries-problem", "published_at": "2020-11-10T12:56:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5663567bbf4", "title": "Benchmarks for the fixes to the latest-comment n+1 problem", "url": "https://bhserna.com/benchmarks-for-the-fixes-to-the-latest-comment-n-1-problem", "published_at": "2020-11-02T14:19:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e56635821b9a", "title": "5 ways to fix the latest-comment n+1 problem", "url": "https://bhserna.com/5-ways-to-fix-the-latest-comment-n-1-problem", "published_at": "2020-10-20T22:32:00+00:00" }, { "id": "01a08c77-e022-72c1-bad0-8163eeafdd8d", "title": "Using a form object to create more than one record", "url": "https://bhserna.com/you-can-create-a-model-for-that-multi-record-form", "published_at": "2020-10-14T22:54:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e566360bd936", "title": "Create a new controller for the hidden abstraction and reduce conditionals", "url": "https://bhserna.com/create-a-new-controller-for-the-hidden-abstraction-and-reduce-conditionals", "published_at": "2020-10-06T22:51:00+00:00" }, { "id": "01a08c77-e023-72b8-be0f-e5663694be62", "title": "Association with default order, to fix the latest-comment n+1 problem", "url": "https://bhserna.com/association-with-default-order-to-fix-the-latest-comment-n-1-problem", "published_at": "2020-09-30T12:19:00+00:00" } ] posts Claim your blog
Back to bhserna.com
Blog · corpus.blog/blogs/bhserna.com/posts

bhserna.com

bhserna.com

2026

2025

2024

2023

2022

2021

2020