<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Uriel Papa</title><description>Knowledge shared by Uriel Papa, a technical founder from Metro Manila: AI and LLMs, automation, technology and business, SEO, GEO and AEO, tech stacks, marketing and the founder&apos;s journey.</description><link>https://urielpapa.com/</link><language>en</language><item><title>This Site Ships No JavaScript by Default</title><link>https://urielpapa.com/notes/this-site-ships-no-javascript-by-default</link><guid isPermaLink="true">https://urielpapa.com/notes/this-site-ships-no-javascript-by-default</guid><description>How urielpapa.com is built with Astro static pages, small islands of JavaScript only where needed, Tailwind CSS and Keystatic as a git-based CMS.</description><pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most pages on this site send no JavaScript to your browser at all. They are plain HTML and CSS, built ahead of time.&lt;/p&gt;
&lt;p&gt;I built urielpapa.com with Astro, a framework made for content sites. Astro renders every page to static HTML at build time, so a post is ready to read the moment it arrives. Nothing has to download, run and then draw the page.&lt;/p&gt;
&lt;p&gt;JavaScript only shows up where a feature needs it, as small “islands” on an otherwise static page:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Theme toggle&lt;/strong&gt;, to switch between light and dark.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt;, powered by Pagefind on the search page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code copy buttons&lt;/strong&gt; on code blocks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Form enhancement&lt;/strong&gt;, so forms can give inline feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Styling comes from Tailwind CSS, compiled at build time into plain CSS, so there is no styling library running in the browser either.&lt;/p&gt;
&lt;p&gt;Posts, notes, projects and topic pages are Markdown and MDX files in the site’s git repository. I edit them through Keystatic, a git-based CMS, so every change is a file in the repository with its own history. There is no database to run or back up.&lt;/p&gt;
&lt;p&gt;The build also checks each post before it goes live. A title over 70 characters, a missing meta description or a post without a topic hub fails the build instead of shipping.&lt;/p&gt;
&lt;p&gt;The result is a site that is light to load, easy to cache and simple to keep running.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/notes/this-site-ships-no-javascript-by-default&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Tech Stacks</category></item><item><title>Philippine SME Business Expo: What I Learned About Tech Adoption</title><link>https://urielpapa.com/events/philippine-sme-business-expo-technology-adoption</link><guid isPermaLink="true">https://urielpapa.com/events/philippine-sme-business-expo-technology-adoption</guid><description>Notes from the Philippine SME Business Expo, which I attended in November 2025 and May 2026, on how small businesses in the Philippines adopt technology.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;The Philippine SME Business Expo is a business event for small and medium enterprises in the Philippines, and I attended it in November 2025 and May 2026.&lt;/li&gt;&lt;li&gt;Small businesses adopt a new tool when it fixes one clear, daily problem, such as getting paid, getting a loan or getting seen.&lt;/li&gt;&lt;li&gt;AI reaches most small businesses through tools they already use, such as design apps and payment platforms, not through new AI products.&lt;/li&gt;&lt;li&gt;Owners trust technology more when someone explains it in person, in plain words, with their own numbers.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The Philippine SME Business Expo showed me that small businesses in the Philippines adopt technology one problem at a time: payments first, then marketing, then the back office. The tools that win are the ones that fit into what an owner already does every day, explained by someone they trust.&lt;/p&gt;
&lt;p&gt;I attended the Philippine SME Business Expo in November 2025 and again in May 2026. This note is part of my &lt;a href=&quot;/topics/tech-and-business&quot;&gt;Technology and Business&lt;/a&gt; writing.&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-philippine-sme-business-expo&quot;&gt;What is the Philippine SME Business Expo?&lt;/h2&gt;
&lt;p&gt;The Philippine SME Business Expo, also called PHILSME, is a business expo, conference and networking event for small and medium enterprises, start-ups and entrepreneurs in the Philippines, organized by Mediacom Solutions Inc., as &lt;a href=&quot;https://gmanetwork.com/news/money/companies/927888/15th-philsme-business-expo/story&quot;&gt;GMA News reported&lt;/a&gt;. It runs more than once a year in Metro Manila, mostly at the SMX Convention Center Manila in Pasay City, and visitors attend for free.&lt;/p&gt;
&lt;p&gt;Each edition brings together about 180 exhibitors offering business solutions such as fintech, logistics and business loans, alongside keynote talks from industry speakers, and the &lt;a href=&quot;https://philsme.com&quot;&gt;official PHILSME site&lt;/a&gt; expects more than 12,000 attendees. The two editions I attended were the 17th, held on November 28 to 29, 2025 at the World Trade Center Metro Manila, as &lt;a href=&quot;https://www.bworldonline.com/spotlight/2025/12/05/716580/exhibitors-report-high-quality-engagement-as-smes-seek-solutions-at-the-17th-philsme-entrepreneur-and-franchise-edition/&quot;&gt;BusinessWorld reported&lt;/a&gt; after the event, and the 18th, held on May 22 to 23, 2026 at the SMX Convention Center Manila, according to the &lt;a href=&quot;https://www.eoimanila.gov.in/forthcoming-business-events-trade-fairss&quot;&gt;Embassy of India in Manila’s trade fair calendar&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;who-spoke-at-the-two-editions&quot;&gt;Who spoke at the two editions?&lt;/h2&gt;
&lt;p&gt;The speakers below are the ones named in news coverage of each edition. I link to their official sites or profiles where I could confirm them, so you can follow their work, not because each one said the lessons that follow; those are my own takeaways from the floor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;17th edition, November 28 to 29, 2025, World Trade Center Metro Manila&lt;/strong&gt;, from &lt;a href=&quot;https://www.bworldonline.com/spotlight/2025/12/05/716580/exhibitors-report-high-quality-engagement-as-smes-seek-solutions-at-the-17th-philsme-entrepreneur-and-franchise-edition/&quot;&gt;BusinessWorld&lt;/a&gt; and &lt;a href=&quot;https://asianjournal.com/entertainment/events/inspiring-voices-and-quality-engagement-shine-at-the-17th-philsme-entrepreneur-and-franchise-edition/&quot;&gt;Asian Journal&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/trixie-esguerra-abrenilla-12205449/&quot;&gt;&lt;strong&gt;Trixie Esguerra-Abrenilla&lt;/strong&gt;&lt;/a&gt;, CEO and Managing Director of PHILSME, who led the event.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grace Baluyan&lt;/strong&gt;, Assistant Secretary at the &lt;a href=&quot;https://www.dti.gov.ph/&quot;&gt;Department of Trade and Industry&lt;/a&gt;, who gave the keynote and noted that “over 99% of registered enterprises” in the country are micro, small or medium enterprises.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Norman Cloyd B. Sebastian&lt;/strong&gt; of Toyota Motor Philippines, on mobility and scaling operations for SMEs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joseph Jerome Francia&lt;/strong&gt; of GMA International, who led a panel on helping overseas Filipino workers start businesses.&lt;/li&gt;
&lt;li&gt;Business mentors &lt;a href=&quot;https://franciskong.com/&quot;&gt;&lt;strong&gt;Francis Kong&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/deanpaxlapidph&quot;&gt;&lt;strong&gt;Dean Pax Lapid&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://jonathanyabut.com/&quot;&gt;&lt;strong&gt;Jonathan Yabut&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.mommynegosyo.com/home&quot;&gt;&lt;strong&gt;Myrna “Mommy Negosyo” Natividad&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://bossrdr.com/&quot;&gt;&lt;strong&gt;Reymond “Boss RDR” Delos Reyes&lt;/strong&gt;&lt;/a&gt;, &lt;strong&gt;Kimberly “Kimilu” Lu&lt;/strong&gt; and &lt;strong&gt;Kween Yasmin&lt;/strong&gt;, who led learning sessions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;18th edition, May 22 to 23, 2026, SMX Convention Center Manila&lt;/strong&gt;, from &lt;a href=&quot;https://www.gmanetwork.com/regionaltv/community/114227/philsme-opens-18th-expo-launches-first-business-magazine/story/&quot;&gt;GMA Regional TV&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blesila Lantayona&lt;/strong&gt;, Undersecretary at the Department of Trade and Industry, who gave the keynote on the role of MSMEs in national development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;David Celdran&lt;/strong&gt;, broadcaster, who hosted the opening.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Angie Quadra-Balibay&lt;/strong&gt;, PHILSME Media Director, who launched the first PHILSME Business Magazine.&lt;/li&gt;
&lt;li&gt;A media panel on financing, digital payments, marketing visibility and AI-powered creative tools with &lt;strong&gt;Mike Tabaday&lt;/strong&gt; (Skyro), &lt;strong&gt;Paul Albano&lt;/strong&gt; (GCash for Business), &lt;strong&gt;Curtis Ko&lt;/strong&gt; (Adobe) and &lt;strong&gt;Ronnel Jovita&lt;/strong&gt; (Esquire Financing).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dr. Bernardo “Aido” Sepeda&lt;/strong&gt;, Regional Director at the &lt;a href=&quot;https://www.dost.gov.ph/&quot;&gt;Department of Science and Technology&lt;/a&gt;, on science, technology and innovation opportunities for MSMEs.&lt;/li&gt;
&lt;li&gt;Featured speakers &lt;a href=&quot;https://bosanchez.ph&quot;&gt;&lt;strong&gt;Bo Sanchez&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.acegapuz.com/&quot;&gt;&lt;strong&gt;Ace Gapuz&lt;/strong&gt;&lt;/a&gt; (Blogapalooza), &lt;a href=&quot;https://bossrdr.com/&quot;&gt;&lt;strong&gt;Reymond “Boss RDR” Delos Reyes&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/edservantes/&quot;&gt;&lt;strong&gt;Ed Cervantes&lt;/strong&gt;&lt;/a&gt; (EC TAXPH), &lt;strong&gt;Boni De Jesus&lt;/strong&gt; (Design-Ed Learning Solutions), &lt;strong&gt;John Pagulayan&lt;/strong&gt; (Write Send Convert), &lt;a href=&quot;https://id.linkedin.com/in/jojoapolo-suresuccessglobal&quot;&gt;&lt;strong&gt;Jojo Apolo&lt;/strong&gt;&lt;/a&gt; (SureSuccess Global) and &lt;strong&gt;Atty. Kristina “Tina” De Guzman&lt;/strong&gt; (&lt;a href=&quot;https://www.pinaygirlboss.com/meet-the-team/&quot;&gt;Pinay Girl Boss&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lesson-1-small-businesses-adopt-tools-that-fix-one-clear-problem&quot;&gt;Lesson 1: Small businesses adopt tools that fix one clear problem&lt;/h2&gt;
&lt;p&gt;Small businesses at the expo did not ask for “digital transformation.” They asked how to get paid faster, how to get a loan and how to get more customers. The booths with the longest lines were the ones that answered one of those questions in a sentence, like payment platforms and lenders, and the 2026 media panel with GCash for Business, Skyro and Esquire Financing was built around exactly those needs.&lt;/p&gt;
&lt;p&gt;My takeaway as a builder is simple: if I can’t say which single problem a tool fixes, an owner won’t adopt it. One clear win earns the right to offer the next feature.&lt;/p&gt;
&lt;h2 id=&quot;lesson-2-ai-arrives-through-tools-owners-already-use&quot;&gt;Lesson 2: AI arrives through tools owners already use&lt;/h2&gt;
&lt;p&gt;Most owners I talked to were already using AI without calling it that: a design app that writes captions, a photo tool that removes backgrounds, a chatbot inside their messaging app. Canva was a sponsor of the 17th edition, and in 2026 the media panel included Adobe on AI-powered creative tools, which says a lot about where AI meets small businesses today.&lt;/p&gt;
&lt;p&gt;This changed how I think about AI products. For most small businesses, the best AI feature is one hidden inside a tool they already open every day, not a new app they have to learn.&lt;/p&gt;
&lt;h2 id=&quot;lesson-3-trust-comes-from-a-person-explaining-it-in-plain-words&quot;&gt;Lesson 3: Trust comes from a person explaining it in plain words&lt;/h2&gt;
&lt;p&gt;The talks that filled the seats were not about technology at all. They were about money, taxes, leadership and family, told by people the audience already followed. When technology came up, owners listened most when a speaker or exhibitor explained it with a real example and real numbers from a business like theirs.&lt;/p&gt;
&lt;p&gt;For me, this is why sharing what I learn matters. A tool is easier to trust when someone shows how it worked for them, mistakes included.&lt;/p&gt;
&lt;h2 id=&quot;what-was-different-between-november-2025-and-may-2026&quot;&gt;What was different between November 2025 and May 2026?&lt;/h2&gt;
&lt;p&gt;The November 2025 edition was a franchise and entrepreneur edition, so the floor felt like a marketplace of business ideas and franchise brands. The May 2026 edition at SMX felt more focused on tools: financing, payments, marketing and AI-powered creative apps came up again and again. In just six months, AI went from a side topic to something exhibitors put on their banners.&lt;/p&gt;
&lt;h2 id=&quot;what-did-i-change-afterward&quot;&gt;What did I change afterward?&lt;/h2&gt;
&lt;p&gt;After the expo, I started explaining my own work differently. I lead with the one problem a system solves before I talk about the stack, and I test ideas on the smallest useful version first. I also started writing here in plain words, because the expo reminded me that most owners decide on trust, not on technical detail.&lt;/p&gt;
&lt;aside class=&quot;not-prose border-foreground my-8 border-s-[3px] py-1 ps-5&quot;&gt;&lt;p class=&quot;label-caps mb-2&quot;&gt;From the build&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-2&quot;&gt;&lt;p&gt;Lesson 1 matched what I saw building the VITE SEO Digital Advertising ERP. Its 144 data models only made sense to the team once each module fixed one daily problem, such as payroll with SSS, PhilHealth and Pag-IBIG rules, or client follow-ups in the CRM.&lt;/p&gt;&lt;/div&gt;&lt;p class=&quot;mt-2 text-sm&quot;&gt;&lt;a href=&quot;/projects/vite-seo-erp&quot; data-event=&quot;fromthebuild_click&quot; data-event-project=&quot;vite-seo-erp&quot;&gt;See the project: VITE SEO Digital Advertising ERP →&lt;/a&gt;&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;who-would-enjoy-this-event&quot;&gt;Who would enjoy this event?&lt;/h2&gt;
&lt;p&gt;I would recommend the Philippine SME Business Expo to first-time founders, small business owners looking for suppliers or financing, and students who want to see how real businesses think. Entry for visitors is free, so the only cost is your time. I would go again, and next time I would plan my route around the talks and the payment and software booths.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/events/philippine-sme-business-expo-technology-adoption&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Technology and Business</category></item><item><title>Astro 7 Is Out: What It Means for Business Content Sites</title><link>https://urielpapa.com/news/astro-7-content-sites</link><guid isPermaLink="true">https://urielpapa.com/news/astro-7-content-sites</guid><description>Astro 7 is out. What changed for content sites like blogs and docs, why it matters for speed and search, and what I noticed building this site on Astro 7.</description><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Astro 7 is the latest major version of Astro, a web framework built for content-driven sites such as blogs, docs and marketing pages.&lt;/li&gt;&lt;li&gt;Astro 7 moves to Vite 8 and a .astro compiler rewritten in Rust, and the Astro team reports builds 15 to 61 percent faster in its benchmarks.&lt;/li&gt;&lt;li&gt;Astro 7 changes the defaults for Markdown and HTML: a new Rust-based Markdown processor called Sätteri, and a stricter compiler that reports invalid HTML instead of quietly fixing it.&lt;/li&gt;&lt;li&gt;This site, urielpapa.com, is built on Astro 7, so these notes come from a working build.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Astro 7, the latest major version of the Astro web framework, is out. For content sites such as blogs, docs and personal sites, the main question is what it changes in speed, authoring and upkeep, and whether existing sites should upgrade now.&lt;/p&gt;
&lt;p&gt;This site is built on Astro 7, so this take comes from a working build. It is part of my &lt;a href=&quot;/topics/tech-stacks&quot;&gt;Tech Stacks&lt;/a&gt; writing.&lt;/p&gt;
&lt;h2 id=&quot;what-happened&quot;&gt;What happened?&lt;/h2&gt;
&lt;p&gt;The Astro team released Astro 7.0 on June 22, 2026, and announced it in the post &lt;a href=&quot;https://astro.build/blog/astro-7/&quot;&gt;Astro 7.0&lt;/a&gt; on the official Astro blog.&lt;/p&gt;
&lt;h2 id=&quot;what-changed-in-plain-words&quot;&gt;What changed, in plain words?&lt;/h2&gt;
&lt;p&gt;Astro 7 is mostly a speed and tooling release. These are the main changes from the &lt;a href=&quot;https://astro.build/blog/astro-7/&quot;&gt;official announcement&lt;/a&gt; and the &lt;a href=&quot;https://docs.astro.build/en/guides/upgrade-to/v7/&quot;&gt;Astro 7 upgrade guide&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster builds.&lt;/strong&gt; Astro 7 runs on Vite 8, which uses the Rolldown bundler, and the &lt;code&gt;.astro&lt;/code&gt; compiler is rewritten in Rust. The Astro team reports builds 15 to 61 percent faster in its own benchmarks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A new default Markdown processor.&lt;/strong&gt; Markdown and MDX now go through Sätteri, a Rust-based processor. Sites that rely on remark or rehype plugins can keep the older unified pipeline through &lt;code&gt;@astrojs/markdown-remark&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caching and routing become stable.&lt;/strong&gt; Route caching is stable, with experimental cache providers for Netlify, Vercel and Cloudflare. A new &lt;code&gt;src/fetch.ts&lt;/code&gt; entry point gives control over the request pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Breaking changes.&lt;/strong&gt; The new compiler reports unclosed tags and invalid HTML nesting as errors instead of fixing them silently. Whitespace between inline elements now collapses by default, so a space you rely on may need an explicit &lt;code&gt;{&amp;quot; &amp;quot;}&lt;/code&gt;. Astro DB (&lt;code&gt;@astrojs/db&lt;/code&gt;) is removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;why-does-it-matter-for-content-sites&quot;&gt;Why does it matter for content sites?&lt;/h2&gt;
&lt;p&gt;Astro’s core idea is that most pages on a content site do not need JavaScript in the browser. Pages are built as static HTML, and interactive parts are added as small islands only where they are needed. That keeps pages light, which helps both readers on slow connections and search engines.&lt;/p&gt;
&lt;p&gt;Astro 7 keeps that model and makes it cheaper to run. Faster builds matter most for content sites, because every new post or edit triggers a rebuild, so a site with hundreds of pages spends less time waiting on each deploy. Stable route caching helps pages that are rendered on demand, such as a search page or a form handler, without turning a static site into a server app. The stricter compiler is the one change that can cost time on an upgrade, because old templates with sloppy HTML now fail the build until they are fixed.&lt;/p&gt;
&lt;p&gt;For a business, the practical questions are build time, hosting cost and how much upkeep a site needs between major versions. In my view, Astro 7 helps with the first two and asks for some care with the third. On this site, the Astro step of a production build takes about 16 seconds for around 30 pages, so build time is not something I think about. A mostly static site also stays cheap to host, because static pages are served from a CDN and only a few routes run on demand. Upkeep is where I plan ahead: each major version brings breaking changes, so I upgrade on a branch soon after a release instead of skipping versions and doing it all at once later.&lt;/p&gt;
&lt;h2 id=&quot;what-did-i-notice-building-this-site-on-astro-7&quot;&gt;What did I notice building this site on Astro 7?&lt;/h2&gt;
&lt;p&gt;This site uses Astro 7 with static pages, content collections for posts, notes, projects and topic hubs, Tailwind CSS for styling and Keystatic as a git-based CMS. Most pages ship no JavaScript, with small islands for the theme toggle, search, code copy buttons and form enhancement.&lt;/p&gt;
&lt;p&gt;One concrete example of the Markdown change: this site uses a rehype plugin for callout boxes, so it opts back into the unified pipeline through &lt;code&gt;@astrojs/markdown-remark&lt;/code&gt;, exactly as the upgrade guide describes.&lt;/p&gt;
&lt;p&gt;What worked well was the daily editing loop. Running &lt;code&gt;astro dev --background&lt;/code&gt; kept the site running while I wrote and edited posts in Keystatic, and the production build stayed fast the whole time.&lt;/p&gt;
&lt;p&gt;Two things confused me, and both were dev server issues, not production ones. Once, the Keystatic editor loaded as a blank page. The cause was a stale Vite dependency cache in &lt;code&gt;node_modules/.vite&lt;/code&gt;, and clearing it fixed the problem. Another time, after I changed a config file, the dev server restarted on its own but stopped picking up post edits until I fully stopped and started it again.&lt;/p&gt;
&lt;h2 id=&quot;should-you-do-anything-now&quot;&gt;Should you do anything now?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Starting a new content site:&lt;/strong&gt; I would start on Astro 7. It is built for this kind of site, builds are fast, and you skip an upgrade later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running an older Astro version:&lt;/strong&gt; read the official &lt;a href=&quot;https://docs.astro.build/en/guides/upgrade-to/v7/&quot;&gt;Astro 7 upgrade guide&lt;/a&gt; before upgrading, run &lt;code&gt;npx @astrojs/upgrade&lt;/code&gt; (or &lt;code&gt;pnpm dlx @astrojs/upgrade&lt;/code&gt;), and test the build on a branch first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On another framework:&lt;/strong&gt; Astro 7 is worth a look if your site is mostly content, such as a blog, docs or marketing pages, and you want pages that ship little or no JavaScript. For an app with logins, dashboards and lots of data, like the ERP I built with Laravel and Next.js, I would stay with an app framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are comparing frameworks for something more data-heavy than a content site, my post on &lt;a href=&quot;/blog/laravel-vs-nextjs&quot;&gt;Laravel vs Next.js&lt;/a&gt; covers that side.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/news/astro-7-content-sites&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Tech Stacks</category></item><item><title>How Closing My Agency Changed Me as a Founder</title><link>https://urielpapa.com/blog/closing-my-agency</link><guid isPermaLink="true">https://urielpapa.com/blog/closing-my-agency</guid><description>I founded VITE SEO Digital Advertising at 21 while still in college and led it to a team of up to 22. This is what closing it changed for me as a founder.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;I founded VITE SEO Digital Advertising at 21, while still an undergraduate, after two years of freelance work for the same international marketing clients.&lt;/li&gt;&lt;li&gt;VITE SEO Digital Advertising grew to a team of up to 22 across sales, development, project management, marketing and SEO before it closed.&lt;/li&gt;&lt;li&gt;As an entrepreneur, I now make fewer commitments and only say yes to what I can carry well.&lt;/li&gt;&lt;li&gt;As a technical founder, I learned that building is only half the work, so I now choose what to build by the problem it solves.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Closing VITE SEO Digital Advertising taught me that a business is a set of promises, and that I should make fewer of them and keep them better. As a technical founder, it taught me to build for one clear problem before I build anything else.&lt;/p&gt;
&lt;p&gt;This story is part of my writing on &lt;a href=&quot;/topics/founder-journey&quot;&gt;The Founder’s Journey&lt;/a&gt;. I am telling it honestly and from my own side. I will not name clients or team members, and I am still learning from it as I write.&lt;/p&gt;
&lt;h2 id=&quot;how-did-the-agency-start&quot;&gt;How did the agency start?&lt;/h2&gt;
&lt;p&gt;I founded VITE SEO Digital Advertising at 21, while still an undergraduate at the Technological University of the Philippines, after two years of freelance work for the same international marketing clients. Before that, I had worked as a WordPress developer, a team leader and a project manager for those clients.&lt;/p&gt;
&lt;p&gt;I turned freelance work into a company because the work had grown bigger than one person. Clients kept coming back, and I was already leading a small team for them. A company felt like the honest next step. I hoped it would become a place where young Filipino developers and marketers could do good work for clients around the world, and where we could build our own products too.&lt;/p&gt;
&lt;h2 id=&quot;what-did-we-build-together&quot;&gt;What did we build together?&lt;/h2&gt;
&lt;p&gt;The agency grew to a team of up to 22 across sales, development, project management, marketing and SEO. As founder and CEO, I directed in-house product development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An internal ERP that put HR, CRM, project management and accounting behind one login.&lt;/li&gt;
&lt;li&gt;An NFC business card product, the “Tap into Possibilities” card.&lt;/li&gt;
&lt;li&gt;A client quotation portal.&lt;/li&gt;
&lt;li&gt;5 WordPress SEO plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also built the sales process (a four-tier service package line, a consultation playbook, a client fit-check form, proposals and quotations), and wrote the SOPs, job descriptions and employment contracts the team worked from.&lt;/p&gt;
&lt;aside class=&quot;not-prose border-foreground my-8 border-s-[3px] py-1 ps-5&quot;&gt;&lt;p class=&quot;label-caps mb-2&quot;&gt;From the build&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-2&quot;&gt;&lt;p&gt;With the in-house team, I led and co-developed an ERP with 115 pages, 144 data models and 5,241 automated tests in under 3 months.&lt;/p&gt;&lt;/div&gt;&lt;p class=&quot;mt-2 text-sm&quot;&gt;&lt;a href=&quot;/projects/vite-seo-erp&quot; data-event=&quot;fromthebuild_click&quot; data-event-project=&quot;vite-seo-erp&quot;&gt;See the project: VITE SEO Digital Advertising ERP →&lt;/a&gt;&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;I was proudest of the team and the systems we built for ourselves. Most days started with client calls and sales messages, then moved to task check-ins, code reviews and planning. Many nights went to building. It was busy and tiring, but I was learning something new almost every day.&lt;/p&gt;
&lt;h2 id=&quot;what-was-it-like-leading-a-team-while-still-in-college&quot;&gt;What was it like leading a team while still in college?&lt;/h2&gt;
&lt;p&gt;Leading a team while still in college meant living on two schedules at once. I went to classes and did school projects, then ran the business around them, often late at night. Some of my team were my age and some were older than me. I learned that respect comes from being clear and fair, not from a title. I also learned to write things down. Clear SOPs, clear tasks and honest feedback helped the team more than anything I said in a meeting.&lt;/p&gt;
&lt;h2 id=&quot;why-did-the-agency-close&quot;&gt;Why did the agency close?&lt;/h2&gt;
&lt;p&gt;I closed the agency because I wanted to focus on building products instead of running client services. Client work kept us busy, but it left little room for the products I cared about most. Finishing my degree also mattered to me, and doing both well was hard. It was not one dramatic moment. It was a slow and honest look at where my time was going and where I wanted it to go. Closing was not easy, and I still believe it was the right call.&lt;/p&gt;
&lt;h2 id=&quot;what-changed-for-me-as-an-entrepreneur&quot;&gt;What changed for me as an entrepreneur?&lt;/h2&gt;
&lt;p&gt;As an entrepreneur, I now see every commitment as something I have to carry, not just something I can win. I take risks more slowly. I want to know what a decision will cost me in time and energy, not only in money. I am more careful about which clients and projects I say yes to, and I would rather do fewer things well. I also pay closer attention to simple numbers, like what comes in and what goes out each month.&lt;/p&gt;
&lt;h2 id=&quot;what-changed-for-me-as-a-technical-founder&quot;&gt;What changed for me as a technical founder?&lt;/h2&gt;
&lt;p&gt;As a technical founder, I learned that building something is not the same as selling it. We could build a full ERP in under 3 months, but code alone did not make the business stronger. Now I choose what to build by asking who needs it and what problem it solves first. Many of the problems I faced were about people, process or focus, and no new tool could fix them. Technology works best when it serves a clear need.&lt;/p&gt;
&lt;h2 id=&quot;what-would-i-tell-someone-starting-a-business-in-college&quot;&gt;What would I tell someone starting a business in college?&lt;/h2&gt;
&lt;p&gt;I would tell them to start small, protect their studies and be clear about why they are doing it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start smaller than you think.&lt;/strong&gt; Prove the work with a few clients before you hire a team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protect your studies.&lt;/strong&gt; School ends, and a good finish opens doors you will want later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write things down early.&lt;/strong&gt; Your processes, your prices and your promises should not live only in your head.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Know your reason.&lt;/strong&gt; When you know why you started, you also know when it is time to change course.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-am-i-doing-now&quot;&gt;What am I doing now?&lt;/h2&gt;
&lt;p&gt;I graduated cum laude with a BS in Information Systems from the Technological University of the Philippines in August 2026, and I am now writing here about technology, automation and what I learn along the way.&lt;/p&gt;
&lt;p&gt;What comes next for me is building my own products as a technical founder. I am rebuilding everything and sharing the journey here, from the code I write to the lessons I am still learning. If you are on a similar path, I hope it helps.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/blog/closing-my-agency&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>The Founder&apos;s Journey</category></item><item><title>Organic Content vs Paid Ads: What I Learned Doing Both</title><link>https://urielpapa.com/blog/organic-content-vs-paid-ads</link><guid isPermaLink="true">https://urielpapa.com/blog/organic-content-vs-paid-ads</guid><description>Organic content builds reach slowly and keeps working, while paid ads buy reach right away. How they differ in cost, speed and effort, and when to use each.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Organic content is marketing you do not pay for per view, such as posts, articles, videos and search traffic, and it usually takes time to build.&lt;/li&gt;&lt;li&gt;Paid ads, such as Meta Ads on Facebook and Instagram, buy reach right away and stop when the budget stops.&lt;/li&gt;&lt;li&gt;Paid ads give faster feedback on which message works, which can then guide organic content.&lt;/li&gt;&lt;li&gt;A small Meta Ads budget of about US$8 a day brought 33 inbound lead conversations in the first 5 days for VITE SEO Digital Advertising.&lt;/li&gt;&lt;li&gt;My main lesson is that ads told us quickly what people wanted, while organic content helped them trust us once they found us.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Organic content brings people to you without paying for each view, but it takes time to build; paid ads put you in front of people right away, but only for as long as you pay. Most businesses end up using both, because each covers the other’s weak spot.&lt;/p&gt;
&lt;p&gt;I ran both at VITE SEO Digital Advertising, the agency I founded and have since closed, and this post compares them from that experience. It is part of my &lt;a href=&quot;/topics/marketing&quot;&gt;Marketing&lt;/a&gt; writing.&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-difference-between-organic-content-and-paid-ads&quot;&gt;What is the difference between organic content and paid ads?&lt;/h2&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Organic content&lt;/th&gt;&lt;th&gt;Paid ads&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;What it is&lt;/td&gt;&lt;td&gt;Posts, articles, videos and search traffic you do not pay for per view&lt;/td&gt;&lt;td&gt;Placements you pay for, such as Meta Ads on Facebook and Instagram&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Main cost&lt;/td&gt;&lt;td&gt;Time and skill&lt;/td&gt;&lt;td&gt;Ad budget, plus time to set up and manage&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Speed&lt;/td&gt;&lt;td&gt;Usually slow to build&lt;/td&gt;&lt;td&gt;Reach can start the same day&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;After you stop&lt;/td&gt;&lt;td&gt;Published content can keep bringing people in&lt;/td&gt;&lt;td&gt;Reach stops when the budget stops&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Feedback&lt;/td&gt;&lt;td&gt;Slower, spread across many posts&lt;/td&gt;&lt;td&gt;Fast, with clear numbers per ad&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best for&lt;/td&gt;&lt;td&gt;Trust, search visibility and long-term reach&lt;/td&gt;&lt;td&gt;Launches, tests and reaching new people quickly&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;how-do-paid-ads-work-on-a-small-budget&quot;&gt;How do paid ads work on a small budget?&lt;/h2&gt;
&lt;aside class=&quot;not-prose border-foreground my-8 border-s-[3px] py-1 ps-5&quot;&gt;&lt;p class=&quot;label-caps mb-2&quot;&gt;From the build&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-2&quot;&gt;&lt;p&gt;At VITE SEO Digital Advertising I launched Meta ad campaigns on a budget of about US$8 a day. They generated 33 inbound lead conversations in the first 5 days, at about US$1 each.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The campaign used the Messages objective, so each ad opened a Messenger or Instagram chat instead of a landing page. The audience was business owners in Metro Manila, set by location and a few broad interests in small business and marketing. The creative was simple: a short graphic or video that named one problem, such as a website that does not show up on Google, and offered a free consultation. The offer was the consultation itself, not a discount.&lt;/p&gt;
&lt;p&gt;Our AI chatbot answered each conversation first, handled the basic questions and sent the booking link. After that, the conversations split. Some people booked a consultation, some asked for prices and went quiet, and a few were not a fit at all. The people who kept replying after the first answer were the real leads, and our team followed up with them by hand.&lt;/p&gt;
&lt;p&gt;A small budget is useful because it lets you learn which message and audience get a response before spending more. The number to watch depends on the goal: for lead conversations, it is the cost per conversation and how many of them turn into real opportunities.&lt;/p&gt;
&lt;h2 id=&quot;what-does-organic-content-take&quot;&gt;What does organic content take?&lt;/h2&gt;
&lt;p&gt;Organic content asks for consistency more than money. It usually means picking a few channels, posting on a regular schedule, writing about the questions your audience asks, and giving each piece time to be found. Search traffic in particular can take months to build.&lt;/p&gt;
&lt;p&gt;For the agency, organic content meant posts on our Facebook Page and Instagram, short videos about websites and search, and SEO articles on our own site. Posts that explained one simple thing, like why a site does not show up on Google, did better than general promotional posts. What did not work was posting without a schedule. When client work got busy, posting stopped, and reach dropped with it. Search traffic to our articles grew slowly, which is what I expected.&lt;/p&gt;
&lt;h2 id=&quot;which-one-gives-better-results&quot;&gt;Which one gives better results?&lt;/h2&gt;
&lt;p&gt;They measure different things, so a straight comparison can mislead. Paid ads are easy to measure per peso or dollar spent. Organic content is harder to measure, because one post can bring people in for months, or help someone decide after they found you some other way.&lt;/p&gt;
&lt;p&gt;From doing both, ads clearly won on speed. The 33 conversations in 5 days at about US$1 each came faster than anything organic did for us. Organic content was slower and harder to measure, but some people told us they had seen our posts or read an article before they messaged. For a new business that needs leads this month, I would pick ads. For a business that plans to be around in two years, I would not skip organic.&lt;/p&gt;
&lt;aside class=&quot;not-prose my-8 rounded-lg p-4 bg-muted&quot; role=&quot;note&quot;&gt;&lt;p class=&quot;label-caps mb-1&quot;&gt;Tip&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-1.5&quot;&gt;&lt;p&gt;Whichever you use, plan how you will answer people quickly. An ad that brings in conversations nobody replies to wastes the budget.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;when-does-each-one-make-sense&quot;&gt;When does each one make sense?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lean on paid ads when&lt;/strong&gt; you need people to know about something soon, you want to test an offer or message, or you have budget but little time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lean on organic content when&lt;/strong&gt; you want reach that lasts, you are building trust over time, or your budget is small but you can put in regular hours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use both when&lt;/strong&gt; you can: test messages with ads, then turn the ones that work into organic content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are starting out today, run a small ad test for a week or two, make sure every message gets a reply within minutes, and write down the questions people ask. Then turn those questions into posts and articles. That way the ads teach you what to say, and the organic content keeps saying it after the budget runs out.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/blog/organic-content-vs-paid-ads&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Marketing</category></item><item><title>GEO and AEO Fundamentals: What Everyone Should Know About AI Search</title><link>https://urielpapa.com/blog/geo-and-aeo-fundamentals</link><guid isPermaLink="true">https://urielpapa.com/blog/geo-and-aeo-fundamentals</guid><description>GEO and AEO explained in plain words, how AI search finds and cites websites, what still matters from SEO, and how this site is set up for AI answers.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;GEO (generative engine optimization) is the practice of making content easy for AI systems such as ChatGPT search, Google AI Overviews and Perplexity to understand and cite.&lt;/li&gt;&lt;li&gt;AEO (answer engine optimization) focuses on giving clear, direct answers that search engines and assistants can lift into a reply.&lt;/li&gt;&lt;li&gt;GEO and AEO build on SEO, so crawlable pages, clear structure and trustworthy content still come first.&lt;/li&gt;&lt;li&gt;AI search crawlers can only cite pages they are allowed to fetch, so robots.txt and CDN bot settings matter.&lt;/li&gt;&lt;li&gt;Structured data such as JSON-LD helps search engines and AI systems understand who wrote a page and what it is about.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;GEO (generative engine optimization) and AEO (answer engine optimization) are the practices of making your content easy for AI systems to understand, quote and cite in their answers. They build on SEO rather than replace it: an assistant can only cite a page it can find, fetch and understand.&lt;/p&gt;
&lt;p&gt;This explainer is part of my &lt;a href=&quot;/topics/seo-geo-aeo&quot;&gt;SEO, GEO and AEO&lt;/a&gt; writing. I have worked in SEO since 2023, and this site itself is set up as a working example of the ideas below.&lt;/p&gt;
&lt;h2 id=&quot;what-are-geo-and-aeo-in-plain-words&quot;&gt;What are GEO and AEO, in plain words?&lt;/h2&gt;
&lt;p&gt;Search used to mean a page of links. Now many people ask ChatGPT, Perplexity, Google AI Overviews or another assistant, and get a written answer that quotes a few sources. GEO and AEO are about being one of those sources.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AEO&lt;/strong&gt; is about answers. Put a direct answer to the question near the top of the page, phrase headings as the questions people ask, and keep each section focused on one question.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GEO&lt;/strong&gt; is about how generative systems read your content. Make it clear who wrote it, what entities it covers, what evidence supports it, and where each fact comes from.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The two overlap so much that most people use them together.&lt;/p&gt;
&lt;h2 id=&quot;how-do-ai-search-systems-find-and-cite-pages&quot;&gt;How do AI search systems find and cite pages?&lt;/h2&gt;
&lt;p&gt;Most AI answers that cite websites follow a similar path: the system searches an index, fetches a handful of pages, reads the passages that look relevant, and writes an answer that quotes or links some of them. Some assistants use their own search index, and others use a partner’s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google AI Overviews and AI Mode&lt;/strong&gt; draw on Google Search’s own index, and Google says there are &lt;a href=&quot;https://developers.google.com/search/docs/appearance/ai-features&quot;&gt;no extra requirements&lt;/a&gt; beyond being indexed and eligible for a snippet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Copilot&lt;/strong&gt; runs on Bing. Bing’s &lt;a href=&quot;https://www.bing.com/webmasters/help/webmaster-guidelines-30fba23a&quot;&gt;webmaster guidelines&lt;/a&gt; say its AI experiences share the same crawling, indexing and ranking foundation as Bing Search.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT search&lt;/strong&gt; uses OpenAI’s own crawler, &lt;a href=&quot;https://developers.openai.com/api/docs/bots&quot;&gt;OAI-SearchBot&lt;/a&gt;, together with &lt;a href=&quot;https://help.openai.com/en/articles/9237897-chatgpt-search&quot;&gt;third-party search providers&lt;/a&gt; that OpenAI does not name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perplexity&lt;/strong&gt; crawls and indexes the web with its own &lt;a href=&quot;https://docs.perplexity.ai/guides/bots&quot;&gt;PerplexityBot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude&lt;/strong&gt; web search has used Brave Search, which Anthropic &lt;a href=&quot;https://simonwillison.net/2025/Mar/21/anthropic-use-brave/&quot;&gt;added to its subprocessor list&lt;/a&gt; in March 2025.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, being indexed in both Google and Bing, and not blocking these crawlers in robots.txt, covers most of them.&lt;/p&gt;
&lt;p&gt;That means three things matter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Access.&lt;/strong&gt; The crawler or fetcher must be allowed by robots.txt and not blocked by a firewall or CDN bot setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Passages.&lt;/strong&gt; Each section should make sense when read on its own, because an assistant may quote only one passage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trust.&lt;/strong&gt; Clear authorship, sources for figures and consistent information across the web make a page safer to cite.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;what-still-matters-from-seo&quot;&gt;What still matters from SEO?&lt;/h2&gt;
&lt;p&gt;Nearly everything. Pages still need to be crawlable and indexable, load quickly, have a clear title and meta description, use headings that match what the page covers, and link to related pages on the same site. Google Search Console is still the first place to check whether pages are indexed and which queries bring people in.&lt;/p&gt;
&lt;aside class=&quot;not-prose border-foreground my-8 border-s-[3px] py-1 ps-5&quot;&gt;&lt;p class=&quot;label-caps mb-2&quot;&gt;From the build&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-2&quot;&gt;&lt;p&gt;I led and co-developed 5 in-house WordPress plugins, about 11,700 lines of code, including a publish guard that refuses a post without an SEO title, a meta description and schema.&lt;/p&gt;&lt;/div&gt;&lt;p class=&quot;mt-2 text-sm&quot;&gt;&lt;a href=&quot;/projects/wordpress-seo-plugins&quot; data-event=&quot;fromthebuild_click&quot; data-event-project=&quot;wordpress-seo-plugins&quot;&gt;See the project: WordPress SEO Plugin Suite →&lt;/a&gt;&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;The habit from my SEO work since 2023 that matters even more now is answering the question in the first sentence. Pages that answered plainly near the top tended to win featured snippets, and that same habit makes a passage easy for an AI assistant to quote. I also learned that a plugin can check for a title, a description and schema, but it cannot write a clear answer for you. That part still comes down to the writer.&lt;/p&gt;
&lt;h2 id=&quot;what-can-you-do-on-your-own-site-today&quot;&gt;What can you do on your own site today?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Answer the question in the first two sentences&lt;/strong&gt; of each page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phrase headings as questions&lt;/strong&gt;, one question per section.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name things clearly&lt;/strong&gt;: people, products, tools and places, using the same names everywhere.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cite sources&lt;/strong&gt; for figures and claims, and date anything that changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add structured data&lt;/strong&gt; (JSON-LD) for the page type and the author.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check robots.txt and your CDN&lt;/strong&gt; so the crawlers you want are not blocked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep your profiles consistent&lt;/strong&gt; so the author entity is easy to recognize.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class=&quot;not-prose my-8 rounded-lg p-4 border-foreground border border-dashed&quot; role=&quot;note&quot;&gt;&lt;p class=&quot;label-caps mb-1&quot;&gt;Warning&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-1.5&quot;&gt;&lt;p&gt;Some CDNs and firewalls have their own AI bot blocking settings that override robots.txt. Check them, not only the robots.txt file.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;how-is-this-site-set-up-for-ai-search&quot;&gt;How is this site set up for AI search?&lt;/h2&gt;
&lt;p&gt;These are facts about how urielpapa.com is built:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;robots.txt allows AI crawlers.&lt;/strong&gt; It welcomes search and AI answer crawlers, including OAI-SearchBot, ChatGPT-User, PerplexityBot and Claude-SearchBot, and also allows training crawlers such as GPTBot, ClaudeBot and Google-Extended. Only the CMS and a few utility routes are disallowed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON-LD structured data&lt;/strong&gt; on every page type, describing the site, the author and each post.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown copies of posts&lt;/strong&gt; at /blog/post-slug.md. Each copy points back to the original page as the canonical version and is marked noindex, so it never competes with the HTML page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An llms.txt file&lt;/strong&gt; that summarizes the site, its topics and its latest posts for AI tools. It is a proposal rather than an adopted standard, so it is generated at build time and kept simple.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A full-content RSS feed&lt;/strong&gt; of posts and notes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct answers and question headings&lt;/strong&gt; in every post, like this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This site is newly launched, so there is not enough Search Console or AI answer data yet to say what works. I will share what I see after a few months of data, including whether AI assistants cite these posts and which pages they pick.&lt;/p&gt;
&lt;h2 id=&quot;how-do-you-know-if-it-is-working&quot;&gt;How do you know if it is working?&lt;/h2&gt;
&lt;p&gt;There is no single report for AI citations yet. Useful signals include referral traffic from AI assistants in your analytics, Search Console data for queries and pages, and simply asking the assistants questions your pages answer and noting whether you are cited.&lt;/p&gt;
&lt;p&gt;Google added a &lt;a href=&quot;https://support.google.com/webmasters/answer/16984139&quot;&gt;Generative AI performance report&lt;/a&gt; to Search Console in June 2026 and rolled it out to all websites by August 31, 2026. It shows how often your pages appeared in AI Overviews and AI Mode, by page, country, device and date. It reports impressions only, not clicks, and clicks from these features are still counted inside the regular Performance report under the Web search type. Bing Webmaster Tools has a similar &lt;a href=&quot;https://www.bing.com/webmasters/help/ai-performance-9f8e7d6c&quot;&gt;AI Performance report&lt;/a&gt; that counts citations in Microsoft Copilot.&lt;/p&gt;
&lt;p&gt;To check whether this site gets cited, I ask a few assistants the same plain questions my posts answer, such as “What is tokenization in AI?”, “What are GEO and AEO?” and “What changed in Astro 7 for content sites?”. I run them in ChatGPT, Perplexity, Gemini and Claude about once a month, and I note whether urielpapa.com shows up as a source. It is a manual check, but it shows what a real reader would see.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/blog/geo-and-aeo-fundamentals&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>SEO, GEO and AEO</category></item><item><title>How I Built an AI Chatbot for Messenger and Instagram with n8n</title><link>https://urielpapa.com/blog/n8n-messenger-instagram-chatbot</link><guid isPermaLink="true">https://urielpapa.com/blog/n8n-messenger-instagram-chatbot</guid><description>A step-by-step guide to an n8n and OpenRouter chatbot for Facebook Messenger and Instagram that answers inquiries, books calls and logs leads, plus costs.</description><pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;An n8n workflow can receive Facebook Messenger and Instagram messages through a Meta webhook, reply with an AI model, and log every conversation.&lt;/li&gt;&lt;li&gt;OpenRouter lets one n8n workflow reach many AI models through a single API, so you can switch models without rebuilding the chatbot.&lt;/li&gt;&lt;li&gt;The system prompt decides most of the chatbot&apos;s behavior, including what it answers, what it refuses and when it hands over to a human.&lt;/li&gt;&lt;li&gt;A chatbot like this should hand sensitive or unclear conversations to a person instead of guessing.&lt;/li&gt;&lt;li&gt;My setup cost about US$10 a month to run in early 2026, mostly a small VPS for self-hosted n8n plus AI tokens.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;At the end of this guide you will have an AI chatbot for Facebook Messenger and Instagram that answers inquiries, books consultations and logs leads automatically. It runs on n8n for the workflow, the Meta messaging platform for the two channels, and OpenRouter for the AI model.&lt;/p&gt;
&lt;p&gt;I built a chatbot like this at VITE SEO Digital Advertising, the agency I founded and have since closed, and this guide is based on that build. The steps below follow the order I built it in. It is part of my &lt;a href=&quot;/topics/automation&quot;&gt;Automation&lt;/a&gt; writing. I built it because inquiries from our ads often came in at night and on weekends, and I wanted every person to get a reply right away instead of the next morning.&lt;/p&gt;
&lt;h2 id=&quot;what-do-you-need-before-you-start&quot;&gt;What do you need before you start?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A Facebook Page&lt;/strong&gt;, and an Instagram professional account connected to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Meta developer account&lt;/strong&gt; and an app with messaging access. The app needs the &lt;code&gt;pages_messaging&lt;/code&gt; permission for Messenger and &lt;code&gt;instagram_manage_messages&lt;/code&gt; for Instagram. Standard Access works for Pages and accounts you own or manage. To serve accounts you don’t manage, Meta requires &lt;a href=&quot;https://developers.facebook.com/docs/instagram-platform/overview&quot;&gt;Advanced Access, which needs App Review and Business Verification&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An n8n instance&lt;/strong&gt;, either n8n Cloud or self-hosted, reachable over HTTPS so Meta can call its webhook.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An OpenRouter account and API key&lt;/strong&gt;, with credit for the model you pick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A place to log leads&lt;/strong&gt;, such as a Google Sheet or a database table.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A booking link&lt;/strong&gt;, such as a calendar scheduling page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A written list of what the bot should know&lt;/strong&gt;: services, prices, hours, FAQs and when to hand over to a person.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-do-you-build-it-step-by-step&quot;&gt;How do you build it, step by step?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create a Meta app.&lt;/strong&gt; In &lt;a href=&quot;https://developers.facebook.com/apps/&quot;&gt;Meta for Developers&lt;/a&gt;, create a business app, add the &lt;strong&gt;Messenger&lt;/strong&gt; product, and connect your Facebook Page. Then open Messenger’s Instagram settings and connect the Instagram professional account linked to that Page. Meta renames menus from time to time, so follow the current &lt;a href=&quot;https://developers.facebook.com/docs/messenger-platform&quot;&gt;Messenger Platform docs&lt;/a&gt; if a label differs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect the webhook to n8n.&lt;/strong&gt; Add a Webhook node in n8n, copy its production URL into the Meta app’s webhook settings, and set a verify token. Add a branch that answers Meta’s verification request so the webhook is accepted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parse the incoming message.&lt;/strong&gt; Pull out the sender ID, the channel (Messenger or Instagram) and the message text. Ignore echoes of your own replies so the bot does not answer itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add the AI reply node through OpenRouter.&lt;/strong&gt; Use an HTTP Request node or an AI model node pointed at OpenRouter, pass the system prompt and the recent messages, and read back the reply.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write the system prompt.&lt;/strong&gt; Tell the model who it speaks for, what it knows, the tone to use, what it must not answer, and the exact phrase or flag to return when a human should take over.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add booking and logging branches.&lt;/strong&gt; When the person wants a consultation, send the booking link. For every conversation, write the sender, channel, message and outcome to your lead log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Send the reply.&lt;/strong&gt; Call the &lt;a href=&quot;https://developers.facebook.com/docs/messenger-platform/send-messages&quot;&gt;Send API&lt;/a&gt; with a &lt;code&gt;POST&lt;/code&gt; to &lt;code&gt;https://graph.facebook.com/v25.0/{PAGE-ID}/messages&lt;/code&gt;, using the Page access token. The body needs &lt;code&gt;recipient.id&lt;/code&gt; (the sender’s ID from the webhook), &lt;code&gt;messaging_type: &amp;quot;RESPONSE&amp;quot;&lt;/code&gt; and &lt;code&gt;message.text&lt;/code&gt;. You can reply freely within 24 hours of the person’s last message. After that, Meta only allows specific message types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test.&lt;/strong&gt; Message the Page and the Instagram account from a test account. Try normal questions, off-topic questions, a request for a human and a message in another language.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go live.&lt;/strong&gt; Switch the Meta app to live mode, complete any app review Meta requires, and watch the first real conversations closely.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here is my workflow node by node, in the order a message passes through it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Webhook:&lt;/strong&gt; receives every request Meta sends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IF (verification):&lt;/strong&gt; if it is Meta’s verification request, a Respond to Webhook node returns the challenge and the run stops.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Respond to Webhook:&lt;/strong&gt; sends Meta a quick &lt;code&gt;200 OK&lt;/code&gt; so it does not resend the message.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code:&lt;/strong&gt; pulls out the sender ID, channel and message text, and drops echoes of the bot’s own replies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Sheets (read):&lt;/strong&gt; loads the last few messages from this sender for context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Request (OpenRouter):&lt;/strong&gt; sends the system prompt and recent messages, and reads back the reply and any flag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch:&lt;/strong&gt; routes on the flag: a normal answer, a booking request, or a handover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Request (Send API):&lt;/strong&gt; sends the reply, with the booking link added when the person wants a call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Sheets (append):&lt;/strong&gt; logs the sender, channel, message and outcome.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gmail:&lt;/strong&gt; on a handover, emails a person with the conversation so far.&lt;/li&gt;
&lt;/ol&gt;
&lt;aside class=&quot;not-prose my-8 rounded-lg p-4 bg-muted&quot; role=&quot;note&quot;&gt;&lt;p class=&quot;label-caps mb-1&quot;&gt;Tip&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-1.5&quot;&gt;&lt;p&gt;Keep the system prompt short and specific. It is sent with every message, so every extra sentence adds tokens to every reply. My post on &lt;a href=&quot;/blog/what-is-tokenization&quot;&gt;what tokenization is&lt;/a&gt; explains why that matters for cost.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;what-does-it-cost-to-run&quot;&gt;What does it cost to run?&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Item&lt;/th&gt;&lt;th&gt;Monthly cost&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;n8n hosting&lt;/td&gt;&lt;td&gt;About US$6&lt;/td&gt;&lt;td&gt;Self-hosted on a small VPS (1 to 2 GB of memory)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI tokens through OpenRouter&lt;/td&gt;&lt;td&gt;About US$3 to US$5&lt;/td&gt;&lt;td&gt;A low-cost model such as GPT-4o mini, around 6,000 to 10,000 tokens per conversation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lead log and booking tool&lt;/td&gt;&lt;td&gt;About US$0 extra&lt;/td&gt;&lt;td&gt;Google Sheets and a Google Calendar booking page, already part of our Google Workspace&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Total&lt;/td&gt;&lt;td&gt;About US$10&lt;/td&gt;&lt;td&gt;Approximate figures for a typical month in early 2026&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The biggest variable is usually tokens: how long the system prompt is, how much history you send with each message and how long the replies are.&lt;/p&gt;
&lt;h2 id=&quot;what-does-it-do-well-and-where-does-it-fall-short&quot;&gt;What does it do well, and where does it fall short?&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Handles well&lt;/th&gt;&lt;th&gt;Falls short&lt;/th&gt;&lt;th&gt;When a human must step in&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Common questions about services, prices and hours&lt;/td&gt;&lt;td&gt;Questions the system prompt does not cover&lt;/td&gt;&lt;td&gt;The person asks for a human&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Replies at any hour&lt;/td&gt;&lt;td&gt;Messages with little context, such as a single emoji&lt;/td&gt;&lt;td&gt;Complaints or sensitive topics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sending the booking link at the right moment&lt;/td&gt;&lt;td&gt;Long back-and-forth negotiations&lt;/td&gt;&lt;td&gt;Anything involving payments, contracts or personal data&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Logging every lead in one place&lt;/td&gt;&lt;td&gt;Knowing when information in the prompt is out of date&lt;/td&gt;&lt;td&gt;When the bot is unsure and says so&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Our chatbot did best with the simple, repeated questions: what services we offered, rough package prices and how to book a call. It struggled with mixed Taglish messages and very short ones like “hm” or “how much?”, where it sometimes guessed which service the person meant. It also needed a prompt update every time our packages changed, so I learned to treat the system prompt like a price list someone has to keep current.&lt;/p&gt;
&lt;h2 id=&quot;when-should-a-person-take-over&quot;&gt;When should a person take over?&lt;/h2&gt;
&lt;p&gt;Build the handover in from the start. Have the model return a clear flag when it should not answer, then have n8n stop replying in that conversation and notify a person, for example by email or a chat message. Tell the customer that someone will follow up, and keep the logged conversation so the person does not have to ask everything again.&lt;/p&gt;
&lt;h2 id=&quot;what-should-you-check-before-going-live&quot;&gt;What should you check before going live?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The webhook answers Meta’s verification request.&lt;/li&gt;
&lt;li&gt;The bot ignores its own messages.&lt;/li&gt;
&lt;li&gt;The system prompt lists what the bot must not answer.&lt;/li&gt;
&lt;li&gt;Handover to a person works and sends a notification.&lt;/li&gt;
&lt;li&gt;Every conversation is logged with its channel and outcome.&lt;/li&gt;
&lt;li&gt;You know your expected monthly token use and have set a spending limit where your provider allows it.&lt;/li&gt;
&lt;li&gt;Your privacy notice covers storing messages and contact details.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/blog/n8n-messenger-instagram-chatbot&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Automation</category></item><item><title>What Is Tokenization, and Why Does It Decide What AI Costs?</title><link>https://urielpapa.com/blog/what-is-tokenization</link><guid isPermaLink="true">https://urielpapa.com/blog/what-is-tokenization</guid><description>Tokenization is how a language model splits text into tokens. Here is how it works, why models limit and charge by tokens, and how to estimate AI costs.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Tokenization is how a large language model splits text into small pieces called tokens, which can be whole words, parts of words or punctuation.&lt;/li&gt;&lt;li&gt;Different models use different tokenizers, so the same sentence can become a different number of tokens in Claude, GPT or Gemini.&lt;/li&gt;&lt;li&gt;Model providers charge per token, usually with separate prices for input tokens and output tokens.&lt;/li&gt;&lt;li&gt;A model&apos;s context window is measured in tokens, so tokenization also decides how much text a model can work with at once.&lt;/li&gt;&lt;li&gt;What surprised me on real bills was how much of the cost came from the system prompt and chat history sent with every message, not from the question itself.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tokenization is how a language model splits text into small pieces called tokens; models read, write, limit and charge by tokens, not words. That is why two prompts of the same length in words can cost different amounts, and why a long document can suddenly be “too long” for a model.&lt;/p&gt;
&lt;p&gt;This explainer is part of my &lt;a href=&quot;/topics/ai&quot;&gt;AI, in Depth&lt;/a&gt; writing. I use models through OpenRouter in my own automations, so token counts are something I watch on real bills. I first noticed token costs when I built a Messenger and Instagram chatbot with n8n and OpenRouter, where every customer message also carried the full system prompt.&lt;/p&gt;
&lt;h2 id=&quot;what-is-a-token&quot;&gt;What is a token?&lt;/h2&gt;
&lt;p&gt;A token is the basic unit a large language model works with. It can be a whole word, part of a word, a single character, a space attached to a word, or a punctuation mark. Before a model sees your text, a tokenizer turns it into a list of tokens, and each token into a number the model can process.&lt;/p&gt;
&lt;p&gt;Models do this because working with whole words would need an enormous vocabulary and would fail on new words, names and typos. Working with single characters would make every text very long. Tokens sit in between: common words become one token, and rare words get split into familiar pieces.&lt;/p&gt;
&lt;h2 id=&quot;how-does-text-become-tokens&quot;&gt;How does text become tokens?&lt;/h2&gt;
&lt;p&gt;Here is an illustrative example. The exact split depends on the tokenizer, and every model family uses its own, so treat this as a picture of the idea rather than the output of a specific model.&lt;/p&gt;
&lt;p&gt;Sentence: “Tokenization isn’t magic, it’s math.”&lt;/p&gt;




























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Token&lt;/th&gt;&lt;th&gt;Note&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Token&lt;/td&gt;&lt;td&gt;A common word piece&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;ization&lt;/td&gt;&lt;td&gt;A common suffix&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;” isn”&lt;/td&gt;&lt;td&gt;Many tokenizers attach the leading space to the word&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;’t&lt;/td&gt;&lt;td&gt;Contractions are often split&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;” magic”&lt;/td&gt;&lt;td&gt;A common word becomes one token&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;td&gt;Punctuation is usually its own token&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;” it”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;’s&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;” math”&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;So a 5-word sentence becomes about 10 tokens in this example. Short sentences with contractions and punctuation split more than average. For ordinary English prose, &lt;a href=&quot;https://developers.openai.com/api/docs/concepts&quot;&gt;OpenAI’s rule of thumb&lt;/a&gt; is that one token is about 4 characters, or 0.75 words, so 1,000 words come to roughly 1,300 tokens. Most providers offer a tokenizer tool or a token-counting API, and that is the reliable way to count tokens for a specific model.&lt;/p&gt;
&lt;aside class=&quot;not-prose my-8 rounded-lg p-4 bg-muted&quot; role=&quot;note&quot;&gt;&lt;p class=&quot;label-caps mb-1&quot;&gt;Note&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-1.5&quot;&gt;&lt;p&gt;Tokenizers differ between models. The same text can be a different number of tokens in Claude, GPT, Gemini or Gemma, so always count with the tokenizer of the model you plan to use.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;why-do-tokens-decide-what-ai-costs&quot;&gt;Why do tokens decide what AI costs?&lt;/h2&gt;
&lt;p&gt;Providers charge per token, usually quoted per million tokens, with one price for input (what you send) and a higher price for output (what the model writes back). Every request is billed as input tokens times the input price plus output tokens times the output price.&lt;/p&gt;
&lt;p&gt;These are the standard API prices for one mid-range model from each of the three big providers, checked on October 17, 2026:&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;/th&gt;&lt;th&gt;Input per 1M tokens&lt;/th&gt;&lt;th&gt;Output per 1M tokens&lt;/th&gt;&lt;th&gt;Cached input per 1M tokens&lt;/th&gt;&lt;th&gt;Source&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Claude Sonnet 5.5&lt;/td&gt;&lt;td&gt;US$2.00&lt;/td&gt;&lt;td&gt;US$10.00&lt;/td&gt;&lt;td&gt;US$0.10&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/pricing&quot;&gt;Anthropic pricing&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI gpt-6.1-sol&lt;/td&gt;&lt;td&gt;US$2.00&lt;/td&gt;&lt;td&gt;US$10.00&lt;/td&gt;&lt;td&gt;US$0.10&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developers.openai.com/api/docs/pricing&quot;&gt;OpenAI pricing&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gemini 3.1 Pro Preview (up to 200K)&lt;/td&gt;&lt;td&gt;US$2.00&lt;/td&gt;&lt;td&gt;US$12.00&lt;/td&gt;&lt;td&gt;US$0.20, plus storage&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://ai.google.dev/gemini-api/docs/pricing&quot;&gt;Gemini API pricing&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Output costs five to six times as much as input on all three, which is why long replies drive most of a bill. Prices change often, so check the source pages before you budget.&lt;/p&gt;
&lt;p&gt;The input side includes more than your question. A chatbot request often carries a system prompt, the conversation so far and any documents you added, and all of that is counted every time.&lt;/p&gt;
&lt;h2 id=&quot;why-do-tokens-set-a-models-limits&quot;&gt;Why do tokens set a model’s limits?&lt;/h2&gt;
&lt;p&gt;A model’s context window is the maximum number of tokens it can consider in one request, counting both what you send and what it writes back. When a conversation or document goes past that limit, something has to be dropped or summarized. That is why long chats can seem to “forget” what was said early on.&lt;/p&gt;
&lt;p&gt;Output length is limited in tokens too. A model may stop mid-answer when it reaches its output limit, even if the context window still has room.&lt;/p&gt;
&lt;h2 id=&quot;what-does-this-mean-in-practice&quot;&gt;What does this mean in practice?&lt;/h2&gt;
&lt;p&gt;In practice, tokens turn a vague AI cost into a number you can estimate. Here is a rough example from the Messenger and Instagram chatbot I built with n8n and OpenRouter for my former agency, VITE SEO. In a typical month it handled around 1,000 messages. Each request carried about 2,000 input tokens, mostly the system prompt and recent chat history, and each reply was about 150 tokens. That comes to around 2 million input tokens and 150,000 output tokens a month.&lt;/p&gt;
&lt;p&gt;On a small, low-cost model at about US$0.15 per million input tokens and US$0.60 per million output tokens, that is well under US$1 a month. At the mid-range prices in the table above, it would be about US$5 to US$6. These are estimates based on the usage OpenRouter shows in its activity page, not an exact bill.&lt;/p&gt;
&lt;p&gt;After looking at the numbers, I cut the system prompt to about half its length, sent only the last few messages instead of the whole chat, and asked the model for short replies. The biggest saving came from the system prompt, because it was sent with every single message.&lt;/p&gt;
&lt;p&gt;To estimate the cost of an AI feature before you build it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write a typical request: the system prompt, a sample user message and any context you would include.&lt;/li&gt;
&lt;li&gt;Count its tokens with the tokenizer for your chosen model.&lt;/li&gt;
&lt;li&gt;Estimate the length of a typical reply in tokens.&lt;/li&gt;
&lt;li&gt;Multiply by the input and output prices, then by the number of requests you expect each month.&lt;/li&gt;
&lt;li&gt;Add a margin for long conversations and retries.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;how-can-you-use-fewer-tokens&quot;&gt;How can you use fewer tokens?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keep the system prompt short.&lt;/strong&gt; It is sent with every request, so every extra sentence costs you on every message.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trim the conversation history.&lt;/strong&gt; Send the last few messages or a short summary instead of the full chat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ask for short, structured replies.&lt;/strong&gt; Output tokens usually cost the most.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pick the right model size.&lt;/strong&gt; A smaller model can handle simple tasks like classification for a fraction of the cost.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use caching where the provider offers it.&lt;/strong&gt; Most major providers discount repeated input, such as a long system prompt, when it is sent again within a short time. As of October 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenAI&lt;/strong&gt; caches prompts of 1,024 tokens or more automatically, and cached input is &lt;a href=&quot;https://developers.openai.com/api/docs/guides/prompt-caching&quot;&gt;discounted by up to 95 percent&lt;/a&gt; depending on the model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anthropic&lt;/strong&gt; caches what you mark with &lt;code&gt;cache_control&lt;/code&gt;. A cache read costs &lt;a href=&quot;https://platform.claude.com/docs/en/build-with-claude/prompt-caching&quot;&gt;0.1 times the normal input price&lt;/a&gt; or less, writing to the cache costs a little more than normal input, and the cache lasts 5 minutes by default, with a paid 1-hour option.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt; applies &lt;a href=&quot;https://ai.google.dev/gemini-api/docs/caching&quot;&gt;implicit caching&lt;/a&gt; by default on Gemini 2.5 and newer models and passes the savings on automatically, with explicit caching available for more control.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rates change often, so check each provider’s pricing page before you budget around them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Context windows deserve a post of their own, and they are one of the topics in this hub.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/blog/what-is-tokenization&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>AI, in Depth</category></item><item><title>Laravel vs Next.js: What I Learned Using Both in One System</title><link>https://urielpapa.com/blog/laravel-vs-nextjs</link><guid isPermaLink="true">https://urielpapa.com/blog/laravel-vs-nextjs</guid><description>Laravel or Next.js? A side-by-side on what each is good at, hosting and upkeep, plus why our ERP used Laravel for the API and Next.js for the interface.</description><pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Key takeaways&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Laravel is a back-end PHP framework that suits data-heavy business logic, such as payroll, accounting and permissions.&lt;/li&gt;&lt;li&gt;Next.js is a React framework that suits fast, interactive interfaces and content sites.&lt;/li&gt;&lt;li&gt;Many systems use Laravel for the API and Next.js for the interface, and the two work well together over a REST API.&lt;/li&gt;&lt;li&gt;The VITE SEO Digital Advertising ERP used a Laravel 13 API with a Next.js 16 and React 19 front end, and shipped 115 pages and 5,241 automated tests in under 3 months.&lt;/li&gt;&lt;li&gt;Choosing between Laravel and Next.js changes build time, hosting and long-term upkeep, so the decision is a business one as much as a technical one.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Laravel is a back-end PHP framework suited to data-heavy logic, while Next.js is a React framework suited to fast, interactive interfaces and content sites. They are not really rivals: many systems use Laravel for the API and Next.js for the interface, and that is exactly how our ERP was built.&lt;/p&gt;
&lt;p&gt;I led the team that built a four-module ERP on Laravel and Next.js in 2026, so this comparison comes from using both in one system. It is part of my &lt;a href=&quot;/topics/tech-stacks&quot;&gt;Tech Stacks&lt;/a&gt; writing.&lt;/p&gt;
&lt;aside class=&quot;not-prose border-foreground my-8 border-s-[3px] py-1 ps-5&quot;&gt;&lt;p class=&quot;label-caps mb-2&quot;&gt;From the build&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-2&quot;&gt;&lt;p&gt;The VITE SEO Digital Advertising ERP used a Laravel 13 API with a Next.js 16 and React 19 front end on MySQL. With the in-house team, we shipped 115 pages, 144 data models and 5,241 automated tests in under 3 months.&lt;/p&gt;&lt;/div&gt;&lt;p class=&quot;mt-2 text-sm&quot;&gt;&lt;a href=&quot;/projects/vite-seo-erp&quot; data-event=&quot;fromthebuild_click&quot; data-event-project=&quot;vite-seo-erp&quot;&gt;See the project: VITE SEO Digital Advertising ERP →&lt;/a&gt;&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;what-is-the-difference-between-laravel-and-nextjs&quot;&gt;What is the difference between Laravel and Next.js?&lt;/h2&gt;
&lt;p&gt;Laravel runs on the server and is written in PHP. It gives you routing, a database layer (Eloquent), migrations, queues, authentication, validation and testing tools out of the box, so most of the work of a business system, the rules and the data, has a clear home.&lt;/p&gt;
&lt;p&gt;Next.js is built on React and runs JavaScript or TypeScript on both the server and the browser. Its strength is the interface: pages that load fast, render on the server when it helps search and speed, and stay interactive once loaded.&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Laravel&lt;/th&gt;&lt;th&gt;Next.js&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Purpose&lt;/td&gt;&lt;td&gt;Back-end framework for APIs and full web apps&lt;/td&gt;&lt;td&gt;React framework for interfaces, web apps and content sites&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Language&lt;/td&gt;&lt;td&gt;PHP&lt;/td&gt;&lt;td&gt;JavaScript or TypeScript&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Best at&lt;/td&gt;&lt;td&gt;Data-heavy business logic, permissions, background jobs&lt;/td&gt;&lt;td&gt;Fast, interactive interfaces and server-rendered pages&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hosting&lt;/td&gt;&lt;td&gt;A PHP 8.3+ server or VPS, Laravel Forge, or Laravel Cloud&lt;/td&gt;&lt;td&gt;A Node.js server, Docker, a static export, or Vercel&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Learning curve&lt;/td&gt;&lt;td&gt;Gentle if you know PHP and MVC&lt;/td&gt;&lt;td&gt;Gentle if you know React&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ecosystem&lt;/td&gt;&lt;td&gt;First-party Horizon (queues), Reverb (real-time), Sanctum (auth)&lt;/td&gt;&lt;td&gt;The React ecosystem of components and libraries&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Hosting details come from the official docs as of October 2026. Laravel 13 needs &lt;a href=&quot;https://laravel.com/framework/docs/deployment&quot;&gt;PHP 8.3 or newer&lt;/a&gt; and can run on any server you manage, on a VPS set up through Laravel Forge, or on Laravel Cloud, the fully managed platform from the Laravel team. Next.js &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/deploying&quot;&gt;deploys&lt;/a&gt; as a Node.js server or a Docker container with every feature, as a static export with fewer features, or on platforms with adapters such as Vercel. For background jobs, real-time events and API authentication, Laravel’s own packages are &lt;a href=&quot;https://laravel.com/framework/docs/horizon&quot;&gt;Horizon&lt;/a&gt;, &lt;a href=&quot;https://laravel.com/framework/docs/reverb&quot;&gt;Reverb&lt;/a&gt; and &lt;a href=&quot;https://laravel.com/framework/docs/sanctum&quot;&gt;Sanctum&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;which-is-quicker-for-building-data-heavy-systems&quot;&gt;Which is quicker for building data-heavy systems?&lt;/h2&gt;
&lt;p&gt;For systems with many related records and strict rules, Laravel gives a lot for free: models, relationships, migrations, validation and queues all follow one set of conventions. In the ERP, the payroll rules (SSS, PhilHealth, Pag-IBIG, withholding tax and 13th-month pay) and the double-entry accounting all lived in the Laravel API.&lt;/p&gt;
&lt;p&gt;Next.js can talk to a database directly too, but you usually assemble more of the pieces yourself: an ORM, an auth library, a job runner. That flexibility is useful for smaller apps, as in the client quotation portal I built on Next.js 14 with Prisma and PostgreSQL.&lt;/p&gt;
&lt;p&gt;Laravel was faster than I expected for the core records. Once our conventions were set, adding a new model with its migration, validation and tests felt routine, which mattered with 144 models. It was slower where the logic was unusual, like payroll edge cases and the accounting reports. There the framework could not help much, and we had to think through every rule and write a test for it.&lt;/p&gt;
&lt;h2 id=&quot;what-do-hosting-and-maintenance-look-like-for-each&quot;&gt;What do hosting and maintenance look like for each?&lt;/h2&gt;
&lt;p&gt;A Laravel app needs a PHP runtime, a database, and often a queue worker and a scheduler running in the background. A Next.js app needs a Node.js runtime or a platform built for it, and much of it can be served as static or cached pages.&lt;/p&gt;
&lt;p&gt;Running both means two deployments, two sets of dependencies to keep updated, and two places where something can break. The upside is that each side can be updated, scaled and tested on its own.&lt;/p&gt;
&lt;p&gt;We ran the Laravel API, MySQL, the queue worker and Reverb on a VPS, and deployed the Next.js front end on Vercel. Upkeep was mostly keeping dependencies updated on both sides, checking that the queue worker and scheduler were still running, and running the full test suite before every deploy. Having 5,241 tests made deploys feel routine, because a broken rule usually showed up in a failing test before it reached anyone.&lt;/p&gt;
&lt;h2 id=&quot;can-you-use-laravel-and-nextjs-together&quot;&gt;Can you use Laravel and Next.js together?&lt;/h2&gt;
&lt;p&gt;Yes, and it is a common pattern. Laravel serves a REST API with the database, authentication and business rules. Next.js renders the interface and calls that API. Real-time features can go through Laravel too: the ERP used Laravel Reverb for real-time events, and its project management module had real-time updates.&lt;/p&gt;
&lt;p&gt;The cost of this split is coordination. Every feature touches two codebases, and the API contract between them has to stay in sync.&lt;/p&gt;
&lt;h2 id=&quot;why-did-we-use-both-in-our-erp&quot;&gt;Why did we use both in our ERP?&lt;/h2&gt;
&lt;p&gt;The ERP had four modules behind one login: HRIS (TeamOra), CRM (Zerem), project management (Sprintly) and accounting. The back end had to handle 144 data models, role-based access and integrations with Gmail, Twilio Voice, Meta messaging webhooks, OpenAI, OpenRouter and 5 n8n outreach workflows. The front end had 115 pages.&lt;/p&gt;
&lt;p&gt;We used Laravel for the API because most of the hard work was rules and data: payroll, accounting, permissions and approvals. Its conventions meant the whole team could follow one pattern across 144 models. We used Next.js for the interface because 115 pages needed to feel quick and consistent, and React let us build shared components once and reuse them in all four modules. Keeping the two apart also meant back-end and front-end work could happen at the same time.&lt;/p&gt;
&lt;aside class=&quot;not-prose my-8 rounded-lg p-4 bg-muted&quot; role=&quot;note&quot;&gt;&lt;p class=&quot;label-caps mb-1&quot;&gt;Note&lt;/p&gt;&lt;div class=&quot;[&amp;amp;_p]:my-1.5&quot;&gt;&lt;p&gt;This post compares the frameworks as used in one system. Version details change quickly, so check the official Laravel and Next.js docs for what is current.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;when-would-i-pick-laravel-nextjs-or-both&quot;&gt;When would I pick Laravel, Next.js, or both?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pick Laravel if&lt;/strong&gt; the hard part is the data and the rules: payroll, accounting, permissions, approvals, background jobs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pick Next.js if&lt;/strong&gt; the hard part is the interface or the content: a marketing site, a portal with a few clear screens, or an app where speed and search visibility matter most.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pick both if&lt;/strong&gt; you have a data-heavy system and also need a modern, interactive interface, and your team can maintain two codebases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After building the ERP, I would pick both again for a system like that, but not for everything. For a small portal or a content site, I would start with Next.js alone and add a separate back end only when the rules get heavy. The split paid off for us because our back end was big enough to need its own home.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://urielpapa.com/blog/laravel-vs-nextjs&quot;&gt;Read on urielpapa.com&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Tech Stacks</category></item></channel></rss>