{"id":1188,"date":"2026-09-02T15:13:39","date_gmt":"2026-09-02T14:13:39","guid":{"rendered":"https:\/\/ruby-doc.org\/learn\/?page_id=1188"},"modified":"2026-09-04T11:47:16","modified_gmt":"2026-09-04T10:47:16","slug":"james-britt","status":"publish","type":"page","link":"https:\/\/ruby-doc.org\/learn\/james-britt\/","title":{"rendered":"James Britt"},"content":{"rendered":"\t<section class=\"rdap-profile\" aria-label=\"Verified author profile for James Britt\">\n\t\t<div class=\"rdap-hero\">\n\t\t\t<img loading=\"lazy\" class=\"rdap-headshot\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/jgb_self-portrait-20140914-256x300.png\" width=\"300\" height=\"352\" alt=\"James Britt, Ruby developer and creator of Ruby-Doc.org\" decoding=\"async\">\n\t\t\t<div>\n\t\t\t\t<p class=\"rdap-kicker\">Verified Ruby-Doc.org author<\/p>\n\t\t\t\t<p class=\"rdap-role\">Ruby developer, writer, and creator of Ruby-Doc.org<\/p>\n\t\t\t\t<p>James Britt created Ruby-Doc.org in 2002 as a central home for Ruby documentation and learning resources. After serving as its long-term maintainer, he now writes practical Ruby tutorials and code examples for Ruby-Doc Learn.<\/p>\n\t\t\t\t<div class=\"rdap-actions\"><a class=\"rdap-button\" href=\"mailto:james-britt@ruby-doc.org\">Contact James<\/a><a class=\"rdap-button rdap-button-secondary\" href=\"https:\/\/jamesbritt.com\/\" rel=\"me noopener\">Personal website<\/a><\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\t\t<div class=\"rdap-section\">\n\t\t\t<h2>About James Britt<\/h2>\n\t\t\t<p>James is an artist, writer, musician, technologist and Ruby developer based in Scottsdale, Arizona. He operates <a href=\"https:\/\/neurogami.com\/\" rel=\"noopener\">Neurogami<\/a>, which he founded in 2001 for software, art and interactive technology projects.<\/p>\n\t\t\t<p>His Ruby work spans documentation, teaching, JRuby desktop development and open-source projects. For Ruby-Doc Learn, his focus is useful, runnable examples that explain not only what a piece of Ruby does, but when a developer would use it.<\/p>\n\t\t\t<ul class=\"rdap-expertise\" aria-label=\"Areas of expertise\"><li>Ruby programming<\/li><li>Ruby documentation<\/li><li>JRuby development<\/li><li>Developer education<\/li><\/ul>\n\t\t<\/div>\n\t\t<div class=\"rdap-section\">\n\t\t\t<h2>Ruby community work<\/h2>\n\t\t\t<p>James's public Ruby record extends beyond maintaining Ruby-Doc.org. Independent sources document his technical writing, conference talks, JRuby open-source work and published Ruby packages.<\/p>\n\t\t\t<div class=\"rdap-evidence-grid\">\n\t\t\t\t<article class=\"rdap-evidence-card\"><h3>Technical writing<\/h3><p><a href=\"https:\/\/www.ruby-lang.org\/en\/news\/2004\/\" rel=\"noopener\">Ruby-lang.org highlighted<\/a> his 2004 <a href=\"https:\/\/www.linuxjournal.com\/article\/7236\" rel=\"noopener\"><cite>Linux Journal<\/cite> article<\/a> on manipulating OpenOffice.org documents with Ruby.<\/p><\/article>\n\t\t\t\t<article class=\"rdap-evidence-card\"><h3>Conference speaking<\/h3><p><a href=\"https:\/\/www.rubyevents.org\/profiles\/james-britt\" rel=\"noopener\">RubyEvents records<\/a> his MountainWest RubyConf talks \u201cBlack-boxing with Ruby\u201d (2007) and \u201cHubris: The Ruby\/Haskell Bridge\u201d (2010).<\/p><\/article>\n\t\t\t\t<article class=\"rdap-evidence-card\"><h3>JRuby and open source<\/h3><p><a href=\"https:\/\/www.infoq.com\/news\/2009\/01\/monkeybars-gui-mvc\/\" rel=\"noopener\">InfoQ interviewed James<\/a> about Monkeybars, a JRuby MVC framework, and the Rawr packaging tool.<\/p><\/article>\n\t\t\t\t<article class=\"rdap-evidence-card\"><h3>Published Ruby packages<\/h3><p>RubyGems lists James as an author of <a href=\"https:\/\/rubygems.org\/gems\/qft\" rel=\"noopener\">qft<\/a> and <a href=\"https:\/\/rubygems.org\/gems\/Neurogami-wiiremotejruby\" rel=\"noopener\">Neurogami-wiiremotejruby<\/a>.<\/p><\/article>\n\t\t\t<\/div>\n\t\t\t<p class=\"rdap-scope-note\">These sources support James's documented work in Ruby publishing, conference speaking and open-source development. They do not identify him as a Ruby core committer.<\/p>\n\t\t<\/div>\n\t\t<div class=\"rdap-section rdap-verification\">\n\t\t\t<h2>Why this profile is verified<\/h2>\n\t\t\t<p>Ruby-Doc.org has verified James's identity and current author role. The site's history and his professional background are independently supported by:<\/p>\n\t\t\t<ul><li><a href=\"https:\/\/rubytalk.org\/t\/ann-www-ruby-doc-org\/2783\" rel=\"noopener\">James Britt's original Ruby-Talk announcement<\/a> of Ruby-Doc.org on 10 November 2002.<\/li><li><a href=\"https:\/\/www.oreilly.com\/pub\/au\/2595\" rel=\"noopener\">O'Reilly's James Britt author biography<\/a>, which records his Ruby community, writing and Ruby-Doc.org work.<\/li><li><a href=\"https:\/\/jamesbritt.com\/about\/\" rel=\"me noopener\">James Britt's official personal profile<\/a> and <a href=\"https:\/\/neurogami.com\/about\/\" rel=\"noopener\">Neurogami profile<\/a>.<\/li><\/ul>\n\t\t\t<p class=\"rdap-verified-note\"><span aria-hidden=\"true\">\u2713<\/span> Identity and role verified by Ruby-Doc.org. Last verified 2 September 2026.<\/p>\n\t\t<\/div>\n\t\t<div class=\"rdap-section\">\n\t\t\t<h2>Articles by James Britt<\/h2>\n\t\t\t\t\t\t\t<div class=\"rdap-articles\">\n\t\t\t\t\t\t\t\t\t\t\t<article class=\"rdap-card\">\n\t\t\t\t\t\t\t<a class=\"rdap-card-image\" href=\"https:\/\/ruby-doc.org\/learn\/a-practical-ruby-on-rails-project-build-a-client-document-portal\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/de80a3b8-65e0-4dbb-b660-d7301787d823-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/de80a3b8-65e0-4dbb-b660-d7301787d823-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/de80a3b8-65e0-4dbb-b660-d7301787d823-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/de80a3b8-65e0-4dbb-b660-d7301787d823-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/de80a3b8-65e0-4dbb-b660-d7301787d823-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/de80a3b8-65e0-4dbb-b660-d7301787d823.png 1672w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-09-24T15:34:49+01:00\">September 24, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/a-practical-ruby-on-rails-project-build-a-client-document-portal\/\">A Practical Ruby on Rails Project: Build a Client Document Portal<\/a><\/h3><p>Every small agency has some version of the same problem: the client says they sent the file, the project manager remembers seeing it, and nobody can find the approved copy. A client document portal makes a useful Ruby on Rails project because the problem is easy to recognise and the first version can be modest. [&hellip;]<\/p><\/div>\n\t\t\t\t\t\t<\/article>\n\t\t\t\t\t\t\t\t\t\t\t<article class=\"rdap-card\">\n\t\t\t\t\t\t\t<a class=\"rdap-card-image\" href=\"https:\/\/ruby-doc.org\/learn\/automating-enterprise-tasks-using-ai-in-ruby\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Automating-Enterprise-Tasks-Using-AI-in-Ruby-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Automating-Enterprise-Tasks-Using-AI-in-Ruby-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Automating-Enterprise-Tasks-Using-AI-in-Ruby-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Automating-Enterprise-Tasks-Using-AI-in-Ruby-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Automating-Enterprise-Tasks-Using-AI-in-Ruby-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Automating-Enterprise-Tasks-Using-AI-in-Ruby.png 1672w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-09-24T13:21:00+01:00\">September 24, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/automating-enterprise-tasks-using-ai-in-ruby\/\">Automating Enterprise Tasks Using AI in Ruby<\/a><\/h3><p>Enterprise applications typically generate large amounts of paperwork. When that paperwork comes as a PDF, someone must open the PDF, find the purchase order number, verify the amount and copy some details into another system. Nearby, a Rails application stores most of the necessary information. That gap is a good place to begin thinking about [&hellip;]<\/p><\/div>\n\t\t\t\t\t\t<\/article>\n\t\t\t\t\t\t\t\t\t\t\t<article class=\"rdap-card\">\n\t\t\t\t\t\t\t<a class=\"rdap-card-image\" href=\"https:\/\/ruby-doc.org\/learn\/building-a-small-job-tracker-in-ruby\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-a-Small-Job-Tracker-in-Ruby-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-a-Small-Job-Tracker-in-Ruby-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-a-Small-Job-Tracker-in-Ruby-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-a-Small-Job-Tracker-in-Ruby-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-a-Small-Job-Tracker-in-Ruby-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-a-Small-Job-Tracker-in-Ruby.png 1672w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-09-24T11:46:06+01:00\">September 24, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/building-a-small-job-tracker-in-ruby\/\">Building a Small Job Tracker in Ruby<\/a><\/h3><p>A job looks simple on a calendar. There is a date, a customer and something that needs doing. Open the email thread behind the job, though, and things become more complicated. For instance, someone wants to move the appointment. A supplier has not responded. The address in the last message differs from the one on [&hellip;]<\/p><\/div>\n\t\t\t\t\t\t<\/article>\n\t\t\t\t\t\t\t\t\t\t\t<article class=\"rdap-card\">\n\t\t\t\t\t\t\t<a class=\"rdap-card-image\" href=\"https:\/\/ruby-doc.org\/learn\/building-an-editors-research-reading-list-with-ruby\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-an-Editors-Research-Reading-List-with-Ruby-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-an-Editors-Research-Reading-List-with-Ruby-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-an-Editors-Research-Reading-List-with-Ruby-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-an-Editors-Research-Reading-List-with-Ruby-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-an-Editors-Research-Reading-List-with-Ruby-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/Building-an-Editors-Research-Reading-List-with-Ruby.png 1672w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-09-24T10:48:08+01:00\">September 24, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/building-an-editors-research-reading-list-with-ruby\/\">Building an Editor\u2019s Research Reading List With Ruby<\/a><\/h3><p>Saving a link takes a moment. Recalling why you saved it can take considerably longer. You see a headline, so you keep the tab open. A few days later, dozens of tabs are in front of you and the detail you needed to verify is gone from memory. You have access to the source. You [&hellip;]<\/p><\/div>\n\t\t\t\t\t\t<\/article>\n\t\t\t\t\t\t\t\t\t\t\t<article class=\"rdap-card\">\n\t\t\t\t\t\t\t<a class=\"rdap-card-image\" href=\"https:\/\/ruby-doc.org\/learn\/building-a-ruby-api-client\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/building-a-ruby-api-client-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/building-a-ruby-api-client-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/building-a-ruby-api-client-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/building-a-ruby-api-client-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/building-a-ruby-api-client-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/building-a-ruby-api-client.png 1672w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-09-24T09:15:30+01:00\">September 24, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/building-a-ruby-api-client\/\">Building a Ruby API Client: REST Requests, Signed Calls and WebSocket Streams<\/a><\/h3><p>A Ruby script that fetches one price is easy enough to leave in a single file. Add account balances, signed requests and a feed that stays open all afternoon, and that file starts getting awkward. The HTTP code needs one sort of error handling. The streaming code needs another. Neither belongs in a Rails controller. [&hellip;]<\/p><\/div>\n\t\t\t\t\t\t<\/article>\n\t\t\t\t\t\t\t\t\t\t\t<article class=\"rdap-card\">\n\t\t\t\t\t\t\t<a class=\"rdap-card-image\" href=\"https:\/\/ruby-doc.org\/learn\/build-a-payment-reconciliation-dashboard-with-ruby-on-rails\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/17bfadda-cffa-491c-a87a-426cbbce4c4e-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/17bfadda-cffa-491c-a87a-426cbbce4c4e-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/17bfadda-cffa-491c-a87a-426cbbce4c4e-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/17bfadda-cffa-491c-a87a-426cbbce4c4e-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/17bfadda-cffa-491c-a87a-426cbbce4c4e-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/17bfadda-cffa-491c-a87a-426cbbce4c4e.png 1672w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-09-23T15:45:42+01:00\">September 23, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/build-a-payment-reconciliation-dashboard-with-ruby-on-rails\/\">Build a Payment Reconciliation Dashboard with Ruby on Rails<\/a><\/h3><p>The order says paid, and the payment provider shows a completed transaction. Yet the bank deposit is smaller than the invoice. Someone has to explain the difference. This gives you a starting point for a Ruby on Rails project: a dashboard that brings together orders, payment records, fees, and settlement reports. Its first version can [&hellip;]<\/p><\/div>\n\t\t\t\t\t\t<\/article>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<nav class=\"rdap-pagination\" aria-label=\"James Britt article pages\"><ul class=\"page-numbers\">\n\t<li><span aria-current=\"page\" class=\"page-numbers current\">1<\/span><\/li>\n\t<li><a class=\"page-numbers\" href=\"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1188\/page\/2\/\">2<\/a><\/li>\n\t<li><a class=\"page-numbers\" href=\"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1188\/page\/3\/\">3<\/a><\/li>\n\t<li><span class=\"page-numbers dots\">&hellip;<\/span><\/li>\n\t<li><a class=\"page-numbers\" href=\"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1188\/page\/7\/\">7<\/a><\/li>\n\t<li><a class=\"next page-numbers\" href=\"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1188\/page\/2\/\">Next &raquo;<\/a><\/li>\n<\/ul>\n<\/nav>\t\t\t\t\t<\/div>\n\t<\/section>\n\t\n","protected":false},"excerpt":{"rendered":"<p>James Britt is a Ruby developer, writer, and the creator and long-term maintainer of Ruby-Doc.org. Read his biography and practical Ruby articles.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1188","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>James Britt - Ruby-Doc Learn<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ruby-doc.org\/learn\/james-britt\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"James Britt - Ruby-Doc Learn\" \/>\n<meta property=\"og:description\" content=\"James Britt is a Ruby developer, writer, and the creator and long-term maintainer of Ruby-Doc.org. Read his biography and practical Ruby articles.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ruby-doc.org\/learn\/james-britt\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruby-Doc Learn\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-04T10:47:16+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/\",\"name\":\"James Britt - Ruby-Doc Learn\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#website\"},\"datePublished\":\"2026-09-02T14:13:39+00:00\",\"dateModified\":\"2026-09-04T10:47:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/james-britt\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"James Britt\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#website\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"name\":\"Ruby-Doc Learn\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#organization\",\"name\":\"Ruby-Doc Learn\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-doc-logo-transparent.png\",\"contentUrl\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ruby-doc-logo-transparent.png\",\"width\":1650,\"height\":305,\"caption\":\"Ruby-Doc Learn\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/learn\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"James Britt - Ruby-Doc Learn","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ruby-doc.org\/learn\/james-britt\/","og_locale":"en_US","og_type":"article","og_title":"James Britt - Ruby-Doc Learn","og_description":"James Britt is a Ruby developer, writer, and the creator and long-term maintainer of Ruby-Doc.org. Read his biography and practical Ruby articles.","og_url":"https:\/\/ruby-doc.org\/learn\/james-britt\/","og_site_name":"Ruby-Doc Learn","article_modified_time":"2026-09-04T10:47:16+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ruby-doc.org\/learn\/james-britt\/","url":"https:\/\/ruby-doc.org\/learn\/james-britt\/","name":"James Britt - Ruby-Doc Learn","isPartOf":{"@id":"https:\/\/ruby-doc.org\/learn\/#website"},"datePublished":"2026-09-02T14:13:39+00:00","dateModified":"2026-09-04T10:47:16+00:00","breadcrumb":{"@id":"https:\/\/ruby-doc.org\/learn\/james-britt\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ruby-doc.org\/learn\/james-britt\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ruby-doc.org\/learn\/james-britt\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ruby-doc.org\/learn\/"},{"@type":"ListItem","position":2,"name":"James Britt"}]},{"@type":"WebSite","@id":"https:\/\/ruby-doc.org\/learn\/#website","url":"https:\/\/ruby-doc.org\/learn\/","name":"Ruby-Doc Learn","description":"","publisher":{"@id":"https:\/\/ruby-doc.org\/learn\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ruby-doc.org\/learn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ruby-doc.org\/learn\/#organization","name":"Ruby-Doc Learn","url":"https:\/\/ruby-doc.org\/learn\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ruby-doc.org\/learn\/#\/schema\/logo\/image\/","url":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-doc-logo-transparent.png","contentUrl":"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/09\/ruby-doc-logo-transparent.png","width":1650,"height":305,"caption":"Ruby-Doc Learn"},"image":{"@id":"https:\/\/ruby-doc.org\/learn\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/comments?post=1188"}],"version-history":[{"count":1,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1188\/revisions"}],"predecessor-version":[{"id":1189,"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/pages\/1188\/revisions\/1189"}],"wp:attachment":[{"href":"https:\/\/ruby-doc.org\/learn\/wp-json\/wp\/v2\/media?parent=1188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}