{"id":277,"date":"2026-01-21T07:47:38","date_gmt":"2026-01-21T06:47:38","guid":{"rendered":"https:\/\/www.genexio.net\/blog\/?p=277"},"modified":"2026-01-21T07:47:38","modified_gmt":"2026-01-21T06:47:38","slug":"this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api","status":"publish","type":"post","link":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/","title":{"rendered":"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API."},"content":{"rendered":"\n<p>The goal is simple: learn English using real content, with as little friction as possible.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1) What changed since the first version<\/h4>\n\n\n\n<p>The core idea is the same: import real English content into FileMaker, extract vocabulary, and generate learning material automatically. The recent upgrades are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>New content portals: <strong>VOA<\/strong> and <strong>Spotlight English<\/strong><\/li>\n\n\n\n<li>A new \u201cactive reading\u201d workflow: highlight an unknown word, and the system does the rest<\/li>\n\n\n\n<li>Automatic archive check + immediate AI processing (meaning + translation) when a new item is found<\/li>\n\n\n\n<li>Support for <strong>phrases<\/strong> (phrasal verbs, idioms, fixed expressions), not only single words<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2) Why I added VOA and Spotlight English<\/h4>\n\n\n\n<p>My opinion: real progress comes from <strong>real input<\/strong>, not only textbook sentences. VOA and Spotlight are useful because they are clear, structured, and often easier to follow than random internet articles. They also give variety in style and topics, while still being friendly for intermediate learners.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3) High-level architecture<\/h4>\n\n\n\n<p>The app has three main layers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ingestion layer (Node-RED \/ Python):<\/strong> fetch pages, parse content, normalize data<\/li>\n\n\n\n<li><strong>Data layer (FileMaker):<\/strong> store articles, words, phrases, exercises, review status<\/li>\n\n\n\n<li><strong>AI layer (ChatGPT API):<\/strong> generate meaning, translation, examples, and structured feedback<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">4) Importing and normalizing content<\/h4>\n\n\n\n<p>Different portals have different HTML structures. The key is to normalize everything into one internal JSON format before it goes into FileMaker.<\/p>\n\n\n\n<p><strong>Example: normalized JSON payload (same shape for every portal)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"source\": \"spotlight\",\n  \"category\": \"work-and-business\",\n  \"title\": \"Example article title\",\n  \"published_at\": \"2026-01-19\",\n  \"url\": \"https:\/\/example.com\/article\",\n  \"content_text\": \"Full cleaned article text ...\",\n  \"audio_url\": \"https:\/\/example.com\/audio.mp3\"\n}<\/code><\/pre>\n\n\n\n<p>Once the record is created in FileMaker, the app can run the same extraction logic regardless of the source.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5) Active reading: highlight an unknown item (word or phrase)<\/h4>\n\n\n\n<p>This is the most practical upgrade. While reading an article inside FileMaker, if I see a word or an expression I do not know, I highlight it (or select it) and run a script. From that moment the system handles everything automatically.<\/p>\n\n\n\n<p><strong>Typical flow:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>User selects text in the article (a single word or a multi-word phrase)<\/li>\n\n\n\n<li>A FileMaker script cleans and normalizes it (trim, remove punctuation at the edges, lowercase where useful)<\/li>\n\n\n\n<li>The script decides if it is a <strong>word<\/strong> or a <strong>phrase<\/strong> (simple rule: contains spaces = phrase)<\/li>\n\n\n\n<li>The script checks if it already exists in the archive<\/li>\n\n\n\n<li>If not found, it creates the record and triggers AI enrichment immediately<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">6) Word check: avoid duplicates and reuse the archive<\/h4>\n\n\n\n<p>The archive is important because I do not want to process the same word twice. The script first searches the \u201cwords\u201d table. If the word exists, the app reuses the stored meaning\/translation and connects it to the current article or exercise. If it does not exist, the app creates a new record and starts AI extraction.<\/p>\n\n\n\n<p><strong>Example: FileMaker pseudo-script (simplified)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># INPUT: selected_text_raw\n\nSet Variable &#91; $raw ; selected_text_raw ]\nSet Variable &#91; $t ; Lower ( Trim ( $raw ) ) ]\n# (In practice: remove punctuation more robustly)\n\nIf &#91; PatternCount ( $t ; \" \" ) &gt; 0 ]\n  Perform Script &#91; \u201cArchive_Phrase\u201d ; Parameter: $t ]\n  Exit Script\nEnd If\n\n# Word path\nGo to Layout &#91; \u201cwords\u201d ]\nEnter Find Mode &#91; Pause: Off ]\nSet Field &#91; words::word ; $t ]\nPerform Find &#91; ]\n\nIf &#91; Get ( FoundCount ) &gt; 0 ]\n  Set Variable &#91; $wordId ; words::id ]\nElse\n  New Record\/Request\n  Set Field &#91; words::word ; $t ]\n  Commit Records\/Requests\n  Set Variable &#91; $wordId ; words::id ]\n  Perform Script &#91; \u201cAI_Enrich_Word\u201d ; Parameter: $wordId ]\nEnd If<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">7) Phrase integration: phrasal verbs, idioms, and fixed expressions<\/h4>\n\n\n\n<p>Single words are useful, but many real problems in English come from <strong>phrases<\/strong>, for example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Phrasal verbs:<\/strong> \u201cset up\u201d, \u201ccarry out\u201d, \u201crun into\u201d<\/li>\n\n\n\n<li><strong>Idioms:<\/strong> \u201con the same page\u201d, \u201craise the bar\u201d<\/li>\n\n\n\n<li><strong>Fixed expressions:<\/strong> \u201cas soon as possible\u201d, \u201cin the long run\u201d<\/li>\n<\/ul>\n\n\n\n<p>So I added a parallel archive for phrases. The logic is similar to words, but the data stored is a bit different: the app focuses on meaning in context, typical usage, and one or two strong example sentences.<\/p>\n\n\n\n<p><strong>Example: phrase archive pseudo-script (simplified)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># INPUT: phrase_text (already cleaned)\n\nGo to Layout &#91; \u201cphrases\u201d ]\nEnter Find Mode &#91; Pause: Off ]\nSet Field &#91; phrases::phrase ; phrase_text ]\nPerform Find &#91; ]\n\nIf &#91; Get ( FoundCount ) &gt; 0 ]\n  Set Variable &#91; $phraseId ; phrases::id ]\nElse\n  New Record\/Request\n  Set Field &#91; phrases::phrase ; phrase_text ]\n  Commit Records\/Requests\n  Set Variable &#91; $phraseId ; phrases::id ]\n\n  # Trigger AI enrichment now\n  Perform Script &#91; \u201cAI_Enrich_Phrase\u201d ; Parameter: $phraseId ]\nEnd If<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">8) Automatic AI processing: meaning + translation (structured JSON)<\/h4>\n\n\n\n<p>When a new word or phrase is created, the app immediately calls the AI and requests a strict JSON response. I keep the output structured so it is easy to store in FileMaker fields and to reuse in exercises.<\/p>\n\n\n\n<p><strong>Example: prompt for a word (short and technical)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>You are a language assistant.\nReturn ONLY valid JSON.\n\nType: \"word\"\nItem: \"{{item}}\"\nContext sentence: \"{{sentence}}\"\n\nRequired JSON fields:\n- item\n- part_of_speech\n- meaning_simple_en\n- translation_it\n- example_1\n- example_2<\/code><\/pre>\n\n\n\n<p><strong>Example: prompt for a phrase (phrasal verb \/ idiom)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>You are a language assistant.\nReturn ONLY valid JSON.\n\nType: \"phrase\"\nItem: \"{{item}}\"\nContext sentence: \"{{sentence}}\"\n\nRequired JSON fields:\n- item\n- phrase_type (phrasal_verb | idiom | expression | collocation | other)\n- meaning_simple_en\n- translation_it\n- usage_note (very short)\n- example_1\n- example_2<\/code><\/pre>\n\n\n\n<p><strong>Example: AI response for a phrase (JSON)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"item\": \"carry out\",\n  \"phrase_type\": \"phrasal_verb\",\n  \"meaning_simple_en\": \"to do a task or perform a plan\",\n  \"translation_it\": \"svolgere \/ eseguire\",\n  \"usage_note\": \"Common in formal and technical contexts.\",\n  \"example_1\": \"We carried out a test on the new component.\",\n  \"example_2\": \"The team will carry out the installation next week.\"\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">9) Immediate learning activation<\/h4>\n\n\n\n<p>The important part is not only saving the item. The word or phrase becomes usable immediately:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>it appears in my personal vocabulary\/phrase list<\/li>\n\n\n\n<li>it can be used in exercise generators (sentences, questions, listening tasks)<\/li>\n\n\n\n<li>it can be scheduled for review (spaced repetition \/ next review date)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">10) My opinion: this is why it works<\/h4>\n\n\n\n<p>I believe this approach works because it removes the \u201cfriction gap\u201d between reading and learning. If I must open a dictionary, copy\/paste, translate manually, and then create flashcards, I will do it less. Here, the system turns one click into a complete learning action.<\/p>\n\n\n\n<p>And phrases are a big part of that: understanding English faster often means understanding <strong>chunks<\/strong>, not only individual words.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">11) Next steps<\/h4>\n\n\n\n<p>Possible future improvements:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>more portals (only if they can be normalized cleanly)<\/li>\n\n\n\n<li>better context extraction (sentence-level + paragraph-level)<\/li>\n\n\n\n<li>smarter review logic based on my real errors, not only time<\/li>\n\n\n\n<li>phrase-aware exercises (e.g., choose the right preposition\/particle, rebuild the phrase from audio)<\/li>\n<\/ul>\n\n\n\n<p>If you want to build something similar, the key idea is not one specific tool. The key is a consistent data model, a clean pipeline, and automation that keeps learning \u201clight\u201d and repeatable.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The goal is simple: learn English using real content, with as little friction as possible. 1) What changed since the first version The core idea [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,5,15,16],"tags":[],"class_list":["post-277","post","type-post","status-publish","format-standard","hentry","category-ai","category-filemaker","category-node-red","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API. - My blog<\/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:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API. - My blog\" \/>\n<meta property=\"og:description\" content=\"The goal is simple: learn English using real content, with as little friction as possible. 1) What changed since the first version The core idea [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/\" \/>\n<meta property=\"og:site_name\" content=\"My blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-21T06:47:38+00:00\" \/>\n<meta name=\"author\" content=\"genexio\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"genexio\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/\"},\"author\":{\"name\":\"genexio\",\"@id\":\"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a\"},\"headline\":\"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API.\",\"datePublished\":\"2026-01-21T06:47:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/\"},\"wordCount\":804,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a\"},\"articleSection\":[\"AI\",\"filemaker\",\"node-red\",\"python\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/\",\"url\":\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/\",\"name\":\"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API. - My blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.genexio.net\/blog\/#website\"},\"datePublished\":\"2026-01-21T06:47:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.genexio.net\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.genexio.net\/blog\/#website\",\"url\":\"https:\/\/www.genexio.net\/blog\/\",\"name\":\"My blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.genexio.net\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a\",\"name\":\"genexio\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g\",\"caption\":\"genexio\"},\"logo\":{\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g\"},\"sameAs\":[\"http:\/\/www.genexio.net\/blog\"],\"url\":\"https:\/\/www.genexio.net\/blog\/author\/genexio\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API. - My blog","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:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/","og_locale":"en_GB","og_type":"article","og_title":"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API. - My blog","og_description":"The goal is simple: learn English using real content, with as little friction as possible. 1) What changed since the first version The core idea [&hellip;]","og_url":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/","og_site_name":"My blog","article_published_time":"2026-01-21T06:47:38+00:00","author":"genexio","twitter_card":"summary_large_image","twitter_misc":{"Written by":"genexio","Estimated reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#article","isPartOf":{"@id":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/"},"author":{"name":"genexio","@id":"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a"},"headline":"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API.","datePublished":"2026-01-21T06:47:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/"},"wordCount":804,"commentCount":0,"publisher":{"@id":"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a"},"articleSection":["AI","filemaker","node-red","python"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/","url":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/","name":"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API. - My blog","isPartOf":{"@id":"https:\/\/www.genexio.net\/blog\/#website"},"datePublished":"2026-01-21T06:47:38+00:00","breadcrumb":{"@id":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.genexio.net\/blog\/2026\/01\/21\/this-post-describes-the-latest-upgrades-to-my-custom-english-learning-app-built-with-filemaker-node-red-and-the-chatgpt-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.genexio.net\/blog\/"},{"@type":"ListItem","position":2,"name":"This post describes the latest upgrades to my custom English-learning app built with FileMaker, Node-RED, and the ChatGPT API."}]},{"@type":"WebSite","@id":"https:\/\/www.genexio.net\/blog\/#website","url":"https:\/\/www.genexio.net\/blog\/","name":"My blog","description":"","publisher":{"@id":"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.genexio.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/www.genexio.net\/blog\/#\/schema\/person\/e293425f2302a3a32a049864bf8cd02a","name":"genexio","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g","caption":"genexio"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/7eda1948b0cb52048b0ce1e60c0e9be821f2ad85632d822bd60187a9793428a6?s=96&d=mm&r=g"},"sameAs":["http:\/\/www.genexio.net\/blog"],"url":"https:\/\/www.genexio.net\/blog\/author\/genexio\/"}]}},"_links":{"self":[{"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/posts\/277","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/comments?post=277"}],"version-history":[{"count":1,"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/posts\/277\/revisions"}],"predecessor-version":[{"id":278,"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/posts\/277\/revisions\/278"}],"wp:attachment":[{"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/media?parent=277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/categories?post=277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.genexio.net\/blog\/wp-json\/wp\/v2\/tags?post=277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}