Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
150620 stories
·
33 followers

Getting Started with Foundry Local: A Student Guide to the Microsoft Foundry Local Lab

1 Share

If you want to start building AI applications on your own machine, the Microsoft Foundry Local Lab is one of the most useful places to begin. It is a practical workshop that takes you from first-time setup through to agents, retrieval, evaluation, speech transcription, tool calling, and a browser-based interface. The material is hands-on, cross-language, and designed to show how modern AI apps can run locally rather than depending on a cloud service for every step.

This blog post is aimed at students, self-taught developers, and anyone learning how AI applications are put together in practice. Instead of treating large language models as a black box, the lab shows you how to install and manage local models, connect to them with code, structure tasks into workflows, and test whether the results are actually good enough. If you have been looking for a learning path that feels more like building real software and less like copying isolated snippets, this workshop is a strong starting point.

What Is Foundry Local?

Foundry Local is a local runtime for downloading, managing, and serving AI models on your own hardware. It exposes an OpenAI-compatible interface, which means you can work with familiar SDK patterns while keeping execution on your device. For learners, that matters for three reasons. First, it lowers the barrier to experimentation because you can run projects without setting up a cloud account for every test. Second, it helps you understand the moving parts behind AI applications, including model lifecycle, local inference, and application architecture. Third, it encourages privacy-aware development because the examples are designed to keep data on the machine wherever possible.

The Foundry Local Lab uses that local-first approach to teach the full journey from simple prompts to multi-agent systems. It includes examples in Python, JavaScript, and C#, so you can follow the language that fits your course, your existing skills, or the platform you want to build on.

Why This Lab Works Well for Learners

A lot of AI tutorials stop at the moment a model replies to a prompt. That is useful for a first demo, but it does not teach you how to build a proper application. The Foundry Local Lab goes further. It is organised as a sequence of parts, each one adding a new idea and giving you working code to explore. You do not just ask a model to respond. You learn how to manage the service, choose a language SDK, construct retrieval pipelines, build agents, evaluate outputs, and expose the result through a usable interface.

That sequence is especially helpful for students because the parts build on each other. Early labs focus on confidence and setup. Middle labs focus on architecture and patterns. Later labs move into more advanced ideas that are common in real projects, such as tool calling, evaluation, and custom model packaging. By the end, you have seen not just what a local AI app looks like, but how its different layers fit together.




Before You Start

The workshop expects a reasonably modern machine and at least one programming language environment. The core prerequisites are straightforward: install Foundry Local, clone the repository, and choose whether you want to work in Python, JavaScript, or C#. You do not need to master all three. In fact, most learners will get more value by picking one language first, completing the full path in that language, and only then comparing how the same patterns look elsewhere.

If you are new to AI development, do not be put off by the number of parts. The early sections are accessible, and the later ones become much easier once you have completed the foundations. Think of the lab as a structured course rather than a single tutorial.

What You Learn in Each Lab https://github.com/microsoft-foundry/foundry-local-lab 

Part 1: Getting Started with Foundry Local

The first part introduces the basics of Foundry Local and gets you up and running. You learn how to install the CLI, inspect the model catalogue, download a model, and run it locally. This part also introduces practical details such as model aliases and dynamic service ports, which are small but important pieces of real development work.

For students, the value of this part is confidence. You prove that local inference works on your machine, you see how the service behaves, and you learn the operational basics before writing any application code. By the end of Part 1, you should understand what Foundry Local does, how to start it, and how local model serving fits into an application workflow.

Part 2: Foundry Local SDK Deep Dive

Once the CLI makes sense, the workshop moves into the SDK. This part explains why application developers often use the SDK instead of relying only on terminal commands. You learn how to manage the service programmatically, browse available models, control model download and loading, and understand model metadata such as aliases and hardware-aware selection.

This is where learners start to move from using a tool to building with a platform. You begin to see the difference between running a model manually and integrating it into software. By the end of this section, you should understand the API surface you will use in your own projects and know how to bootstrap the SDK in Python, JavaScript, or C#.

Part 3: SDKs and APIs

Part 3 turns the SDK concepts into a working chat application. You connect code to the local inference server and use the OpenAI-compatible API for streaming chat completions. The lab includes examples in all three supported languages, which makes it especially useful if you are comparing ecosystems or learning how the same idea is expressed through different syntax and libraries.

The key learning outcome here is not just that you can get a response from a model. It is that you understand the boundary between your application and the local model service. You learn how messages are structured, how streaming works, and how to write the sort of integration code that becomes the foundation for every later lab.

Part 4: Retrieval-Augmented Generation

This is where the workshop starts to feel like modern AI engineering rather than basic prompting. In the retrieval-augmented generation lab, you build a simple RAG pipeline that grounds answers in supplied data. You work with an in-memory knowledge base, apply retrieval logic, score matches, and compose prompts that include grounded context.

For learners, this part is important because it demonstrates a core truth of AI app development: a model on its own is often not enough. Useful applications usually need access to documents, notes, or structured information. By the end of Part 4, you understand why retrieval matters, how to pass retrieved context into a prompt, and how a pipeline can make answers more relevant and reliable.

Part 5: Building AI Agents

Part 5 introduces the concept of an agent. Instead of a one-off prompt and response, you begin to define behaviour through system instructions, roles, and conversation state. The lab uses the ChatAgent pattern and the Microsoft Agent Framework to show how an agent can maintain a purpose, respond with a persona, and return structured output such as JSON.

This part helps learners understand the difference between a raw model call and a reusable application component. You learn how to design instructions that shape behaviour, how multi-turn interaction differs from single prompts, and why structured output matters when an AI component has to work inside a broader system.

Part 6: Multi-Agent Workflows

Once a single agent makes sense, the workshop expands the idea into a multi-agent workflow. The example pipeline uses roles such as researcher, writer, and editor, with outputs passed from one stage to the next. You explore sequential orchestration, shared configuration, and feedback loops between specialised components.

For students, this lab is a very clear introduction to decomposition. Instead of asking one model to do everything at once, you break a task into smaller responsibilities. That pattern is useful well beyond AI. By the end of Part 6, you should understand why teams build multi-agent systems, how hand-offs are structured, and what trade-offs appear when more components are added to a workflow.

Part 7: Zava Creative Writer Capstone Application

The Zava Creative Writer is the capstone project that brings the earlier ideas together into a more production-style application. It uses multiple specialised agents, structured JSON hand-offs, product catalogue search, streaming output, and evaluation-style feedback loops. Rather than showing an isolated feature, this part shows how separate patterns combine into a complete system.

This is one of the most valuable parts of the workshop for learner developers because it narrows the gap between tutorial code and real application design. You can see how orchestration, agent roles, and practical interfaces fit together. By the end of Part 7, you should be able to recognise the architecture of a serious local AI app and understand how the earlier labs support it.

Part 8: Evaluation-Led Development

Many beginner AI projects stop once the output looks good once or twice. This lab teaches a much stronger habit: evaluation-led development. You work with golden datasets, rule-based checks, and LLM-as-judge scoring to compare prompt or agent variants systematically. The goal is to move from anecdotal testing to repeatable assessment.

This matters enormously for students because evaluation is one of the clearest differences between a classroom demo and dependable software. By the end of Part 8, you should understand how to define success criteria, compare outputs at scale, and use evidence rather than intuition when improving an AI component.

Part 9: Voice Transcription with Whisper

Part 9 broadens the workshop beyond text generation by introducing speech-to-text with Whisper running locally. You use the Foundry Local SDK to download and load the model, then transcribe local audio files through the compatible API surface. The emphasis is on privacy-first processing, with audio kept on-device.

This section is a useful reminder that local AI development is not limited to chatbots. Learners see how a different modality fits into the same ecosystem and how local execution supports sensitive workloads. By the end of this lab, you should understand the transcription flow, the relevant client methods, and how speech features can be integrated into broader applications.

Part 10: Using Custom or Hugging Face Models

After learning the standard path, the workshop shows how to work with custom or Hugging Face models. This includes compiling models into optimised ONNX format with ONNX Runtime GenAI, choosing hardware-specific options, applying quantisation strategies, creating configuration files, and adding compiled models to the Foundry Local cache.

For learner developers, this part opens the door to model engineering rather than simple model consumption. You begin to understand that model choice, optimisation, and packaging affect performance and usability. By the end of Part 10, you should have a clearer picture of how models move from an external source into a runnable local setup and why deployment format matters.

Part 11: Tool Calling with Local Models

Tool calling is one of the most practical patterns in current AI development, and this lab covers it directly. You define tool schemas, allow the model to request function calls, handle the multi-turn interaction loop, execute the tools locally, and return results back to the model. The examples include practical scenarios such as weather and population tools.

This lab teaches learners how to move beyond generation into action. A model is no longer limited to producing text. It can decide when external data or a function is needed and incorporate that result into a useful answer. By the end of Part 11, you should understand the tool-calling flow and how AI systems connect reasoning with deterministic software behaviour.

Part 12: Building a Web UI for the Zava Creative Writer

Part 12 adds a browser-based front end to the capstone application. You learn how to serve a shared interface from Python, JavaScript, or C#, stream updates to the browser, consume NDJSON with the Fetch API and ReadableStream, and show live agent status as content is produced in real time.

This part is especially good for students who want to build portfolio projects. It turns backend orchestration into something visible and interactive. By the end of Part 12, you should understand how to connect a local AI backend to a web interface and how streaming changes the user experience compared with waiting for one final response.

Part 13: Workshop Complete

The final part is a summary and extension point. It reviews what you have built across the previous sections and suggests ways to continue. Although it is not a new technical lab in the same way as the earlier parts, it plays an important role in learning. It helps you consolidate the architecture, the terminology, and the development patterns you have encountered.

For learners, reflection matters. By the end of Part 13, you should be able to describe the full stack of a local AI application, from model management to user interface, and identify which area you want to deepen next.

What Students Gain from the Full Workshop

Taken together, these labs do more than teach Foundry Local itself. They teach how AI applications are built. You learn operational basics such as model setup and service management. You learn application integration through SDKs and APIs. You learn system design through RAG, agents, multi-agent orchestration, and web interfaces. You learn engineering discipline through evaluation. You also see how text, speech, custom models, and tool calling all fit into one local-first development workflow.

That breadth makes the workshop useful in several settings. A student can use it as a self-study path. A lecturer can use it as source material for practical sessions. A learner developer can use it to build portfolio pieces and to understand which AI patterns are worth learning next. Because the repository includes Python, JavaScript, and C#, it also works well for comparing how architectural ideas transfer across languages.

How to Approach the Lab as a Beginner

If you are starting from scratch, the best route is simple. Complete Parts 1 to 3 in your preferred language first. That gives you the essential setup and integration skills. Then move into Parts 4 to 6 to understand how AI application patterns are composed. After that, use Parts 7 and 8 to learn how larger systems and evaluation fit together. Finally, explore Parts 9 to 12 based on your interests, whether that is speech, tooling, model customisation, or front-end work.

It is also worth keeping notes as you go. Record what each part adds to your understanding, what code files matter, and what assumptions each example makes. That habit will help you move from following the labs to adapting the patterns in your own projects.

Final Thoughts

The Microsoft Foundry Local Lab is a strong introduction to local AI development because it treats learners like developers rather than spectators. You install, run, connect, orchestrate, evaluate, and present working systems. That makes it far more valuable than a short demo that only proves a model can answer a question.

If you are a student or learner developer who wants to understand how AI applications are really built, this lab gives you a clear path. Start with the basics, pick one language, and work through the parts in order. By the time you finish, you will not just have used Foundry Local. You will have a practical foundation for building local AI applications with far more confidence and much better judgement.

Read the whole story
alvinashcraft
1 minute ago
reply
Pennsylvania, USA
Share this story
Delete

Building Your First Local RAG Application with Foundry Local

1 Share

A developer's guide to building an offline, mobile-responsive AI support agent using Retrieval-Augmented Generation, the Foundry Local SDK, and JavaScript.


Imagine you are a gas field engineer standing beside a pipeline in a remote location. There is no Wi-Fi, no mobile signal, and you need a safety procedure right now. What do you do?


This is the exact problem that inspired this project: a fully offline RAG-powered support agent that runs entirely on your machine. No cloud. No API keys. No outbound network calls. Just a local language model, a local vector store, and your own documents, all accessible from a browser on any device.


In this post, you will learn how it works, how to build your own, and the key architectural decisions behind it. If you have ever wanted to build an AI application that runs locally and answers questions grounded in your own data, this is the place to start.

Screenshot of the Gas Field Support Agent landing page, showing a dark-themed chat interface with quick-action buttons for common questions

The finished application: a browser-based AI support agent that runs entirely on your machine.

What Is Retrieval-Augmented Generation?

Retrieval-Augmented Generation (RAG) is a pattern that makes AI models genuinely useful for domain-specific tasks. Rather than hoping the model "knows" the answer from its training data, you:

  1. Retrieve relevant chunks from your own documents using a vector store
  2. Augment the model's prompt with those chunks as context
  3. Generate a response grounded in your actual data

The result is fewer hallucinations, traceable answers with source attribution, and an AI that works with your content rather than relying on general knowledge.

If you are building internal tools, customer support bots, field manuals, or knowledge bases, RAG is the pattern you want.

RAG vs CAG: Understanding the Trade-offs

If you have explored AI application patterns before, you have likely encountered Context-Augmented Generation (CAG). Both RAG and CAG solve the same core problem: grounding an AI model's answers in your own content. They take different approaches, and each has genuine strengths and limitations.

RAG (Retrieval-Augmented Generation)

How it works: Documents are split into chunks, vectorised, and stored in a database. At query time, the most relevant chunks are retrieved and injected into the prompt.

Strengths:

  • Scales to thousands or millions of documents
  • Fine-grained retrieval at chunk level with source attribution
  • Documents can be added or updated dynamically without restarting
  • Token-efficient: only relevant chunks are sent to the model
  • Supports runtime document upload via the web UI

Limitations:

  • More complex architecture: requires a vector store and chunking strategy
  • Retrieval quality depends on chunking parameters and scoring method
  • May miss relevant content if the retrieval step does not surface it

CAG (Context-Augmented Generation)

How it works: All documents are loaded at startup. The most relevant ones are selected per query using keyword scoring and injected into the prompt.

Strengths:

  • Drastically simpler architecture with no vector database or embeddings
  • All information is always available to the model
  • Minimal dependencies and easy to set up
  • Near-instant document selection

Limitations:

  • Constrained by the model's context window size
  • Best suited to small, curated document sets (tens of documents)
  • Adding documents requires an application restart

Want to compare these patterns hands-on? There is a CAG-based implementation of the same gas field scenario using whole-document context injection. Clone both repositories, run them side by side, and see how the architectures differ in practice.

When Should You Choose Which?

ConsiderationChoose RAGChoose CAG
Document countHundreds or thousandsTens of documents
Document updatesFrequent or dynamic (runtime upload)Infrequent (restart to reload)
Source attributionPer-chunk with relevance scoresPer-document
Setup complexityModerate (ingestion step required)Minimal
Query precisionBetter for large or diverse collectionsGood for keyword-matchable content
InfrastructureSQLite vector store (single file)None beyond the runtime

For the sample application in this post (20 gas engineering procedure documents with runtime upload), RAG is the clear winner. If your document set is small and static, CAG may be simpler. Both patterns run fully offline using Foundry Local.

Foundry Local: Your On-Device AI Runtime

Foundry Local is a lightweight runtime from Microsoft that downloads, manages, and serves language models entirely on your device. No cloud account, no API keys, no outbound network calls (after the initial model download).

What makes it particularly useful for developers:

  • No GPU required: runs on CPU or NPU, making it accessible on standard laptops and desktops
  • Native SDK bindings: in-process inference via the foundry-local-sdk npm package, with no HTTP round-trips to a local server
  • Automatic model management: downloads, caches, and loads models automatically
  • Hardware-optimised variant selection: the SDK picks the best variant for your hardware (GPU, NPU, or CPU)
  • Real-time progress callbacks: ideal for building loading UIs that show download and initialisation progress

The integration code is refreshingly minimal:

 
import { FoundryLocalManager } from "foundry-local-sdk"; // Create a manager and discover models via the catalogue const manager = FoundryLocalManager.create({ appName: "gas-field-local-rag" }); const model = await manager.catalog.getModel("phi-3.5-mini"); // Download if not cached, then load into memory if (!model.isCached) { await model.download((progress) => { console.log(`Download: ${Math.round(progress * 100)}%`); }); } await model.load(); // Create a chat client for direct in-process inference const chatClient = model.createChatClient(); const response = await chatClient.completeChat([ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: "How do I detect a gas leak?" } ]);
 
 

That is it. No server configuration, no authentication tokens, no cloud provisioning. The model runs in the same process as your application.

The Technology Stack

The sample application is deliberately simple. No frameworks, no build steps, no Docker:

LayerTechnologyPurpose
AI ModelFoundry Local + Phi-3.5 MiniRuns locally via native SDK bindings, no GPU required
Back endNode.js + ExpressLightweight HTTP server, everyone knows it
Vector StoreSQLite (via better-sqlite3)Zero infrastructure, single file on disc
RetrievalTF-IDF + cosine similarityNo embedding model required, fully offline
Front endSingle HTML file with inline CSSNo build step, mobile-responsive, field-ready

The total dependency footprint is three npm packages: express, foundry-local-sdk, and better-sqlite3.

Architecture Overview

Architecture diagram showing five layers: Client (HTML/CSS/JS), Server (Express.js), RAG Pipeline (chunker, TF-IDF, chat engine), Data Layer (SQLite), and AI Layer (Foundry Local)

The five-layer architecture, all running on a single machine.

The system has five layers, all running on a single machine:

  • Client layer: a single HTML file served by Express, with quick-action buttons and a responsive chat interface
  • Server layer: Express.js starts immediately and serves the UI plus SSE status and chat endpoints
  • RAG pipeline: the chat engine orchestrates retrieval and generation; the chunker handles TF-IDF vectorisation; the prompts module provides safety-first system instructions
  • Data layer: SQLite stores document chunks and their TF-IDF vectors; documents live as .md files in the docs/ folder
  • AI layer: Foundry Local runs Phi-3.5 Mini on CPU or NPU via native SDK bindings

Building the Solution Step by Step

Prerequisites

You need two things installed on your machine:

  1. Node.js 20 or later: download from nodejs.org
  2. Foundry Local: Microsoft's on-device AI runtime:
    winget install Microsoft.FoundryLocal

The SDK will automatically download the Phi-3.5 Mini model (approximately 2 GB) the first time you run the application.

Getting the Code Running

 
# Clone the repository git clone https://github.com/leestott/local-rag.git cd local-rag # Install dependencies npm install # Ingest the 20 gas engineering documents into the vector store npm run ingest # Start the server npm start
 

Open http://127.0.0.1:3000 in your browser. You will see the status indicator whilst the model loads. Once the model is ready, the status changes to "Offline Ready" and you can start chatting.

Desktop view of the application showing the chat interface with quick-action buttons

Desktop view

Mobile view of the application showing the responsive layout on a smaller screen

Mobile view

How the RAG Pipeline Works

Let us trace what happens when a user asks: "How do I detect a gas leak?"

Sequence diagram showing the RAG query flow: user sends a question, the server retrieves relevant chunks from SQLite, constructs a prompt, sends it to Foundry Local, and streams the response back

The query flow from browser to model and back.

1 Documents are ingested and indexed

When you run npm run ingest, every .md file in the docs/ folder is read, parsed (with optional YAML front-matter for title, category, and ID), split into overlapping chunks of approximately 200 tokens, and stored in SQLite with TF-IDF vectors.

2 Model is loaded via the SDK

The Foundry Local SDK discovers the model in the local catalogue and loads it into memory. If the model is not already cached, it downloads it first (with progress streamed to the browser via SSE).

3 User sends a question

The question arrives at the Express server. The chat engine converts it into a TF-IDF vector, uses an inverted index to find candidate chunks, and scores them using cosine similarity. The top 3 chunks are returned in under 1 ms.

4 Prompt is constructed

The engine builds a messages array containing: the system prompt (with safety-first instructions), the retrieved chunks as context, the conversation history, and the user's question.

5 Model generates a grounded response

The prompt is sent to the locally loaded model via the Foundry Local SDK's native chat client. The response streams back token by token through Server-Sent Events to the browser. Source references with relevance scores are included.

Chat response showing safety warnings followed by step-by-step gas leak detection guidance

A response with safety warnings and step-by-step guidance

Sources panel showing the specific document chunks referenced in the response with relevance scores

The sources panel shows which chunks were used and their relevance

Key Code Walkthrough

The Vector Store (TF-IDF + SQLite)

The vector store uses SQLite to persist document chunks alongside their TF-IDF vectors. At query time, an inverted index finds candidate chunks that share terms with the query, then cosine similarity ranks them:

 
// src/vectorStore.js search(query, topK = 5) { const queryTf = termFrequency(query); this._ensureCache(); // Build in-memory cache on first access // Use inverted index to find candidates sharing at least one term const candidateIndices = new Set(); for (const term of queryTf.keys()) { const indices = this._invertedIndex.get(term); if (indices) { for (const idx of indices) candidateIndices.add(idx); } } // Score only candidates, not all rows const scored = []; for (const idx of candidateIndices) { const row = this._rowCache[idx]; const score = cosineSimilarity(queryTf, row.tf); if (score > 0) scored.push({ ...row, score }); } scored.sort((a, b) => b.score - a.score); return scored.slice(0, topK); }
 

The inverted index, in-memory row cache, and prepared SQL statements bring retrieval time to sub-millisecond for typical query loads.

Why TF-IDF Instead of Embeddings?

Most RAG tutorials use embedding models for retrieval. This project uses TF-IDF because:

  • Fully offline: no embedding model to download or run
  • Zero latency: vectorisation is instantaneous (it is just maths on word frequencies)
  • Good enough: for 20 domain-specific documents, TF-IDF retrieves the right chunks reliably
  • Transparent: you can inspect the vocabulary and weights, unlike neural embeddings

For larger collections or when semantic similarity matters more than keyword overlap, you would swap in an embedding model. For this use case, TF-IDF keeps the stack simple and dependency-free.

The System Prompt

For safety-critical domains, the system prompt is engineered to prioritise safety, prevent hallucination, and enforce structured responses:

 
// src/prompts.js export const SYSTEM_PROMPT = `You are a local, offline support agent for gas field inspection and maintenance engineers. Behaviour Rules: - Always prioritise safety. If a procedure involves risk, explicitly call it out. - Do not hallucinate procedures, measurements, or tolerances. - If the answer is not in the provided context, say: "This information is not available in the local knowledge base." Response Format: - Summary (1-2 lines) - Safety Warnings (if applicable) - Step-by-step Guidance - Reference (document name + section)`;
 

This pattern is transferable to any safety-critical domain: medical devices, electrical work, aviation maintenance, or chemical handling.

Runtime Document Upload

Unlike the CAG approach, RAG supports adding documents without restarting the server. Click the upload button to add new .md or .txt files. They are chunked, vectorised, and indexed immediately.

Upload document modal showing a file drop zone and a list of indexed documents with chunk counts

The upload modal with the complete list of indexed documents.

Adapting This for Your Own Domain

The sample project is designed to be forked and adapted. Here is how to make it yours in four steps:

1. Replace the documents

Delete the gas engineering documents in docs/ and add your own markdown files. The ingestion pipeline handles any markdown content with optional YAML front-matter:

 
--- title: Troubleshooting Widget Errors category: Support id: KB-001 --- # Troubleshooting Widget Errors ...your content here...
 

2. Edit the system prompt

Open src/prompts.js and rewrite the system prompt for your domain. Keep the structure (summary, safety, steps, reference) and update the language to match your users' expectations.

3. Tune the retrieval

In src/config.js:

  • chunkSize: 200: smaller chunks give more precise retrieval, less context per chunk
  • chunkOverlap: 25: prevents information falling between chunks
  • topK: 3: how many chunks to retrieve per query (more gives more context but slower generation)

4. Swap the model

Change config.model in src/config.js to any model available in the Foundry Local catalogue. Smaller models give faster responses on constrained devices; larger models give better quality.

Building a Field-Ready UI

The front end is a single HTML file with inline CSS. No React, no build tooling, no bundler. This keeps the project accessible to beginners and easy to deploy.

Design decisions that matter for field use:

  • Dark, high-contrast theme with 18px base font size for readability in bright sunlight
  • Large touch targets (minimum 44px) for operation with gloves or PPE
  • Quick-action buttons that wrap on mobile so all options are visible without scrolling
  • Responsive layout that works from 320px to 1920px+ screen widths
  • Streaming responses via SSE, so the user sees tokens arriving in real time
Mobile view of the chat interface showing a conversation with the AI agent on a small screen

The mobile chat experience, optimised for field use.

Testing

The project includes unit tests using the built-in Node.js test runner, with no extra test framework needed:

 
# Run all tests npm test
 

Tests cover the chunker, vector store, configuration, and server endpoints. Use them as a starting point when you adapt the project for your own domain.

Ideas for Extending the Project

Once you have the basics running, there are plenty of directions to explore:

  • Embedding-based retrieval: use a local embedding model for better semantic matching on diverse queries
  • Conversation memory: persist chat history across sessions using local storage or a lightweight database
  • Multi-modal support: add image-based queries (photographing a fault code, for example)
  • PWA packaging: make it installable as a standalone offline application on mobile devices
  • Hybrid retrieval: combine TF-IDF keyword search with semantic embeddings for best results
  • Try the CAG approach: compare with the local-cag sample to see which pattern suits your use case

Ready to Build Your Own?

Clone the RAG sample, swap in your own documents, and have an offline AI agent running in minutes. Or compare it with the CAG approach to see which pattern suits your use case best.

Get the RAG Sample    Get the CAG Sample

Summary

Building a local RAG application does not require a PhD in machine learning or a cloud budget. With Foundry Local, Node.js, and SQLite, you can create a fully offline, mobile-responsive AI agent that answers questions grounded in your own documents.

The key takeaways:

  1. RAG is ideal for scalable, dynamic document sets where you need fine-grained retrieval with source attribution. Documents can be added at runtime without restarting.
  2. CAG is simpler when you have a small, stable set of documents that fit in the context window. See the local-cag sample to compare.
  3. Foundry Local makes on-device AI accessible: native SDK bindings, in-process inference, automatic model selection, and no GPU required.
  4. TF-IDF + SQLite is a viable vector store for small-to-medium collections, with sub-millisecond retrieval thanks to inverted indexing and in-memory caching.
  5. Start simple, iterate outwards. Begin with RAG and a handful of documents. If your needs are simpler, try CAG. Both patterns run entirely offline.

Clone the repository, swap in your own documents, and start building. The best way to learn is to get your hands on the code.

Read the whole story
alvinashcraft
1 minute ago
reply
Pennsylvania, USA
Share this story
Delete

Mads Torgersen: Talking AI - Episode 395

1 Share

https://clearmeasure.com/developers/forums/

Mads is a Principal Architect at Microsoft, where he has been for over 20 years. He's been the Lead Designer of the C# language for a long time. Prior to this, Mads was a professor and contributed to a language starting with J. He was previously on episode 325 of the podcast where he spoke about the latest on C# at the time.

Mentioned in this Episode

Github Link - C#
Episode 325 
Learn C# 

Want to Learn More? 
Visit AzureDevOps.Show for show notes and additional episodes.





Download audio: https://traffic.libsyn.com/clean/secure/azuredevops/Episode_395.mp3?dest-id=768873
Read the whole story
alvinashcraft
2 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Chris Woodruff and Joe Guadagno on morespeakers.com

1 Share

Episode 896

Chris Woodruff and Joe Guadagno on morespeakers.com

Chris Woodruff and Joe Guadagno are experienced speakers who would like to help new speakers. They created morespeakers.com allowing new speakers to connect with experienced once and schedule mentoring sessions. They talk about their motivations for creating this service, the technology and challenges that went into creating it, and how to use the service.

Links:
https://morespeakers.com
https://github.com/cwoodruff/morespeakers-com
https://aspnet-htmx.com/
https://www.josephguadagno.net/2026/01/30/the-technology-behind-morespeakers-com

Read the whole story
alvinashcraft
3 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Vibes, specs, skills, and agents: The four pillars of AI coding

1 Share

Picture this: I'm sitting at my desk, the glow of the monitor illuminating a fresh project. I type a quick "vibe" into my AI-powered editor: "Build me a clean, reactive dashboard for monitoring cluster health." Within seconds, code begins to pour onto the screen. It is a thrilling moment: for a heartbeat, it feels like the AI has read my mind. 

But as I look closer, the excitement fades. The authentication is missing. The data-fetching logic is using a library I explicitly deprecated last month. The vibe was right, but the execution was off-key.

I call this the encoding/decoding gap: that frustrating space between what I intend (my internal encoding) and what the AI produces (its decoding of my intent). When the gap is narrow, the delivery is smooth. When it is wide, I spend more time fixing AI errors than I would have spent writing the code myself.

From prompts to orchestration

In my previous article, How spec-driven development improves AI coding quality, I showed how moving from pure vibe coding to structured specifications dramatically improves AI output. In that piece, I introduced the spec-driven framework as a way to ground AI in reality. In this follow-up post, we're moving beyond writing better prompts to a complete four-pillar orchestration system: vibes, specs, skills, and agents.

In my experience, many developers remain stuck in a binary mindset. They either rely entirely on the vibe—an intuitive, conversational flow—or they attempt to write monolithic, rigid requirements that the AI eventually ignores. 

Why settle for inconsistent results? I believe the future of software engineering lies in the deliberate balance of these four elements.

Scenario in practice

Picture Jennifer, a lead developer at a growing fintech startup. She spent her first week with a new AI coding agent feeling like she was vibing perfectly, until a major bug revealed the agent had used the wrong encryption standard because she hadn't specified one. Jennifer realized that while her vibe was high-velocity, her spec was non-existent. By shifting to a spec-driven approach, she didn't just fix the bug. She created a repeatable pattern that her whole team could follow.

The four-pillar system

Not all developers are aware of vibes, specs, skills, and agents. Even among those who are, competing definitions and levels of granularity can create confusion. I have seen teams struggle because they confuse a skill with a spec, or they try to use an agent without giving it the necessary specs to succeed. I now structure my projects by treating these as distinct but interconnected layers.

The core philosophy I want to share with you is this:

  • Use vibes for intuitive exploration and idea-sharing.
  • Use specs for precise, authoritative instructions.
  • Use skills to add specific capabilities to an agent.
  • Use agents as the interactive, autonomous engines that translate your specs into your code.

I don't want to disparage vibe coding. It is a fantastic starting point for prototyping. But as I argued in my previous article, the spec is the anchor. It minimizes the gaps. When I achieve harmony between all four pillars, I don't just get code that works. I get code that feels like I wrote it myself, running on reliable infrastructure like Red Hat OpenShift.

Defining the four pillars

Before I dive into the mechanics, let me define what I mean by these four terms. In my daily workflow, I treat them as a stack.

  • Vibes: Conversational, intuitive interaction. For example, "I'm thinking of a tool that does X, what do you think?" It's high-level, flexible, and essential for the "interacting" phase of development.
  • Specs (specifications): The what and the how. They are static, human-readable, and AI-effective blueprints. I never build a feature without a spec.
  • Skills: Modular "how-to" packages. If a spec says what to do, a skill provides the capability to do it (for example, how to deploy to OpenShift or how to run a security audit).
  • Agents: The software entities (such as Cursor, Claude Code, or custom bots on Red Hat OpenShift AI) that use specs and skills to actually perform the work.

Agent types in practice

I've found that the agent pillar is where most of the confusion lives today. Not all agents are created equal. I generally categorize them into three types. Choose your tool based on the task at hand.

Agent typeDescriptionCommon tools and platformsBest for:Choose this type when:
Interactive / chat agentsConversational; doesn't usually see the whole repository unless told.Cursor Composer, Claude Code, GeminiRapid iteration, "what-if" scenarios.You want fast feedback in your editor.
IDE-integrated agentsLives in the editor; reads/writes files; runs local terminal commands.Cursor Agent, Claude Code, Kiro autonomous modeFeature implementation, refactoring.You are working inside a codebase and need deep context.
Autonomous agentsSelf-running loops; plans, acts, observes, and replans.AutoGPT, Claude Code (non-interactive), custom agents on Red Hat OpenShift AIComplex migrations, end-to-end feature builds.You have a solid spec and want hands-off generation.

I often start with an interactive agent to explore an idea, then move to an IDE-integrated agent once I've codified that idea into a spec. For mature deployments or repetitive tasks, I might hand the spec to an autonomous agent running on Red Hat OpenShift AI.

Scenario in practice

David is a DevOps engineer tasked with migrating 50 microservices to a new logging standard. He tried doing it manually with a chat AI, but it was too slow. I suggested he create a logging migration spec and a regex refactoring skill. He fed these into an autonomous agent. Instead of spending weeks on the migration, the agent finished most of the work in an afternoon. David only had to review the final pull requests.

Bridging communication gaps: The what/how split

In my previous article, I introduced a concept that has since become my North Star: the what/how split. This split is essential. If you want 95% accuracy or more from an AI, you must separate the goal from the implementation details.

The what includes the vision, functional requirements, user story, and success criteria. It answers the questions: What are we building, and why?

The how covers constraints, project structure, security standards, concurrency models, and testing requirements. It defines how to build the software within a specific environment.

I have observed that when I mix these two in a single prompt, the AI loses focus. It might nail the what but ignore the how, or vice versa. By modularizing my specs, I create a cleaner encoding for the AI to decode.

Avoid the monolith with modular specs

I am a firm believer that the days of the 100-page PDF specification are over. I don't want to see them, and the AI doesn't want to read them. 

Instead, I recommend creating multiple, small, focused Markdown files in a specs directory:

  • what-vision.md: High-level goals.
  • how-security.md: Authentication, secrets handling, and OpenID Connect (OIDC) requirements.
  • how-observability.md: Guidance on using OpenTelemetry and where to send logs.
  • how-standards.md: Corporate standards for code and architecture.
  • how-testing.md: Coverage targets and mocking strategies.

This modularity allows me to load only the relevant context for a specific task. If I'm building a UI component, I don't need to feed the how-concurrency.md spec to the AI.

Move beyond prompts with skills

This is the newest pillar in my workflow. While a spec tells the AI what the end state should look like, a skill gives the AI the procedural knowledge to get there.

I follow the official standards defined at agentskills.io. A skill is not just a prompt; it is a directory containing a SKILL.md file. This file must contain YAML frontmatter followed by Markdown instructions.

The mechanical depth of skills

Here is how I structure a skill. Let's say I want my agent to know how to deploy applications specifically to Red Hat OpenShift using the oc command-line interface (CLI).

The following example shows the directory structure for a skill:

.claude/skills/deploy-openshift/
├── SKILL.md
├── deploy-template.yaml
└── validate-route.sh

The following shows the contents of SKILL.md:

---
name: deploy-to-openshift
description: Procedures for deploying containerized apps to Red Hat OpenShift using the 'oc' CLI and standard templates.
version: 1.0.0
tags: [devops, redhat, openshift, deployment]
---
 
# Deploy to Red Hat OpenShift Skill
 
## Context
Use this skill when the user or a spec requires deploying a service to a Red Hat OpenShift cluster. 
 
## Instructions
1.  **Authentication**: Check if the agent is logged in using `oc whoami`. If not, prompt the user for a login command.
2.  **Project Selection**: Ensure the correct project (namespace) is set using `oc project <name>`.
3.  **Apply Templates**: Use the `deploy-template.yaml` found in this skill directory.
4.  **Validation**: After deployment, run `validate-route.sh` to ensure the application is accessible.
 
## Constraints
- Never delete an existing namespace unless explicitly instructed.
- Always use image streams instead of raw Docker images where possible.

How agents consume skills

Skills are consumed exclusively by agents. You, the human, do not run a skill. You equip your agent with it. In my workflow, this happens in two ways:

  • User-requested (during the interacting phase): While chatting with Cursor or Claude Code, I might say, "Load my deploy-to-openshift skill and use it to push this current build."
  • Autonomous (during the instructing phase): When I give an autonomous agent a spec that mentions deployment, the agent scans its skills directory, discovers deploy-to-openshift via the YAML frontmatter, and loads it automatically.

Scenario in practice

Suppose James, a senior developer, is working on a complex multicloud project. He created a library of skills for various cloud providers. When he switches the project target from a generic Kubernetes provider to Red Hat OpenShift, he doesn't have to rewrite his prompts. He simply points his agent to the OpenShift skill folder. The agent "learns" the new deployment nuances instantly This ensures the how of the deployment matches the infrastructure perfectly.

Instructing vs. interacting: The two modes of AI engagement

I have realized that I operate in two distinct modes when working with AI. Knowing which mode I am in is essential for staying efficient.

Interacting (the vibe/coaching phase)

In this phase, I explore and use the AI to refine my ideas. I use the AI as a coach to improve my specs. Tools like Claude Code now offer a plan mode, which is helpful for this type of interaction.

I recommend asking the AI to score your specifications. For example: "On a scale of 0-10, how effective would an autonomous agent be at generating this feature based only on this what-vision.md file? What is missing?" This creates a coaching loop where the AI helps me encode my intent more clearly.

Instructing (the execution phase)

Once the spec is a 9 or a 10, I switch to instructing mode. I stop chatting and start commanding. I point the agent at the specs and say, "Execute."

During this phase, I expect the agent to:

  • Read the relevant modular specs.
  • Discover and apply the necessary skills.
  • Generate code that meets the what and adheres to the how.
  • Run tests and fix errors autonomously.

How different agents execute specs

Different agents require different levels of guidance when it comes to specs.

Interactive and chat agents such as Cursor Composer, Claude Code, and Windsurf do not automatically load your specs folder. I have found that I must explicitly tell them to use these resources. For example, I might prompt agent: "Referencing all files in specs, especially how-security.md, please implement the login controller."

Similarly, IDE-integrated agents offer better file context but still require explicit prompting. This ensures they don't default to pre-trained behaviors instead of following your project-specific "how" specifications.

Autonomous agents, such as custom builds on Red Hat OpenShift AI, are the most effective for spec execution. I can configure these agents to automatically ingest every file in the specs and skills directories at startup. They operate with a spec-first mentality, which minimizes the need for repetitive instructions.

Scenario in practice

Imagine Rana, an AI architect. She built a custom autonomous agent hosted on Red Hat OpenShift AI using the Red Hat AI Inference Server. Because she runs the agent on her own infrastructure, she could hard-code the spec discovery logic. Every time the agent starts a new task, it first reads the specs directory to understand the project's DNA. Rana found that this reduced code reviews by 40% because the AI stopped making generic mistakes.

Benefits of spec co-evolution

One of the most exciting aspects of this four-pillar system is what I call spec co-evolution. I don't view specs as static documents like the waterfall models of old. I want my specs to evolve with the project.

I accomplish this through a lessons learned coaching loop. I instruct my agents to maintain a LessonsLearned.md file. When an agent encounters a bug, a build failure, or a correction, I instruct it to identify the cause, record the fix in LessonsLearned.md, and suggest an update to the relevant how-xxx.md specification.

This process turns every off-key moment into a permanent improvement in my encoding. The AI isn't just writing code; it helps me write better instructions for the future.

Sample: how-security.md (excerpt)

To give you a concrete example, here is a snippet of a "how" spec I might use in a real project.

# HOW: Security and Authentication
 
## Standards
- All API endpoints MUST be protected by JWT validation via the Red Hat Build of Keycloak.
- Secrets MUST NEVER be hardcoded; use environment variables mapped to OpenShift Secrets.
 
## Implementation Patterns
- Use the `@Authorized` decorator on all controller methods.
- Pass the `X-Correlation-ID` header to all downstream microservices.
 
## Lessons Learned (Auto-Updated)
- *Ref 2026-03-01*: Ensure the JWT 'aud' claim is checked against the service-id to prevent token reuse across namespaces.

Red Hat ecosystem integration: The infrastructure enabler

While the vibes might happen in your local IDE, the agents and code need a home. This is where the Red Hat OpenShift family of products is essential.

In my experience, enterprise AI workflows require more than just a laptop. They need a platform that provides specific capabilities.

I use Red Hat OpenShift AI to train, serve, and orchestrate autonomous agents. It provides lifecycle management for the models that power the vibes.

Red Hat AI Inference Server is based on vLLM and allows for high-performance, local inference. This is critical when I'm working with sensitive specs that cannot leave my corporate network.

Using Red Hat OpenShift as the infrastructure enabler helps ensure that the balance between vibes and specs isn't broken by environment inconsistencies. The agent that writes the code in an IDE uses the same specs and skills as the agent running an autonomous migration on OpenShift AI.

Scenario in practice

Consider Michael, a DevOps engineer at a global bank. He used to struggle with "works on my machine" AI issues. By deploying a shared agent platform on Red Hat OpenShift AI, he ensured that every agent across the global team read from the same how-security.md master spec hosted in a central Git repository. This resulted in a 100% compliance rate for security standards across three continents.

When to use which: A quick reference

I know this is a lot to digest. Refer to the following table to help you decide where to focus.

SituationPrimary pillarEngagement modeOutcome
Exploring a new libraryVibesInteractingUnderstanding and vibe check
Defining API boundariesSpecs (what)InstructingFunctional blueprint
Enforcing authentication patternsSpecs (how)InstructingGuardrails and consistency
Repeating a deploymentSkillsAgent autonomyReliable, reusable execution
Refining an existing specAI coachingInteractingHigher-fidelity encoding
Scaling code generationAgentsInstructingHigh-volume, accurate code

Evolving to shared specs and skills as team assets

I believe the ultimate goal is for specs and skills to become team assets. Much like how we share utility libraries today, I see a future where we share skill directories.

Imagine joining a new team and receiving access to a skills folder instead of a week of onboarding documentation. Your local AI agent instantly knows how the team handles database migrations, how they style their React components, and how they deploy to OpenShift.

The encoding of the team's collective knowledge is available for your agent to "decode" into code from day one. That is the power of the four-pillar system.

Scenario in practice

Consider Lisa, a lead architect who started a skill registry for her department. She realized that five teams were prompting their AI agents separately on how to use the company's internal API. She created a single internal-api-skill and distributed it. Code quality improved, and junior developers learned company best practices by watching the AI apply the shared skill.

The strategic value: Productivity, quality, and scaling

Why go through all this effort? Why not just keep vibing? The strategic payoff is three-fold:

  • Productivity: I spend less time fixing AI and more time reviewing it. The high-fidelity output from a spec-driven agent is better than the guesswork of a vibe-only agent.
  • Quality: My code is more traceable. If a bug occurs, I can check the spec to see if my instruction was wrong or if the agent execution failed. This accountability is impossible with only vibes.
  • Scaling: One developer can only vibe so much. A team can share a modular library of specs and skills, allowing everyone to operate at the level of the team's best architect.

Find your balance

The transition from vibe coding to spec-driven orchestration is not about working harder. It is about working with more intent.

Building directly on the spec-driven foundation I outlined in my previous blog, I didn't just prompt harder. I orchestrated the four-pillar system of vibes, specs, skills, and agents. I moved from asking an AI for code to directing a system of intelligence.

There is satisfaction in watching an autonomous agent deliver a feature that is 100% compliant with your security specs, uses your custom deployment skills, and runs perfectly on Red Hat OpenShift while you focus on the next big architectural challenge. This balance is available to every developer willing to start today.

Start by taking your most frequent vibe and turning it into a modular spec. Then, take a repetitive task and package it as a skill. Experiment. See how narrowing that encoding/decoding gap changes your relationship with your AI tools.

The next time your agent delivers code that feels like you wrote it yourself, you'll know exactly what I mean.

Research references and further reading:

The post Vibes, specs, skills, and agents: The four pillars of AI coding appeared first on Red Hat Developer.

Read the whole story
alvinashcraft
3 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Programming languages for AI

1 Share

Which programming language is best suited for LLM-based generation?

I recently asked readers to consider which programming language they would choose for a software system generated by one or more LLMs, and offered these options:

I deliberately made the menu unreasonable for a few reasons. I'm well aware that most people who dabble with LLM-based code generation use mainstream languages like Python, Rust, TypeScript, Go, etc. This makes sense for programmers. If you intend to keep an eye on the code that these systems generate, it's reasonable to pick a language you're familiar with. This enables you to review the code.

Code for machines #

A new sentiment is, however, on the rise. Vibe coding may only be a symptom. More broadly, people are speculating whether it even makes sense for LLMs to write in higher-level programming languages. After all, even assembly code was created for humans. If no human has to look at the code, then why not generate machine code?

I briefly discussed this in a conference keynote in 2024, but here I want to look at the question from a different perspective.

The underlying assumption behind the idea that LLMs might just as well generate machine code is that the only benefit gained from high-level languages is that they are human-readable. There are several flaws in that thinking.

The first is that machine code is not portable. And neither is assembly language. You could, of course, ask an LLM to produce the same app, but generate machine code for more than one operating system and processor, but since LLMs are non-deterministic, this doesn't sound like a good idea.

You could, instead, ask an LLM to generate code in C. This is, after all, C's original claim to fame. That language is designed to be portable, and it is.

This, however, suggests that a programming language offers more than just being human-readable. C, for example, has the crucial feature of allowing compilation to many different platforms; a feature shared by many more modern languages.

Might there be other features of programming languages that would be useful, even if no human looks at the code?

Guardrails #

Some programming languages are easier to analyse than others. I'm aware of three kinds of analysis of code:

  • Linting, or static code analysis
  • Static type systems
  • Formal methods

I admit that I don't know much about formal methods, so I'll leave that topic to someone who does.

Linting is useful, but my experience suggests that human oversight is required to make such tools useful. They tend to produce false positives, and you need to understand code to judge whether a linter warning is a real problem, or something that can be ignored.

Static type systems are, on the other hand, much more rigorous. If a program doesn't type-check, it doesn't compile. While you could argue that type systems come with false negatives, this happens more rarely. Some languages allow 'overriding' the type system; for example, Java, C#, and other languages in the C family allow downcasting. Even so, my experience is that you don't need that language feature.

This may seem incomprehensible to some programmers, but I've written C# without resorting to dynamic type checks for more than a decade. F#, too.

If you're still doubtful that I'm speaking the truth, consider that Haskell doesn't have dynamic type-checking. You not only get by regardless; Haskell is a much more powerful language.

A typical joke is that if you can get your Haskell code to compile, it probably works. 'If' being the operative word.

Although funny, it's not true. No Turing-complete language could have that property, and even in languages that sacrifice Turing-completeness for provability, you are never safe from bugs arising from a misunderstanding of requirements. ("Oh, that was what the customer wanted!")

Even so, there's benefit from a strong static type system. It prevents whole categories of errors, where the infamous null-reference exceptions are only the top of the iceberg.

There are languages with type systems more powerful than Haskell. Idris is one of them. That's the reason I picked it for the above menu to choose from.

Constraints liberate #

As a thought experiment, imagine that you asked an LLM to produce a non-trivial, important software system where correctness matters. First, imagine that it produces this system directly in machine code. Or, if we wish to make it portable, in C. Would you trust this system?

C is a programming language infamous for being difficult to make correct. It's easy to forget to free memory, causing memory leaks. It's easy to get pointer arithmetic wrong, leading to crashes or even segfaults. Try to make the code multi-threaded, and it becomes even harder.

In addition, C is infamous for being insecure. Most buffer overrun vulnerabilities are caused by C's ability to allow ad-hoc access to memory. Even with an LLM superior to today's systems, will you trust that the software it produces in C is safe if you put it on the internet?

I wouldn't. Even if you believe that testing is enough to demonstrate that a system works, it's much harder to convince yourself that a black box is secure.

I'd much rather trust a system programmed in a language that comes with fewer opportunities for writing insecure code. As usual, constraints liberate. By having a statically-typed programming language, backed by a robust compiler, there's a lot that you don't have to worry about. You don't have to worry about null-reference exceptions. You don't have to worry about buffer overflows.

And with most such languages, you can turn the dial to 11 by treating warnings as errors (as discussed in Code That Fits in Your Head). For languages with algebraic data types, for instance, this would mean that you wouldn't be able to compile code that doesn't handle all cases of a sum type.

Programming languages for AI #

I listed Idris for two reasons: It has a type system even more expressive than (standard) Haskell, and the number of people who read it is small. I deliberately didn't want to list any popular language (like Haskell), because the purpose of the original 'poll' was to make you consider which kind of language would be best for LLMs, assuming that you had no bias.

Realistically, Idris is not going to be a standard programming language for AI. If things go as they usually go, it'll probably end up being JavaScript or Python (and if the choice is between those two, Python would be preferable).

What would make more sense, though, is a new language tailor-made for LLMs. And of course, people are already experimenting with that idea.

An AI-first language should, I think, have as many guardrails as possible built in. A powerful static type checker, perhaps refinement types, dependent types, or something else that I don't know of. Even if some of these features are inconvenient for human programmers, they may prove useful for machine-written code.

As Szymon Teżewski phrases it: Design by inconvenience. If LLMs are writing all the code, optimize for verifiability, not for how easy it is to write.

Conclusion #

Some people envision a future where AI writes all code. They believe that the implication is that the programming language no longer matters; that LLMs might just as well write directly in machine code.

In this article I've argued that readability by humans is only one property of a programming language. Other qualities, possibly independent of readability, are portability, security features, static and dynamic analysis, and verifiability. An AI-first programming language should, in my opinion, come loaded with as many of such properties that we can think of.

If we no longer write code, we should at least have the ability to verify it.


This blog is totally free, but if you like it, please consider supporting it.
Read the whole story
alvinashcraft
3 minutes ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories