# Writing — Tamas Piros

Source: https://tpiros.dev/blog

241 technical articles on AI engineering, agents, MCP, LLMs, and web development. Each entry links to its markdown source.

- 2026-08-31 — [When to write an agent skill](https://tpiros.dev/blog/when-to-write-an-agent-skill.md): Vercel ran an eval where installed skills scored exactly the same as no documentation at all, because the agent never opened them in 56% of cases. A flat docs index in AGENTS.md scored 100% on the same suite. The useful reading of that result is about which of two jobs you're doing: putting a fact in front of the model, or getting a sequence carried out the same way every time.
- 2026-08-26 — [Routing a prompt between Gemini Nano and the cloud](https://tpiros.dev/blog/hybrid-ai-in-the-browser.md): Chrome and Edge both ship a language model, and the AI SDK makes swapping one for a cloud model a one-line change. The interesting part is the router that decides which one runs, and every constant in it comes from a measurement.
- 2026-08-24 — [MCP's Progressive Tool Discovery](https://tpiros.dev/blog/progressive-tool-discovery-prompt-caching.md): Progressive tool discovery is usually sold on prompt caching. Keep the tools array fixed, the argument goes, and the cached prefix survives. I ran 72 benchmarks across gemini-3.5, 3.6 and 3.7 Flash at 14, 42, 84 and 280 tools. The fixed prefix cached in exactly zero of 36 runs, the pattern it argues against cached up to 93%, and the point where the pattern starts paying moved down to about 20 tools on the newest model.
- 2026-08-13 — [Stateless MCP servers](https://tpiros.dev/blog/stateless-mcp-servers.md): The MCP server most tutorials ship, mine included, opens with a session handshake: initialize, get back an Mcp-Session-Id, carry it on every request, hold a live transport per client on the server. A stateless server drops all of it. Each request stands alone, any copy of the server can answer it, and the July 2026 spec makes that the only model there is. Here are both servers side by side, compared on the wire.
- 2026-08-10 — [The agent said it was in stock](https://tpiros.dev/blog/the-agentic-web.md): Agents keep giving me confident, wrong answers about the real world. WebMCP fixes half of that problem; discovery is still wide open.
- 2026-08-06 — [The forward deployed engineer land grab](https://tpiros.dev/blog/forward-deployed-engineer-land-grab.md): Four companies committed roughly $9 billion in nine weeks to putting their own engineers inside customer organisations. What a forward deployed engineer actually costs, who really gets one, and the question to ask before you sign anything: what remains when they leave?
- 2026-08-05 — [Authenticating MCP servers](https://tpiros.dev/blog/authenticating-mcp-servers.md): Almost every MCP tutorial, mine included, ships a server with no idea who's calling it: any client that reaches the endpoint gets the same data. For a while the protocol had no answer to that. It does now, and auth is the part of the MCP spec that has moved most. Here's the smallest server that sits on the right side of it, with a bearer token at the door and each user seeing only their own data, checked on the wire.
- 2026-07-21 — [Headless tools: let an LLM act in the user's browser](https://tpiros.dev/blog/headless-tools-gemini-browser.md): A model's tools normally run on the server. But the interesting capabilities, location, IndexedDB, the clipboard, live in the browser. Here's a pattern that declares a tool's schema to Gemini and runs its body on the user's device, with no agent framework and the API key never leaving the server.
- 2026-07-09 — [Introduction to WebMCP](https://tpiros.dev/blog/building-with-webmcp.md): WebMCP lets a page hand structured tools to an in-browser agent instead of making it guess at your UI. I wired 22 tools into Watch Anchor; here's how the API works and what I learned.
- 2026-07-04 — [Graph memory for AI agents](https://tpiros.dev/blog/graph-memory-sqlite-gemini.md): How to give an agent a memory that stores the way facts connect and updates them when they change. A walk through extraction, entity resolution, time-ranged edges, and ranked recall, in about 150 lines of node:sqlite, sqlite-vec, and Gemini.
- 2026-06-30 — [MCP Apps](https://tpiros.dev/blog/build-an-mcp-app-interactive-ui-in-the-chat.md): For its first eighteen months MCP let a model call a tool and read the result back as text. That's a low ceiling the moment a user wants to sort, filter or drill into something. MCP Apps raise it: the server ships an actual interface into the chat. Here's how MCP got here, what the new proposal says, and a small app you can run in Claude Desktop, built on the official SDK and checked against the spec.
- 2026-06-25 — [Joining the Agentic AI Foundation as an ambassador](https://tpiros.dev/blog/joining-the-agentic-ai-foundation.md): I've been accepted into the Agentic AI Foundation's ambassador programme. Here's what the foundation is, why it matters that this work is happening in the open, and what I've actually signed up to do.
- 2026-06-22 — [Sparse vs Dense Retrieval: Why Your Search Doesn't Understand Synonyms](https://tpiros.dev/blog/rag-sparse-vs-dense-retrieval-why-your-search-does-not-understand-synonyms.md): If your retriever misses a relevant document because the user phrased their question differently than the document's author wrote the content, the LLM generates an answer with incomplete context. It doesn't hallucinate because it's confused, it hallucinates because it never saw the right information.
- 2026-06-19 — [AgentTool vs sub-agent delegation](https://tpiros.dev/blog/agent-tool-vs-coordinator-delegation.md): Two ways to give an agent help: a tool it calls and gets an answer back from, or a sub-agent it hands the whole turn to. Same data-agent, opposite control flow. When to reach for each, shown with a real NL2SQL-to-chart pipeline in Google ADK.
- 2026-06-16 — [What is Loop Engineering](https://tpiros.dev/blog/loop-engineering.md): Everyone is quoting "design loops that prompt your agents" and few can say what a loop actually is. Here's the plain version, plus the part the hype skips: the loop is the easy bit. What's hard is that it makes your understanding optional, and nothing in it tells you when you've stopped understanding what ships.
- 2026-06-12 — [Kitsune: a local-first agent runtime](https://tpiros.dev/blog/kitsune-local-first-agent-runtime.md): I built a managed-agent runtime that runs entirely on one laptop. In this post I show you how you can set it up.
- 2026-06-10 — [Build Your Own Agent Harness](https://tpiros.dev/blog/build-your-own-agent-harness.md): What an agent harness is, how you build one, and why it is where the work now lives. I start from a bare loop, break it on real tasks, and walk the five places every harness ends up reaching for.
- 2026-06-09 — [Agent Experience (AX) and the Agent Experience Interface (AXI): a working demo](https://tpiros.dev/blog/watching-an-agent-use-your-cli.md): A companion to my AX and AXI piece. I built one fictional CLI twice, once human-only and once agent-ready, pointed a small Google ADK agent at each, and watched what happened. With the interactive demo and the real numbers.
- 2026-06-04 — [Agent memory, end to end](https://tpiros.dev/blog/agent-memory-end-to-end.md): How AI agents remember across conversations: the layers of agent memory borrowed from cognitive science, and the techniques that make them work, from character-capped fact stores to compaction, hybrid retrieval, query expansion, and memory consolidation.
- 2026-06-01 — [Agent Experience (AX) and the Agent Experience Interface (AXI): a working guide](https://tpiros.dev/blog/agent-experience-ax-and-axi.md): What Agent Experience means, where AXI fits inside it, and what companies that take both seriously are actually changing about their products. With the official sources and the benchmark numbers.
- 2026-05-26 — [Content Credentials Hit Chrome: What Google's C2PA Expansion Actually Changes](https://tpiros.dev/blog/c2pa-content-credentials-google-expansion.md): Google brought SynthID and C2PA verification into Chrome and Search at I/O 2036. A grounded look at what Content Credentials actually do, what they don't, and what changes now that verification lives in the browser.
- 2026-05-07 — [What is agentic AI? A working definition for 2026](https://tpiros.dev/blog/what-is-agentic-ai-2026.md): A direct definition of agentic AI, what's actually shipping in production today, what isn't, and the five things worth building first. With specifics, citations, and an honest list of what doesn't work yet.
- 2026-04-28 — [The Agent-as-Tool Pattern](https://tpiros.dev/blog/agent-as-tool-pattern-gemini-space-crew.md): When reflection needs more than a fixed iteration count, let an LLM orchestrate. A Star Wars crew architect built with Google ADK that scouts, validates, and re-scouts until the crew holds up.
- 2026-04-20 — [The Coordinator Agent Pattern](https://tpiros.dev/blog/coordinator-agent-pattern-gemini-pokemon.md): When the shape of the request decides the shape of the work, let an LLM dispatch. An agent coordinator built with Google ADK that routes requests to sequential, parallel, and single sub-agent teams on the fly.
- 2026-04-14 — [Harness - A Local Managed Agent in Four Planes](https://tpiros.dev/blog/building-a-local-managed-agent-harness.md): Anthropic decoupled their agent into brain, hands, and session. I built a local TypeScript version in roughly 2,400 lines to see what the architecture actually feels like when you type it out.
- 2026-04-08 — [The Loop Agent Pattern](https://tpiros.dev/blog/loop-agent-pattern-gemini-playlist-curator.md): When one pass is not enough, let agents iterate. A playlist curator built with Google ADK that generates songs, verifies them against MusicBrainz, and refines until every track checks out.
- 2026-03-26 — [The Sequential Agent Pattern](https://tpiros.dev/blog/sequential-agent-pattern-gemini-quote-nerd.md): Chaining multiple specialised agents into a pipeline where each one builds on the last. Illustrated with a TypeScript CLI that fetches a quote, researches its author, and writes an inspiration card.
- 2026-03-17 — [The Parallel Agent Pattern](https://tpiros.dev/blog/parallel-agent-pattern-gemini-translation.md): When agents do not depend on each other, run them at the same time. Illustrated with a TypeScript translation pipeline built with Google ADK that translates a phrase into three languages simultaneously, then aggregates the results with Gemini.
- 2026-03-17 — [The Single Agent Pattern](https://tpiros.dev/blog/single-agent-pattern-gemini-google-maps.md): A look at the simplest agentic AI pattern: one model, one tool, zero orchestration. Illustrated with a tiny TypeScript agent built with the Google Agent Development Kit (ADK) that uses Gemini and Google Maps to review any place by name.
- 2026-03-03 — [Watch the Past Move: Animating Historic Photos with Gemini and Veo](https://tpiros.dev/blog/animating-old-photos-gemini-veo.md): What if you could take a dusty old black-and-white photograph and watch it come to life? In this post, I walk through a Node.js pipeline that colorises historic photos with Gemini and then animates them into video using Veo 3.1.
- 2026-02-20 — [Building a Historical Time Machine with Gemini and Google Maps](https://tpiros.dev/blog/gemini-maps-historic-images.md): Have you ever wondered what your favourite landmark looked like a hundred years ago? In this post, I walk you through a Node.js application that generates historically accurate photographs of any real-world location at any point in time, and even checks its own work for anachronisms.
- 2026-02-06 — [Why How You Split Your Documents Matters More Than You Think](https://tpiros.dev/blog/why-how-you-split-your-documents-matter-more-than-you-think.md): Before you reach for a more powerful embedding model or a larger context window, look at what you're actually feeding into a RAG pipeline. Sometimes the highest-leverage improvement isn't a better model but rather it's a better split.
- 2026-01-29 — [Filesystem as Context: Building an AI Detective with bash-tool](https://tpiros.dev/blog/filesystem-as-context-building-an-ai-detective-with-bash-tool.md): Instead of stuffing documents into prompts, give your AI agent a filesystem and let it retrieve its own context. Here's how, using a murder mystery detective as the demo.
- 2025-12-19 — [Building AI Agents with Google ADK: A Practical Guide](https://tpiros.dev/blog/google-agent-sdk-olliwander.md): Learn how to build multi-agent systems with vector search, tool orchestration, and semantic understanding using Google's Agent Development Kit (JS/TS version).
- 2025-12-02 — [MCP Workshop Answers for DevFest Taipei 2025](https://tpiros.dev/blog/mcp-workshop-devfest-taipei-2025-answers.md): These are the answers to the questions asked via Slido during my workshop on MCP at DevFest Taipei 2025.
- 2025-12-01 — [Detecting Hallucinations in Language Models with Natural Language Inference](https://tpiros.dev/blog/detecting-hallucinations-in-language-models-with-natural-language-inference.md): A practical look at why hallucinations occur in modern language models, why current evaluation methods make them persist, and how to detect them using Natural Language Inference in JavaScript.
- 2025-09-03 — [Making the Invisible Visible: The DevRel Value Model](https://tpiros.dev/blog/devrel-value-model.md): This article discusses a framework that makes DevRel's impact visible by translating community activities into weighted scores and theoretical ROI for leadership.
- 2025-07-21 — [The Importance of Precise Function Declarations for LLMs](https://tpiros.dev/blog/precise-function-declaration-llm.md): This article explores how clearly defined functions enable large language models to make accurate tool calls, emphasising the importance of precision and developer intent in the function calling process.
- 2025-07-09 — [Creating an MCP Client: Connecting LLMs to the Real World](https://tpiros.dev/blog/mcp-client.md): In this article, we walk through the process of building a Model Context Protocol (MCP) client. Learn how to connect to servers, discover tools, and invoke them from your own app or LLM integration.
- 2025-07-01 — [MCP Servers - The Bridge Between LLMs and Real-World Tools](https://tpiros.dev/blog/mcp-server.md): Model Context Protocol (MCP) servers expose tools, resources, and prompts to LLMs in a unified, structured way. This post explores how they work, how to build one, and why they are a critical part of the future AI stack.
- 2025-06-23 — [Consuming Streamed LLM Responses on the Frontend: A Deep Dive into SSE and Fetch](https://tpiros.dev/blog/streaming-llm-responses-a-deep-dive.md): Learn how to build a responsive, real-time user experience by consuming streamed Large Language Model responses on your frontend. This article provides a comprehensive guide to using both Server-Sent Events (SSE) and the Fetch API with Readable Streams, complete with code examples and a detailed comparison.
- 2025-06-16 — [Filling in the Blanks: Teaching AI to Inpaint](https://tpiros.dev/blog/filling-in-the-blanks-inpainting.md): A hands-on guide for exploring how to train a simple AI model using TensorFlow.js to inpaint missing parts of images - without needing large datasets or prior machine learning experience.
- 2025-06-09 — [Agentic AI: Multi-Agent Systems and Task Handoff](https://tpiros.dev/blog/multi-agent-systems-and-task-handoff.md): The final article in the Agentic AI series explores multi-agent systems: how specialised agents collaborate through structured handoffs to complete complex user goals.
- 2025-06-02 — [Understanding the Orchestrator-Worker Pattern](https://tpiros.dev/blog/understanding-the-orchestrator-worker-pattern.md): The orchestrator-worker pattern brings scalable structure to agentic AI workflows by cleanly separating high-level planning from specialised task execution. Through a practical trip planning example, this article demonstrates how LLMs can dynamically coordinate expert agents, grounded in schema-driven logic and real-world data.
- 2025-05-26 — [Building with Reflection: A Practical Agentic AI Workflow](https://tpiros.dev/blog/building-with-reflection-a-practical-agentic-ai-workflow.md): This article explores how to implement a reflection loop-an agentic AI pattern where a model generates, critiques, and iteratively improves its output - using image captioning as a practical example.
- 2025-05-19 — [Parallelisation as an Agentic Workflow](https://tpiros.dev/blog/parallelisation-as-an-agentic-workflow.md): Unlock faster, more diverse reasoning by running multiple LLM prompts in parallel and aggregating their responses into a single, cohesive output.
- 2025-05-15 — [How Transformers and LLMs Actually Work - A Developer's Guide with Code](https://tpiros.dev/blog/how-transformers-work.md): A hands-on walkthrough for web developers to demystify large language models by actually building a mini Transformer from scratch.
- 2025-05-13 — [Routing: Building Step-by-Step AI Reasoning](https://tpiros.dev/blog/routing-building-step-by-step-ai-reasoning.md): Explore how to intelligently route AI queries using schema-guided function calling and contextual categorisation.
- 2025-05-09 — [Prompt Chaining: Building Step-by-Step AI Reasoning](https://tpiros.dev/blog/prompt-chaining-building-step-by-step-ai-reasoning.md): Learn how prompt chaining enables AI to tackle complex tasks through step-by-step reasoning, boosting both accuracy and interpretability.
- 2023-09-25 — [LCP and low-entropy images](https://tpiros.dev/blog/low-entropy-lcp-mutationobserver.md): In this article we take a look at how to see if an image has low-entropy for LCP calculation.
- 2022-04-07 — [Compare how different image formats load on the web](https://tpiros.dev/blog/compare-image-loading-speeds.md): WebP, AVIF, JPEG XL, Progressive JPEG - how do these image formats compare in terms of their load speeds and how can we measure it? In this article we review a small app that gives us a visual answer.
- 2022-03-31 — [Google Chrome introduces a new Performance Insights panel](https://tpiros.dev/blog/chrome-performance-insights.md): A new performance insight panel has been added to Chrome which helps with tracking down performance bottlenecks in a much easier fashion compared to the classic performance panel
- 2021-12-08 — [call vs apply vs bind](https://tpiros.dev/blog/call-vs-apply-vs-bind.md): In this article we take a look at the differences between call(), apply() and bind().
- 2021-11-30 — [contains vs includes](https://tpiros.dev/blog/contains-vs-includes.md): This article explains the two, often mixed-up, contains and includes methods.
- 2021-11-17 — [slice vs splice](https://tpiros.dev/blog/slice-vs-splice.md): This article explains the two, often mixed-up, slice and splice methods.
- 2021-08-16 — [AVIF - Another Video based Image Format](https://tpiros.dev/blog/avif-another-video-based-image-format.md): In this article we take a look at AVIF - a next generation image format that was first introduced by Netflix and it promises optimised performance over the widely used and popular JPEG.
- 2021-07-14 — [Bring your C++ Application to the Web with Web Assembly](https://tpiros.dev/blog/bring-your-cplusplus-application-to-the-web-with-web-assembly.md): Web Assembly allows developers to bring existing applications written in languages such as C++ to the web, leveraging the combination of modern browsers and JavaScript. This article features a C++ application port to Web Assembly.
- 2021-06-07 — [Image Upload and Metadata Extraction with Netlify Functions](https://tpiros.dev/blog/image-upload-and-metadata-extraction-with-netlify-functions.md): This article discusses how to upload images using Netlify Functions, store them in Cloudinary and extract Exif metadata for further usage.
- 2021-05-22 — [Uploading and Displaying Videos with Next.js](https://tpiros.dev/blog/uploading-and-displaying-videos-with-nextjs.md): In this article we put together a project to demonstrate how to upload and display videos using Next.js
- 2021-05-11 — [Container Queries Meet AI-Based Cropping](https://tpiros.dev/blog/container-queries-meet-ai-based-cropping.md): The long-awaited CSS feature has finally landed behind a flag in Chrome Canary. In this article, we will take a look at an example of using them in conjunction with a clever, AI-based cropping solution from Cloudinary.
- 2021-04-27 — [Creating an Automated Social Share Card Using Cloudinary and Eleventy](https://tpiros.dev/blog/creating-an-automated-social-share-card-using-cloudinary-and-eleventy.md): Social share cards are a great addition to any website, however building them manually could be challenging. This article discusses how to create them in an automated way, and it also introduced a plugin that can be used with Eleventy.
- 2021-04-20 — [Three-State Light/Dark Theme Switch](https://tpiros.dev/blog/three-state-light-dark-theme-switch.md): Light and dark mode options are frequently added to websites; however, most solutions implement it as two-states, righteously. In this post, we'll take a look at a better, three-state approach.
- 2020-05-12 — [Understanding Lazy-Loading in Popular Frontend Frameworks](https://tpiros.dev/blog/understanding-lazy-loading-in-popular-frontend-frameworks.md): Lazy-loading is a concept that allows us to defer the loading of certain components to eliminate potential performance bottlenecks. This article discusses lazy-loading techniques for popular frontend frameworks.
- 2020-04-10 — [React, Videos and the Orientation API](https://tpiros.dev/blog/react-videos-and-the-orientation-api.md): This article discusses how to best optimise videos shot in landscape/portrait mode in a React environment using the Orientation API.
- 2020-03-16 — [Media Asset Management in the Jamstack](https://tpiros.dev/blog/media-asset-management-in-the-jamstack.md): What are the best ways to manage media assets for a Jamstack project? The aim of this article is to discuss your options.
- 2020-03-04 — [Create a custom colour replace component](https://tpiros.dev/blog/create-a-custom-colour-replace-component.md): Create a custom React component to do colour replacement using Cloudinary on your images.
- 2020-02-24 — [There's an API for that](https://tpiros.dev/blog/theres-an-api-for-that.md): The A in the Jamstack refers to APIs. In this post we take a look at how and why APIs matter for the Jamstack.
- 2020-02-17 — [The holy trinity of the CSS](https://tpiros.dev/blog/the-holy-trinity-of-the-css.md): Explaining the three basic CSS positioning models in order to understand the concept of CSS.
- 2020-01-28 — [Creating memes with Cloudinary](https://tpiros.dev/blog/creating-memes-with-cloudinary.md): Creating memes is always fun - in this article we take a look at how to utilise Cloudinary to generate themes for the Dolly Parton challenge.
- 2019-11-08 — [The Cornerstones of HTML](https://tpiros.dev/blog/the-cornerstones-of-html.md): Inspection of different pillar elements of HTML and the importance of them. Including topics like images, divs, forms, different tags and other key elements of HTML.
- 2019-11-04 — [The Importance of Media Accessibility (m16y)](https://tpiros.dev/blog/the-importance-of-media-accessibility-m16y.md): This article discusses how to make modern, visual websites more accessible for visitors having visual impairments. We have coined this 'media accessibility' or 'm16y'.
- 2019-10-02 — [Introduction to the Jamstack](https://tpiros.dev/blog/introduction-to-the-jamstack.md): The aim of this article is to introduce the Jamstack. What is it about? What benefits are there for those who use it? These are the questions we will answer while having an overview of some of the services that can be used under the umbrella of the stack.
- 2019-09-25 — [Using React Hooks with GraphQL](https://tpiros.dev/blog/using-react-hooks-with-graphql.md): Using React hooks with GraphQL means less boilerplate code for apps. Read more about it in this article.
- 2019-09-18 — [The three rendering musketeers: server-render, client-render and pre-render](https://tpiros.dev/blog/the-three-rendering-musketeers-server-render-client-render-and-pre-render.md): Today there are three popular rendering mechanism used: server-side rendering (SSR), client-side rendering (CSR) and pre-rendering. This article reviews how they differ from one to the other.
- 2019-09-09 — [What Is Isomorphic JavaScript?](https://tpiros.dev/blog/what-is-isomorphic-javascript.md): This article discusses isomorphic (universal) JavaScript and how it can be applied to a PWA without any frontend frameworks, relying only on vanilla JavaScript.
- 2019-09-03 — [Creating Progressive Web Apps with Vue](https://tpiros.dev/blog/creating-progressive-web-apps-with-vue.md): This article discusses how to create Progressive Web Apps using Vue.js (with the help of Workbox)
- 2019-08-27 — [Basic Internet Knowledge - Internet 101](https://tpiros.dev/blog/basic-internet-knowledge-internet-101.md): Useful informations for beginners, about how the workings of the internet, including topics such as IP addresses, webservers and more.
- 2019-08-21 — [Creating a Realtime PWA Using Angular and Firebase (Part 2)](https://tpiros.dev/blog/creating-a-realtime-pwa-using-angular-and-firebase-part-2.md): In this article we take a look at how to transform an application created using Angular & Firebase to function as a Progressive Web App.
- 2019-08-18 — [Thoughts about Web Development and Coding from a Newbie](https://tpiros.dev/blog/thoughts-about-web-development-and-coding-from-a-newbie.md): Thoughts about Web Development and Coding from a Newbie
- 2019-08-13 — [Creating a Realtime PWA Using Angular and Firebase (Part 1)](https://tpiros.dev/blog/creating-a-realtime-pwa-using-angular-and-firebase-part-1.md): In a series of articles we'll take a look at how to create a PWA using Angular, Firebase and Cloudinary.
- 2019-08-06 — [Using Decorators in JavaScript](https://tpiros.dev/blog/using-decorators-in-javascript.md): This article discusses decorators used in JavaScript.
- 2019-07-26 — [Optional Chaining Operator in JavaScript](https://tpiros.dev/blog/optional-chaining-operator-in-javascript.md): The Optional Chaining Operator in JavaScript allows developers to safely check for the existence of deep nested properties in objects.
- 2019-07-10 — [The future of JavaScript (ECMAScript 2019 and beyond)](https://tpiros.dev/blog/the-future-of-javascript-ecmascript-2019-and-beyond.md): In this article, we'll go through some of the features that are currently being considered to be added to JavaScript.
- 2019-07-01 — [Setting up a Headless CMS on a VPS using Clouding.io](https://tpiros.dev/blog/setting-up-a-headless-cms-on-a-vps-using-clouding-io.md): VPS - Virtual Private Servers - are hosted, virtual servers that we can rent from various providers. They have multiple benefits, including but not limited to stability, performance and flexibility.
- 2019-06-11 — [🍬Syntactic sugar, diabetes alert🚨](https://tpiros.dev/blog/syntactic-sugar-diabetes-alert.md): Syntactic sugar is everywhere in JavaScript. Most will say it's JUST syntactic sugar - a tiny bit of candy that makes your coding life sweeter. Well, is it? A little bit of sugar here, a bit there… and before we know it, we already need an insulin shot.
- 2019-05-24 — [Serve an Angular app on localhost via HTTPS](https://tpiros.dev/blog/serve-an-angular-app-on-localhost-via-https.md): Enabling HTTPS support via the Angular CLI is really straight forward, however generating a trusted certificate can be tricky. This article discusses how to achieve HTTPS on localhost for Angular applications.
- 2019-03-25 — [ES6 — Set vs Array — What and when?](https://tpiros.dev/blog/es6-set-vs-array-what-and-when.md): Some can argue that Set has more advantages compared to Array. Others may wonder why there is a need for Set now (we have been doing pretty well without one until now). What exactly differs these two and when to use one over the other?
- 2019-03-07 — [404 after refreshing the browser for Angular / Vue.js app](https://tpiros.dev/blog/404-after-refreshing-the-browser-for-angular-vue-js-app.md): This article discusses how to add utilise HTML5 style navigation for both Angular and Vue.js applications, and how to implement server side URL rewriting for full functionality.
- 2019-02-26 — [Retrieve only queried element in an object array in MongoDB collection](https://tpiros.dev/blog/retrieve-only-queried-element-in-an-object-array-in-mongodb-collection.md): In this 'Quick Tip' article, we review how to retrieve only the queried element in an object of arrays in MongoDB.
- 2019-02-18 — [An Overview of ES2015 (ES6) Modules](https://tpiros.dev/blog/an-overview-of-es2015-es6-modules.md): This article focuses on the current state of Modules in the JavaScript ecosystem
- 2019-02-11 — [Remove unused CSS / JavaScript code from your project](https://tpiros.dev/blog/remove-unused-css-javascript-code-from-your-project.md): This article discusses how to run code coverage checks in Chrome DevTools as well as via Puppeteer in an automated way.
- 2019-02-05 — [A Cloudinary plugin for Workbox.js](https://tpiros.dev/blog/a-cloudinary-plugin-for-workbox.md): In this article we review how to adaptively cache images based on network speed with Workbox.js via a custom plugin.
- 2019-02-05 — [Adaptive image caching based on network speed with Workbox.js](https://tpiros.dev/blog/adaptive-image-caching-based-on-network-speed-with-workbox-js.md): In this article we review how to adaptively cache images based on network speed with Workbox.js and Cloudinary.
- 2019-01-21 — [Image management via GraphQL](https://tpiros.dev/blog/image-management-via-graphql.md): In this article, we take a look at how to manage images using GraphQL.
- 2019-01-16 — [Symbol, Iterator and Generator in JavaScript](https://tpiros.dev/blog/symbol-iterator-and-generator-in-javascript.md): In this article, we'll take a look at Symbols, Iterators and Generators in JavaScript (ES2015) and we'll also implement an interesting example of using all three technologies.
- 2019-01-09 — [Capturing user input in a Node.js application](https://tpiros.dev/blog/capturing-user-input-in-a-node-js-application.md): This article discusses how to create an application in Node.js that will await input from a user via the readline built-in module.
- 2019-01-03 — [Introduction to Serverless (FaaS)](https://tpiros.dev/blog/introduction-to-serverless-faas.md): In this article we are reviewing Serverless architectures, with a focus on Function-As-A-Service and we also take a look at an example implementation of FaaS
- 2018-12-12 — [How to pass command line arguments to a Node.js app?](https://tpiros.dev/blog/how-to-pass-command-line-arguments-to-a-node-js-app.md): In this article, we'll take a look at how to pass command line arguments to a Node.js application executing from the CLI.
- 2018-12-03 — [Add Material Design to an Angular application](https://tpiros.dev/blog/add-material-design-to-an-angular-application.md): This article reviews how to add and utilise Material Design within an Angular application.
- 2018-11-26 — [Add Bootstrap to an Angular application](https://tpiros.dev/blog/add-bootstrap-to-an-angular-application.md): This article discusses how to integrate Bootstrap with an Angular project in three ways - using Bootstrap natively, via ng-bootstrap as well as ngx-bootstrap.
- 2018-11-05 — [What is an opaque response?](https://tpiros.dev/blog/what-is-an-opaque-response.md): In this article, we'll take a look at the mysterious 'opaque response' and learn what it means.
- 2018-10-15 — [Image Management in Ghost - A performance report](https://tpiros.dev/blog/image-management-in-ghost-a-performance-report.md): This article draws a comparison between the built-in Ghost Image Management and a third party Image Management solution including a performance comparison.
- 2018-10-08 — [Loading data before components in Angular](https://tpiros.dev/blog/loading-data-before-components-in-angular.md): In this article, we'll review a few ways to make sure that data is available for a component before we load it and display it in the application to the user.
- 2018-10-02 — [What's new in HTML 5.2 and HTML 5.3?](https://tpiros.dev/blog/whats-new-in-html-5-2-and-html-5-3.md): In this article, we'll review the latest proposed additions to HTML - more precisely we'll discuss HTML 5.2 and HTML 5.3.
- 2018-09-27 — [Deprecation Warnings in MongoDB's Node.js API](https://tpiros.dev/blog/deprecation-warnings-in-mongodbs-node-js-api.md): This article shows how to fix some of the deprecation warnings after updating to MongoDB 4 as well as using the MongoDB Node.js 3.x API.
- 2018-09-17 — [Adaptive image loading based on network speed](https://tpiros.dev/blog/adaptive-image-loading-based-on-network-speed.md): In this article, we'll explore a concept based on Network Information API, Service Workers and Cloudinary to enable web applications to serve lower quality images (if necessary) in order to speed up the perceptual load time of the web app.
- 2018-09-13 — [Sharing a MongoDB connection in Node.js/Express](https://tpiros.dev/blog/sharing-a-mongodb-connection-in-node-js-express.md): This article covers how to share a MongoDB database connection in a Node.js/Express application in the right way.
- 2018-09-05 — [RESTful API Design - POST vs PUT vs PATCH](https://tpiros.dev/blog/restful-api-design-post-vs-put-vs-patch.md): In this blog post we'll not only explore these differences but also discuss idempotent and safe HTTP methods.
- 2018-08-30 — [RESTful API Design - The basics](https://tpiros.dev/blog/restful-api-design-the-basics.md): In this article, we'll take a look at some of the basics of REST APIs and design such APIs, in the context of Node.js and Express.
- 2018-08-21 — [Use Angular Custom Element in Vue.js](https://tpiros.dev/blog/use-angular-custom-element-in-vue-js.md): In this article, we'll now see how to use such custom elements outside Angular and in a supposedly competing framework, Vue.js.
- 2018-08-18 — [Create and use Custom Elements with Angular](https://tpiros.dev/blog/create-and-use-custom-elements-with-angular.md): In this article, we'll take a look at the new custom elements feature in Angular6. We will see how to create a custom element as well as how to reuse it in a simple application.
- 2018-08-13 — [res.json() vs res.send() vs res.end() in Express](https://tpiros.dev/blog/res-json-vs-res-send-vs-res-end-in-express.md): In this article we are discussing the differences between the json(), send() and end() methods available as part of Express response object.
- 2018-08-06 — [Introduction to GraphQL](https://tpiros.dev/blog/introduction-to-graphql.md): In this article, we'll take a look at GraphQL and go through a basic example while exploring why it's a great supplement for REST APIs.
- 2018-07-17 — [Concurrent HTTP connections in Node.js](https://tpiros.dev/blog/concurrent-http-connections-in-node-js.md)
- 2018-07-03 — [Why shouldn't JSONP​ be used?](https://tpiros.dev/blog/why-jsonp-shouldnt-be-used.md): JSONP is could be considered to be a useful way to avoid CORS errors however it has more cons than pros - this article discusses the most important factors.
- 2018-06-26 — [Display real-time data in Angular](https://tpiros.dev/blog/display-real-time-data-in-angular.md): In this article, we'll be taking a look at two ways to display real-time data in an Angular application - one using a timeout and the other using sockets.
- 2018-06-21 — [Unsubscribe from Angular/RxJS subscription](https://tpiros.dev/blog/unsubscribe-from-angular-rxjs-subscription.md): In this article, we are discussing when it is required to unsubscribe from an observable in Angular to avoid memory leaks.
- 2018-06-12 — [Blockchain implementation using JavaScript](https://tpiros.dev/blog/blockchain-implementation-using-javascript.md): In this article, we are implementing a blockchain solution using JavaScript and while implementing, getting familiar with this emerging technology.
- 2018-06-06 — [HTML Attributes vs DOM Properties](https://tpiros.dev/blog/html-attributes-vs-dom-properties.md): When working with various JavaScript frameworks, or only just by working in the field of web development, newcomers and novice developers often confuse attributes and properties concerning HTML pages. In this article, we'll clarify the difference between these two.
- 2018-05-29 — [Hiding / removing elements in DOM using JavaScript](https://tpiros.dev/blog/hiding-removing-elements-in-dom-using-javascript.md): In this article, we'll take a look at how to hide and remove elements in DOM by using JavaScript, and we'll learn a few techniques and explain the differences between them.
- 2018-05-28 — [Progressive Web Applications - Free Handbook](https://tpiros.dev/blog/progressive-web-applications-free-handbook.md)
- 2018-05-24 — [What's new in Angular 6?](https://tpiros.dev/blog/whats-new-in-angular-6.md): In this article we are discussing the changes involved with the latest relase of the popular frontend framework by Google, Angular 6.
- 2018-05-08 — [Caching HTTP requests with Angular](https://tpiros.dev/blog/caching-http-requests-with-angular.md): ​Often when working with Angular applications, we make HTTP requests to access data from an API. Sometimes we are making requests to the same API endpoint in which case it'd make sense to cache the result of the response to avoid further requests.
- 2018-05-02 — [Using Next.js and Auth0](https://tpiros.dev/blog/using-next-js-and-auth0.md): Server-side rendering is an exciting​ concept especially when authentication is also part of an application. In this article, we take a look at how to achieve authentication using SSR.
- 2018-04-25 — [Quién es full stack (web) developer?](https://tpiros.dev/blog/quien-es-full-stack-web-developer.md): En este artículo vamos a tratar de responder una pregunta muy importante: quién es un desarrollador full stack?
- 2018-04-20 — [Binding HTML with Angular](https://tpiros.dev/blog/binding-html-with-angular.md): In this article we are reviewing what it takes to render HTML content inside Angular templates, including a word of caution regarding unsafe content.
- 2018-04-12 — [constructor vs ngOnInit in Angular](https://tpiros.dev/blog/constructor-vs-ngoninit-in-angular.md): A frequently asked question in Angular2+ is the difference between constructor() and ngOnInit() inside components. This article gives an answer.
- 2018-04-04 — [How to find the version of an installed npm package?](https://tpiros.dev/blog/how-to-find-the-version-of-an-installed-npm-package.md): In this article we are reviewing three ways to get the version numbers of local or global npm packages installed.
- 2018-03-29 — [How to read environment variables in Node.js?](https://tpiros.dev/blog/how-to-read-environment-variables-in-node-js.md): Storing secrets, usernames and passwords can be done in Node.js via environment variables. We'll take a look at how to manage these in this article.
- 2018-03-20 — [Typescript: Interfaces vs Types](https://tpiros.dev/blog/typescript-interfaces-vs-types.md): Interfaces and type aliases both offer contracts to fulfil in TypeScript code. At first they may look the same however there are some key differences between the two.
- 2018-03-11 — [Cannot redeclare block-scoped variable 'name'](https://tpiros.dev/blog/cannot-redeclare-block-scoped-variable-name.md): In this article we take a look at how to resolve the "[ts] Cannot redeclare block-scoped variable 'name'." error raised by TypeScript.
- 2018-03-05 — [Unsupervised Machine Learning with JavaScript](https://tpiros.dev/blog/unsupervised-machine-learning-with-javascript.md): In this article we are taking a look at an unsupervised machine learning and using it we'll cluster our sample dataset.
- 2018-02-28 — ['Unexpected Token Export' error](https://tpiros.dev/blog/unexpected-token-export-error.md): When trying to utilise the ES2015 export/import statements (aka ES2015 module syntax) in Node.js we are presented with the 'Unexpected Token Export' error. There's a reason why this error appears and in this article we'll investigate why this is happening.
- 2018-02-19 — [Question mark in Angular expressions](https://tpiros.dev/blog/question-mark-in-angular-expression.md): Angular comes with a safe navigation operator that guards against 'null' and 'undefined' values in property paths.
- 2018-02-13 — [How do you extract POST data in Node.js?](https://tpiros.dev/blog/how-do-you-extract-post-data-in-node-js.md): Often times when working with Node.js based web applications we are faced with an option to handle data sent from a form. In this article we'll take a look at how to extract POST data in Node.js
- 2018-02-06 — [File upload with Angular and Restify (Tutorial)](https://tpiros.dev/blog/file-upload-with-angular-and-restify-tutorial.md): In this tutorial we'll learn how to upload files from an Angular5 application to a Node.js REST API that runs using Restify. For the file upload functionality we'll use the File Web API, without relying on a third party component.
- 2018-01-29 — [Natural Language Processing with NoSQL and JavaScript](https://tpiros.dev/blog/natural-language-processing-with-nosql-and-javascript.md): In this article we are taking a look at how to apply a branch of Machine Learning - Natural Language Processing - to do sentiment analysis on unstructured text with JavaScript and NoSQL.
- 2018-01-23 — [Angular - Http vs HttpClient](https://tpiros.dev/blog/angular-http-vs-httpclient.md): A new, more robust HttpClient is available as of Angular 4.3. In this article we are discussing its main changes with code examples.
- 2018-01-15 — [Securing a REST API](https://tpiros.dev/blog/securing-a-rest-api.md): In this article we are discussing how to secure a REST API using JWT (JSON Web Tokens).
- 2018-01-08 — [Angular - Promise vs Observable](https://tpiros.dev/blog/angular-promise-vs-observable.md): An article explaining the differences between Promises and Observables in Angular.
- 2018-01-02 — [Factory Pattern in TypeScript](https://tpiros.dev/blog/factory-pattern-in-typescript.md): This article discusses how to apply the Factory Pattern in a TypeScript environment
- 2017-12-28 — [What is semantic versioning?](https://tpiros.dev/blog/what-is-semantic-versioning.md): In this article we are discussing what semantic versioning is.
- 2017-12-22 — [Async/await in Node.js](https://tpiros.dev/blog/async-await-in-node-js.md): `async/await` is a great way to create asynchronous code and Node.js now supports these operators out of the box.
- 2017-12-18 — [Façade Pattern in TypeScript](https://tpiros.dev/blog/facade-pattern-in-typescript.md)
- 2017-12-17 — [What's new in Express 5?](https://tpiros.dev/blog/whats-new-in-express-5.md): Express, the most used web server for Node.js has a new release coming out soon. In this article we discuss the changes Express 5 will bring.
- 2017-12-12 — [Abstraction in TypeScript](https://tpiros.dev/blog/abstraction-in-typescript.md): Abstraction is an Object Oriented programming concept to hide complexity and in TypeScript we can make use of this via the abstract keyword.
- 2017-12-11 — [Adapter pattern in TypeScript](https://tpiros.dev/blog/adapter-pattern-in-typescript.md): Design patterns help us to design better software and write better code. Learn how to use the Adapter pattern with TypeScript in this article.
- 2017-12-08 — [Resolving Error: Uncaught (in promise): EmptyError: no elements in sequence](https://tpiros.dev/blog/error-uncaught-in-promise-emptyerror-no-elements-in-sequence.md): In this article we'll see how to fix the `Error: Uncaught (in promise): EmptyError: no elements in sequence` error caused by the Angular router.
- 2017-12-06 — [Singleton Pattern in TypeScript](https://tpiros.dev/blog/singleton-pattern-in-typescript.md): Design patterns help us to design better software and write better code. Learn how to use the Singleton patternwith TypeScript in this article.
- 2017-12-05 — [Resolving 'Can't bind to 'ngFor' since it isn't a known property of 'element'' error in Angular](https://tpiros.dev/blog/resolving-cant-bind-to-ngfor-since-it-isnt-a-known-property-of-element-error-in-angular.md): Read how you can potentially fix the 'can't bind to ngFor since it's not a known property of 'element' error.
- 2017-12-04 — [Resolving 'import is blacklisted' tslint error for RxJS and Angular](https://tpiros.dev/blog/resolving-import-is-blacklisted-tslint-error-for-rxjs-and-angular.md): Read how to fix the 'This import is blacklisted, import a submodule instead' tslint error for RxJS and Angular.
- 2017-12-04 — [Using Jasmine with JavaScript](https://tpiros.dev/blog/using-jasmine-with-javascript-es2015.md): Testing is an important aspect of development and in this article we'll take a look at how to add Jasmine unit tests to a JavaScript (ES6 / ES2015) code.
- 2017-11-30 — [What is CORS?](https://tpiros.dev/blog/what-is-cors.md): Cross-Origin Resources Sharing (CORS) is a security protocol implemented by browsers. See how to avoid running into CORS errors via this article.
- 2017-11-29 — [Debugging TypeScript in the browser](https://tpiros.dev/blog/debugging-typescript-in-the-browser.md): Using source maps it's possible to debug TypeScript code directly in the browser even after transpilation.
- 2017-11-28 — [Introduction to RxJS and Observables](https://tpiros.dev/blog/introduction-to-rxjs-and-observables.md): What is RxJS and what are observables? A gentle introduction to these terms and the technology that drives them.
- 2017-11-27 — [Promises in JavaScript](https://tpiros.dev/blog/promises-in-javascript.md): Promises in JavaScript are a powerful concept that allow us to write asynchronous code in a synchronous fashion with better error handling than callbacks.
- 2017-11-23 — [Arrays and Objects in ES2015](https://tpiros.dev/blog/arrays-and-objects-in-es2015.md): A range of new capabilities have been added to JavaScript with ES2015 that helps us work with arrays and objects.
- 2017-11-22 — [Generics in TypeScript](https://tpiros.dev/blog/generics-in-typescript.md): TypeScript introduces Generics which allow us to use reusable components within our applications with ease.
- 2017-11-21 — [Functions in TypeScript](https://tpiros.dev/blog/functions-in-typescript.md): Functions in TypeScript work in exactly the same way as functions in ES2015, allowing us to use rest and default params and fat arrow functions in combination with data types.
- 2017-11-20 — [Rest Parameters, Spread Operator and Default parameters for Functions](https://tpiros.dev/blog/default-function-parameters.md): Rest Parameters, Spread Operator and default parameters for Functions are all great additions for JavaScript ES2015.
- 2017-11-17 — [Template Literals in ES2015](https://tpiros.dev/blog/template-literals-in-es2015.md)
- 2017-11-15 — [Promise anti-pattern](https://tpiros.dev/blog/promise-anti-pattern.md): JavaScript promises have an important anti-pattern when it comes to using .then() with an error handler versus when using .catch() for handling errors.
- 2017-11-14 — [Classes in TypeScript](https://tpiros.dev/blog/classes-in-typescript.md): Classes in TypeScript really extend JavaScript's (ES2015) class functionality and add their support for types and member access.
- 2017-11-13 — [Classes in ECMAScript 2015](https://tpiros.dev/blog/classes-in-ecmascript-2015.md): If you have worked with JavaScript before you may have heard the expression 'prototypal inheritance' or that JavaScript is a 'prototype' based language. As of ES2015 we can use the class keyword which adds syntactic sugar over the prototypes.
- 2017-11-10 — [Declaring variables in ECMAScript 2015](https://tpiros.dev/blog/declaring-variables-in-ecmascript-2015.md): The way you have defined variables in JavaScript for the past decade has always been the same – by using the `var` keyword. In the latest version of JavaScript (ES2015) you can declare variables using let and const.'
- 2017-11-09 — [Functions in JavaScript](https://tpiros.dev/blog/functions-in-javascript-es2015.md): The latest version of JavaScript (ES2015) allows us to write functions in a different way by using the arrow function syntax. This not only allows for terser function declarations but also has additional benefits.
- 2017-11-07 — [Interfaces in TypeScript](https://tpiros.dev/blog/interfaces-in-typescript.md): Interfaces provide a very powerful way of to define entities that most conform a definition – in other words it allows us to specify properties for entities.
- 2017-11-06 — [Types in TypeScript](https://tpiros.dev/blog/data-types-in-typescript.md): TypeScript uses data typing which is one of it's most important features for allowing developers to write better code.
- 2017-11-05 — [Introduction to TypeScript](https://tpiros.dev/blog/introduction-to-typescript.md): TypeScript is a language developed by Microsoft that, among other things, has type support. In this article we'll discover its basics including how to setup your environment to work with this language.
- 2016-09-15 — [MarkLogic Node.js API -- Working with Binary Documents](https://tpiros.dev/blog/marklogic-node-js-api-working-with-binary-documents.md)
- 2016-05-10 — [Arrow functions in ES6 / ES2015](https://tpiros.dev/blog/arrow-functions-in-es6-es2015.md)
- 2016-05-04 — [Performance monitoring using Node.js, socket.io and MarkLogic](https://tpiros.dev/blog/performance-monitoring-using-node-js-socket-io-and-marklogic.md)
- 2016-05-03 — [Getting started with Ionic](https://tpiros.dev/blog/getting-started-with-ionic.md)
- 2016-05-01 — [Performance monitoring using Node.js, socket.io and MarkLogic - Historical reporting](https://tpiros.dev/blog/performance-monitoring-using-node-js-socket-io-and-marklogic-historical-reporting.md)
- 2016-01-19 — [How is MarkLogic different from MongoDB?](https://tpiros.dev/blog/how-is-marklogic-different-from-mongodb.md)
- 2015-04-29 — [React components with ES6](https://tpiros.dev/blog/react-with-es6.md)
- 2015-03-18 — [Geospatial SPA using JavaScript only - part 2](https://tpiros.dev/blog/geospatial-spa-using-javascript-only-part-2.md)
- 2015-02-16 — [Geospatial SPA using JavaScript only - part 1](https://tpiros.dev/blog/geospatial-spa-using-javascript-only-part-1.md)
- 2015-02-08 — [JavaScript in a NoSQL database](https://tpiros.dev/blog/javascript-in-a-nosql-database.md)
- 2015-02-08 — [MarkLogic and Node.js](https://tpiros.dev/blog/marklogic-and-node-js.md)
- 2015-01-25 — [Docker running Node.js on Mac OS X](https://tpiros.dev/blog/docker-running-node-js-on-mac-os-x.md)
- 2014-10-19 — [WebCamp Zagreb 2014](https://tpiros.dev/blog/webcamp-zagreb-2014.md)
- 2014-09-12 — [Node.js/Express CORS implementation](https://tpiros.dev/blog/node-jsexpress-cors-implementation.md)
- 2014-08-29 — [Introduction to node.js - Workshop](https://tpiros.dev/blog/introduction-to-node-js-workshop.md)
- 2014-08-27 — [HTML5 Dev Conf](https://tpiros.dev/blog/html5-dev-conf.md)
- 2014-08-27 — [JSConf Asia](https://tpiros.dev/blog/jsconf-asia.md)
- 2014-08-27 — [MK Geek Night](https://tpiros.dev/blog/mk-geek-night.md)
- 2014-08-27 — [WebCamp Zagreb](https://tpiros.dev/blog/webcamp-zagreb.md)
- 2014-05-05 — [<x-discover> - Geo Location based custom Polymer element](https://tpiros.dev/blog/x-discover-geo-location-based-custom-polymer-element.md)
- 2014-04-10 — [SPDY](https://tpiros.dev/blog/spdy.md)
- 2014-03-13 — [AngularChat](https://tpiros.dev/blog/angularchat.md)
- 2014-02-25 — [Taking custom Polymer element <x-flickr> to the next level](https://tpiros.dev/blog/taking-custom-polymer-element-x-flickr-to-the-next-level.md)
- 2014-02-20 — [Updated MEAN Contact Manager](https://tpiros.dev/blog/updated-mean-contact-manager.md)
- 2014-02-20 — [<x-flickr> - custom Polymer element](https://tpiros.dev/blog/x-flickr-custom-polymer-element.md)
- 2014-01-23 — [Deploying a Node.js/socket.io app to Openshift](https://tpiros.dev/blog/deploying-a-node-jssocket-io-app-to-openshift.md)
- 2014-01-13 — [Deploy Node.js & MongoDB app to AppFog](https://tpiros.dev/blog/deploy-node-js-mongodb-app-to-appfog.md)
- 2014-01-10 — [Bug fix in chat application](https://tpiros.dev/blog/bug-fix-in-chat-application.md)
- 2014-01-04 — [Replacing Express with Koa - an experimental REST API](https://tpiros.dev/blog/replacing-express-with-koa.md)
- 2013-12-27 — [Further additions to the Node.js/socket.io chat app](https://tpiros.dev/blog/further-additions-to-the-node-jssocket-io-chat-app.md)
- 2013-12-21 — [Node.js & Socket.io chat app with GeoLocation and User Agent support](https://tpiros.dev/blog/node-jssocket-io-chat-app-with-geolocation-and-user-agent-support.md)
- 2013-12-12 — [Twitter GeoTrending app using Node.js and AngularJS](https://tpiros.dev/blog/twitter-geotrending-app-using-node-js-and-angularjs.md)
- 2013-12-03 — [Web Speech API for a Node.js/Socket.io chat app](https://tpiros.dev/blog/web-speech-api-for-a-node-jssocket-io-chat-app.md)
- 2013-11-28 — [Introduction to Grunt](https://tpiros.dev/blog/introduction-to-grunt.md)
- 2013-11-20 — [Goodbye WordPress, Hello Ghost](https://tpiros.dev/blog/goodbye-wordpress-hello-ghost.md)
- 2013-11-19 — [MongoDB for DBAs](https://tpiros.dev/blog/mongodb-for-dbas.md)
- 2013-11-07 — [Online Card Game with Node.js and Socket.io – Episode 7](https://tpiros.dev/blog/online-card-game-with-node-js-and-socket-io-episode-7.md)
- 2013-10-28 — [HTML5 Developers Conference – Day 2](https://tpiros.dev/blog/html5-developers-conference-day-2.md)
- 2013-10-26 — [Chat 2.0 - an upgraded chat written in node.js and socket.io](https://tpiros.dev/blog/chat-2-0-supercharged-chat-written-in-node-js-and-socket-io.md)
- 2013-10-25 — [HTML5 Developers Conference - Day 1](https://tpiros.dev/blog/html5-developers-conference-day-1.md)
- 2013-10-08 — [Custom AngularJS filter to determine credit card type](https://tpiros.dev/blog/custom-angularjs-filter-to-determine-credit-card-type.md)
- 2013-10-04 — [MongoDB for NodeJS Developers](https://tpiros.dev/blog/mongodb-for-nodejs-developers.md)
- 2013-09-23 — [Mastering Web Application Development with AngularJS - Book Review](https://tpiros.dev/blog/mastering-web-application-development-with-angularjs-book-review.md)
- 2013-09-19 — [What is the MEAN stack?](https://tpiros.dev/blog/what-is-the-mean-stack.md)
- 2013-09-12 — [Geospatial features of MongoDB](https://tpiros.dev/blog/geospatial-features-of-mongodb.md)
- 2013-09-04 — [Visit @ Mongo HQ in London](https://tpiros.dev/blog/visit-mongo-hq-in-london.md)
- 2013-09-03 — [Converting your data from MySQL to MongoDB](https://tpiros.dev/blog/converting-your-data-from-mysql-to-mongodb.md)
- 2013-08-26 — [MongoDB vs MySQL (aka MEAN vs LAMP) for a Big Data project](https://tpiros.dev/blog/mongodb-vs-mysql-aka-mean-vs-lamp-for-a-big-data-project.md)
- 2013-08-21 — [Using Bower, npm and updates to AngularJS](https://tpiros.dev/blog/using-bower-npm-and-updates-to-angularjs.md)
- 2013-08-13 — [Online Card Game with Node.js and Socket.io – Episode 6](https://tpiros.dev/blog/online-card-game-with-node-js-and-socket-io-episode-6.md)
- 2013-08-08 — [grep types](https://tpiros.dev/blog/grep-types.md)
- 2013-08-04 — [Automatic SCP using expect and bash](https://tpiros.dev/blog/automatic-scp-using-expect-and-bash.md)
- 2013-07-29 — [angularFire - bug in angularFireAuth](https://tpiros.dev/blog/angularfire-bug-in-angularfireauth.md)
- 2013-07-23 — [AngularJS + Firebase = angularFire](https://tpiros.dev/blog/angularjs-firebase-angularfire.md)
- 2013-07-18 — [Contact Manager 2.0](https://tpiros.dev/blog/contact-manager-2-0.md)
- 2013-07-16 — [Advanced chat using node.js and socket.io – Episode 2](https://tpiros.dev/blog/advanced-chat-using-node-js-and-socket-io-episode-2.md)
- 2013-07-15 — [Advanced chat using node.js and socket.io - Episode 1](https://tpiros.dev/blog/advanced-chat-using-node-js-and-socket-io-episode-1.md)
- 2013-07-04 — [Contact Manager – written in AngularJS, Express and MongoDB – Episode 3](https://tpiros.dev/blog/contact-manager-written-in-angularjs-express-and-mongodb-episode-3.md)
- 2013-07-01 — [Contact Manager – written in AngularJS, Express and MongoDB – Episode 2](https://tpiros.dev/blog/contact-manager-written-in-angularjs-express-and-mongodb-episode-2.md)
- 2013-06-27 — [Contact Manager - written in AngularJS, Express and MongoDB - Episode 1](https://tpiros.dev/blog/contact-manager-written-in-angularjs-express-and-mongodb-episode-1.md)
- 2013-06-20 — [Online Card Game with Node.js and Socket.io – Episode 5](https://tpiros.dev/blog/online-card-game-with-node-js-and-socket-io-episode-5.md)
- 2013-06-12 — [Online Card Game with Node.js and Socket.io – Episode 4](https://tpiros.dev/blog/online-card-game-with-node-js-and-socket-io-episode-4.md)
- 2013-06-01 — [Online Card Game with Node.js and Socket.io - Episode 3](https://tpiros.dev/blog/online-card-game-with-node-js-and-socket-io-episode-3.md)
- 2013-05-28 — [Inline editing with AngularJS](https://tpiros.dev/blog/inline-editing-with-angularjs.md)
- 2013-05-19 — [Simple Chat application using node.js and socket.io](https://tpiros.dev/blog/simple-chat-application-using-node-js-and-socket-io.md)
- 2013-05-09 — [Online card game with node.js and socket.io - episode 2](https://tpiros.dev/blog/online-card-game-with-node-js-and-socket-io-episode-2.md)
- 2013-04-30 — [Online card game with node.js and socket.io - Episode 1](https://tpiros.dev/blog/online-card-game-with-node-js-and-socket-io-episode-1.md)
- 2013-04-26 — [Automatic Virtual Machine Creation from command line in VMware's ESXi](https://tpiros.dev/blog/automatic-virtual-machine-creation-from-command-line-in-vmwares-esxi.md)
- 2013-04-23 — [Facebook Graph API's multiple privacy options](https://tpiros.dev/blog/facebook-graph-apis-multiple-privacy-options.md)
- 2013-04-21 — ['Evernoting' from the command line](https://tpiros.dev/blog/evernoting-from-the-command-line.md)
- 2013-04-11 — [C# Disable CTRL-ALT-DEL, ALT-TAB, ALT-F4, Start Menu and so on...](https://tpiros.dev/blog/c-disable-ctrl-alt-del-alt-tab-alt-f4-start-menu-and-so-on.md)
- 2013-04-11 — [What is wrong with technology recruitment?](https://tpiros.dev/blog/what-is-wrong-with-technology-recruitment.md)
