{"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\/ruby-ractor-port\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"920\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-ractor-port-768x920.webp\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"Ruby Ractor port diagram showing who sends, receives and closes the reply mailbox\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-ractor-port-768x920.webp 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-ractor-port-250x300.webp 250w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-ractor-port-855x1024.webp 855w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-ractor-port.webp 860w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-11-04T14:08:27+00:00\">November 4, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/ruby-ractor-port\/\">Ruby Ractor Port: Who Can Send, Receive and Close?<\/a><\/h3><p>Trace a parcel quote from worker to coordinator in Ruby 4.0. A worked example shows which messages survive closing a Ractor port and when a receive raises an error.<\/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\/upgrade-ruby-3-4-to-4-0\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"576\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/upgrade-ruby-3-4-to-4-0-checklist-768x576.webp\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"Checklist to upgrade Ruby 3.4 to 4.0: record the baseline, build separately, verify the application and release with a return path\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/upgrade-ruby-3-4-to-4-0-checklist-768x576.webp 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/upgrade-ruby-3-4-to-4-0-checklist-300x225.webp 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/upgrade-ruby-3-4-to-4-0-checklist-1024x768.webp 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/upgrade-ruby-3-4-to-4-0-checklist-1536x1152.webp 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/upgrade-ruby-3-4-to-4-0-checklist.webp 1600w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-11-02T14:01:59+00:00\">November 2, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/upgrade-ruby-3-4-to-4-0\/\">Upgrade Ruby 3.4 to 4.0: A Practical Migration Checklist<\/a><\/h3><p>Move an existing Ruby application from 3.4 to 4.0 with focused dependency checks, tested examples, a staging plan and a clear return path.<\/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\/ruby-4-0-new-features\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"600\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-4-0-new-features-map-768x600.webp\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"Ruby 4.0 new features map covering array and string helpers, core Set, experimental Ruby Box and ZJIT, and Ractor ports\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-4-0-new-features-map-768x600.webp 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-4-0-new-features-map-300x234.webp 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-4-0-new-features-map-1024x800.webp 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-4-0-new-features-map-1536x1200.webp 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/11\/ruby-4-0-new-features-map.webp 1600w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-11-02T11:18:49+00:00\">November 2, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/ruby-4-0-new-features\/\">Ruby 4.0 New Features: What Changed and What to Try<\/a><\/h3><p>A practical tour of Ruby 4.0&#039;s collection helpers, core classes and experimental runtime features, with small tested examples and checks for existing projects.<\/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\/ruby-programming-ebooks\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"512\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/ruby-programming-ebooks-infographic-768x512.webp\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"Ruby programming ebooks infographic: match your level, check editions, compare formats and practise with examples.\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/ruby-programming-ebooks-infographic-768x512.webp 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/ruby-programming-ebooks-infographic-300x200.webp 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/ruby-programming-ebooks-infographic-1024x683.webp 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/ruby-programming-ebooks-infographic.webp 1536w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a>\t\t\t\t\t\t\t<div class=\"rdap-card-body\"><time datetime=\"2026-10-30T13:48:06+00:00\">October 30, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/ruby-programming-ebooks\/\">Ruby Programming Ebooks: Free and Paid Reading Paths<\/a><\/h3><p>Choose Ruby ebooks by experience level, edition and format, with free reading options, a practical exercise and an expandable reading guide.<\/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\/hiring-in-romania-choose-the-ruby-work-model-before-comparing-costs\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/hiring-romania-ruby-work-model-2818122-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"Illustration of a laptop with code, a ruby gemstone, a checklist and a Romanian flag overlooking city rooftops.\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/hiring-romania-ruby-work-model-2818122-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/hiring-romania-ruby-work-model-2818122-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/hiring-romania-ruby-work-model-2818122-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/hiring-romania-ruby-work-model-2818122-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/hiring-romania-ruby-work-model-2818122.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-10-16T07:59:29+01:00\">October 16, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/hiring-in-romania-choose-the-ruby-work-model-before-comparing-costs\/\">Hiring in Romania: Choose the Ruby Work Model Before Comparing Costs<\/a><\/h3><p>Define the Ruby developer&#039;s working model before comparing costs in Romania, with practical checks for scope, code rights, budgets and contractor providers.<\/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\/legacy-rails-modernization-ui-design-agencies\/\" aria-hidden=\"true\" tabindex=\"-1\"><img decoding=\"async\" width=\"768\" height=\"432\" src=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/legacy-ruby-on-rails-ui-modernization-768x432.png\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"Ruby-themed illustration of developers updating a legacy application&#039;s forms and dashboards\" loading=\"lazy\" srcset=\"https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/legacy-ruby-on-rails-ui-modernization-768x432.png 768w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/legacy-ruby-on-rails-ui-modernization-300x169.png 300w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/legacy-ruby-on-rails-ui-modernization-1024x576.png 1024w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/legacy-ruby-on-rails-ui-modernization-1536x864.png 1536w, https:\/\/ruby-doc.org\/learn\/wp-content\/uploads\/2026\/10\/legacy-ruby-on-rails-ui-modernization.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-10-09T09:04:09+01:00\">October 9, 2026<\/time><h3><a href=\"https:\/\/ruby-doc.org\/learn\/legacy-rails-modernization-ui-design-agencies\/\">UI Design Agencies for Modernizing Legacy Ruby on Rails Apps<\/a><\/h3><p>Eight UI design agencies to consider for an established Ruby on Rails application, with practical questions about Ruby experience, workflow preservation, testing, and implementation.<\/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\/10\/\">10<\/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.8 - 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}]}}