Short Bio:
Bob Cravens is a seasoned technology leader, software architect, and educator with a passion for empowering others through practical, real-world knowledge. As the founder of TekFoundry, Bob has dedicated his career to designing and delivering innovative software solutions that combine cutting-edge technology with elegant simplicity.
At TekCasts, Bob leverages over two decades of experience in software engineering, application architecture, and team leadership to create engaging, high-impact courses for developers and technology professionals. His instructional style is rooted in practical application, offering insights drawn from his extensive background in industries like medical devices and global technology consulting.
Bob’s expertise spans a variety of technologies and methodologies, including PHP/Laravel, FastAPI, and DevOps, as well as architecture best practices and team dynamics. Whether teaching foundational concepts or advanced strategies, he’s passionate about helping others turn complex challenges into streamlined solutions.
When not crafting elegant code or inspiring the next generation of tech innovators, Bob enjoys exploring the intersection of technology, business strategy, and creative problem-solving.
At TekCasts, Bob leverages over two decades of experience in software engineering, application architecture, and team leadership to create engaging, high-impact courses for developers and technology professionals. His instructional style is rooted in practical application, offering insights drawn from his extensive background in industries like medical devices and global technology consulting.
Bob’s expertise spans a variety of technologies and methodologies, including PHP/Laravel, FastAPI, and DevOps, as well as architecture best practices and team dynamics. Whether teaching foundational concepts or advanced strategies, he’s passionate about helping others turn complex challenges into streamlined solutions.
When not crafting elegant code or inspiring the next generation of tech innovators, Bob enjoys exploring the intersection of technology, business strategy, and creative problem-solving.
Videos
Checkout Videos By This Instructor
Coming Soon
laravel,php
16m:7s
Mar 31, 2026
Survey State Machine
🧠 State drives behavior. Behavior drives architecture.In this episode of Pragmatic Laravel, we introduce a state machine to model the survey workflow — giving surveys clear, intentional states and safe, predictable transitions.
Instead of scattering conditional logic across controllers and views, we centralize behavior using enums, dashboards, and explicit state awareness. This lays the foundation for upcoming event-driven features and listeners.
🔍 What You’ll Learn:
- What a state machine is — and why it matters
- How survey states shape application behavior
- Updating a SurveyStatus enum for clarity and safety
- Building a dedicated Survey Dashboard
- Refactoring UI components to reflect workflow state
- Preparing your app for event-based programming
🛠 Hands-On Topics:
- Update SurveyStatus enum
- Create Survey/DashboardController
- Build survey/dashboard.blade.php
- Add new workflow-aware routes
- Enhance survey/_survey-header.blade.php
🗺 Roadmap — What’s Next:
- Event-Based Programming
- Survey Listeners
🚀 This episode is a key turning point — transforming the app from features to a true workflow-driven system.
If you care about maintainable Laravel applications, this one’s for you.
💥 About the Series:
Pragmatic Laravel focuses on building real applications with Laravel — emphasizing clarity, maintainability, and thoughtful design decisions instead of shortcuts or magic.
#Laravel #PragmaticLaravel #PHP #CleanCode #TekCasts
laravel,php
31m:43s
Dec 25, 2025
Take Survey Fingerprinting
In this episode of Laravel: The Pragmatic Way, we explore how to generate a unique “fingerprint” for survey participants using a combination of PHP and JavaScript signals.You’ll learn what fingerprinting is, why it matters, the ethical considerations, and how to integrate a JavaScript fingerprinting library into your Laravel workflow.
🧠 What You’ll Learn
- A method of producing a unique identifier using user “signals.”
- Why fingerprinting must be handled with caution — privacy, consent, regulation concerns.
- Which data you can access server-side vs client-side.
- Including adding routes, generating fingerprints, and pre-filling survey responses.
🪪 Example Signals
- PHP Signals (server-side): IP address, User-Agent, Accept-Language, Accept headers, Referer header, Cookies
- JavaScript Signals (client-side): Everything PHP offers plus installed fonts, plugins/extensions, platform info, screen resolution, OS, touch capabilities, GPU/audio/video data, and more.
🛠️ Survey Workflow Changes
1. Install the JS Fingerprinting Library: https://github.com/jackspirou/clientjs
2. Update the route /s/{survey:hash}
- No longer shows questions directly
- Generates the fingerprint
- Provides a “Take Survey” link: /s/{survey:hash}/{fingerprint}
3. Create the route /s/{survey:hash}/{fingerprint}
- Ensures a SurveyResponse record exists
- Passes SurveyResponse + SurveyResponseAnswers to the view
- Pre-fills previous answers automatically
💥 About the Series:
Pragmatic Laravel focuses on building real applications with Laravel — emphasizing clarity, maintainability, and thoughtful design decisions instead of shortcuts or magic.
#Laravel #PHP #WebDevelopment #Fingerprinting #Security #Controllers #Forms #JavaScript #FullStackDevelopment #TekCasts #LearnLaravel #Routes #SurveyApp
javascript
10m:47s
Aug 26, 2025
Template Literals
Say goodbye to clunky string concatenation! In this episode, you’ll discover template literals — a modern way to handle strings in JavaScript that makes your code cleaner and easier to read.🎯 What you’ll learn:
Backtick (`) syntax — the foundation of template literals.
Variable interpolation — insert variables directly into strings.
Multi-line strings — create readable text without messy \n escapes.
Expressions & functions — embed calculations or function calls right inside your strings.
💡 Why it matters:
Template literals are one of those “quality of life” features you’ll use everywhere — from building user messages to formatting HTML templates. Once you start, you’ll never want to go back to + string concatenation.
By the end of this episode, you’ll be writing strings that are not just smarter, but also more expressive. ⚡️
linux
12m:34s
Feb 3, 2025
Terminal - Shells, Basics, Help
This video is part of the Linux Crash Course series. This video will introduce the Linux Terminal and how to efficiently navigate command history, cursor position, and how to obtain help on any command.Github Repo: https://github.com/rcravens/linux-crash-course
linux
15m:3s
Feb 3, 2025
Text Editors - Nano, Vim, Emacs
This video is part of the Linux Crash Course series. This video will continue exploring the Linux File System. In this video I will introduce three common text editors found on Linux systems.Github Repo: https://github.com/rcravens/linux-crash-course
browser,javascript
13m:16s
Sep 23, 2025
The Event Loop
JavaScript may look simple, but under the hood it’s powered by the Event Loop — the secret sauce that lets your code juggle tasks, handle async operations, and keep your apps responsive. In this video, we’ll break down exactly how it works (without frying your brain 🥓).Here’s what you’ll learn:
📚 Call stack basics – how functions get pushed, popped, and executed
⏱️ Synchronous vs asynchronous execution – what runs now vs what runs later
🕒 Macrotasks – like setTimeout and setInterval
⚡ Microtasks – like Promises and queueMicrotask
🧪 A hands-on demo where we predict and then prove the order of console logs using timers & promises
You’ll finally understand:
✅ Why some logs show up before you expect them
✅ Why promises are “faster” than timeouts
✅ How the browser keeps things efficient, even when you’re spamming microtasks
By the end, you’ll see the Event Loop not as magic, but as your best friend in building smooth, non-blocking web apps 🚀
👉 Watch now and unlock the inner workings of JavaScript’s brain 🧠⚡
javascript,node
14m:26s
Oct 21, 2025
The HTTP Module
Every web app starts with a server — and in Node.js, that journey begins with the HTTP module. In this episode of JavaScript on the Server, we’ll peel back the curtain on how requests and responses actually flow between the browser and your app.✨ What you’ll learn:
- Why the HTTP module is the core engine of Node.js servers
- How the client-server request/response cycle really works
- Building a minimal web server from scratch (no frameworks required!)
- Getting hands-on with the req (IncomingMessage) and res (ServerResponse) objects
- Key concepts to set you up for routing, APIs, and beyond
Whether you’re new to backend dev or just curious how Node powers the web, this episode will give you the foundation you need to level up.
📚 Helpful Links
- Node.js HTTP Module: https://nodejs.org/api/http.html
- Request/Response Cycle Overview: https://backend.turing.edu/module2/lessons/how_the_web_works_http
- Node.js HTTP Request Object: https://www.w3schools.com/nodejs/nodejs_http.asp
- Node.js HTTP Response Object: https://www.w3schools.com/nodejs/obj_http_serverresponse.asp
🔗 More TekCasts Learning
- JavaScript for Beginners: https://tekcasts.com/play/javascript-for-beginners-what-is-javascript
- JavaScript in the Browser: https://tekcasts.com/play/javascript-in-the-browser-browser-runtime-environment
browser,javascript
11m:4s
Sep 25, 2025
Timers and Intervals
Timers are everywhere in JavaScript: countdowns, clocks, animations, polling APIs… but they don’t always behave the way you expect. In this video, we break them down so you can use them with confidence.You’ll learn:
⏳ setTimeout – schedule code to run later
🔁 setInterval – repeat actions at intervals
❌ Canceling timers – clearTimeout, clearInterval
🧑💻 Real-world use cases – clocks, countdowns, polling APIs
⚠️ Pitfalls – interval drift, blocked UI, when not to rely on timers
We’ll demo:
- Building a start/pause digital clock
- Defusing a “time bomb” ⏱💣 with clearTimeout
- Seeing timer drift in action when the event loop is overloaded
By the end, you’ll know not just how to use timers—but how to spot when they lie to you 🕵️♂️
oop,php
5m:17s
Mar 25, 2025
Traits
Ever struggled with duplicate code across multiple classes? What if you can’t put it in a base class? 🤔 PHP doesn’t support multiple inheritance, but fear not—Traits come to the rescue! 🦸♂️In this video, we’ll identify duplicate logic, discuss why it doesn’t belong in the base class, and then refactor using a Trait to keep our code clean, reusable, and DRY! 💡✨
By the end, you’ll be wielding Traits like a pro! 🏆 Let’s dive in! 🎥
oop,php
19m:17s
Jul 3, 2025
Uploading Photos
🔒 UI Adjustments Based on Auth State• Hide the notification bell in the top nav if the user isn’t logged in
🧭 Routing & Form Setup
• Create an /upload route
• Set the form’s action and stub in the store() method with a dd($_POST) to start
• Remove the unused “title” field from the upload form
🧪 Validation Process
• Define validation for the uploaded photo:
$file = validate('photo')->file($allowed_mimes)->max(4016053)->required();
• Add $allowed_mimes and $max_file_size constants to the Photo model
• Implement file() and update the max() method in the Validation class
• Fix Validation::clean_value() to properly handle file inputs
⚠️ Missing Validation Messages
• Ensure validation errors are displayed in these views:
• registration.index
• auth.index
• upload.index
💾 File Storage & DB Entry
• Save the uploaded file to the appropriate location
• Create a new photo record in the database
🚫 .gitignore Update
• Add public/photos to the .gitignore file to prevent uploaded files from being committed
⸻
📌 And that completes the upload feature, bringing us to v25-upload-photos. Ready to show off some pictures!
oop,php
9m:3s
Jun 26, 2025
User Authentication
📁 Controller Setup- Create a new AuthenticationController inside Http/ with three methods:
- login() – shows the login form
- authenticate() – handles login logic
- logout() – clears user session
📄 View
- Add views/login/index.view.php to render the login form
🔀 Routing
- Register the necessary routes:
- GET /login → shows the login form
- POST /login → processes authentication
- POST /logout (or GET) → logs the user out
🧠 Authentication Logic
- Inside authenticate():
- Validate email and password inputs
- Lookup user by email from the database
- Use password_verify() to check if password matches
- On success → Session::login($user_id)
- On failure → redirect back with error message
🔐 Session Enhancements
- Add login($user_id) to store user ID in session
- Add logout() to destroy the session cleanly
📌 And that lands us at v23-authentication.
linux
19m:42s
Feb 3, 2025
User Permissions - Access Control Lists (ACL)
This video is part of the Linux Crash Course series. This video will cover Access Control Lists or ACLs to apply permissions at a granular level.Github Repo: https://github.com/rcravens/linux-crash-course
oop,php
20m:42s
Jun 24, 2025
User Registration
🔹 Controller Setup- Create a new RegistrationController inside Http/, with index() and store() methods
- index() displays the registration form
- store() temporarily calls dd($_POST) to confirm input
🔹 View
- Add the form view at views/registration.index.view.php
🔹 Validation
- Write validation rules in fluent style:
- $email = validate('email')->email()->required()->unique('users', 'email');
- Build out the validation logic to support this pattern
🔹 User Model
- Create a Models/User class
- Move relevant DB logic from the controller into the model
🔹 Model Base Enhancements
- In the Model base class:
- Add $is_count to build_query()
- Implement a count() method that supports basic tallying
- In the Database class:
- Add a count() method to execute counting queries
- Add a unique() validation method using model and count
🔹 Data Insertion
- Assemble a $data array with validated inputs
- Call User::insert($data) to create the new user
That’ll wrap up the registration feature and land us at v22-registering-users 🏁
linux
1m:45s
Feb 3, 2025
Users and Permissions - Groups, Users, Sudo, Files
This video is part of the Linux Crash Course series. This video will cover user management features.Github Repo: https://github.com/rcravens/linux-crash-course
javascript,node
9m:24s
Nov 13, 2025
Using EJS Templates
EJS (Embedded JavaScript) is one of the simplest ways to generate dynamic HTML on the server — without the chaos of string concatenation. 💡In this episode, we’ll walk through how to:
✅ Install and configure EJS in a Node.js project
✅ Embed JavaScript directly inside HTML templates
✅ Use loops and conditionals for dynamic content
✅ Render full pages from data
✅ Create reusable layouts and partials for cleaner structure
By the end, you’ll know how to serve fully rendered HTML from your Node.js server using EJS — the perfect first step toward clean, maintainable server-side rendering (SSR).
💡 Relevant Links
Previous TekCasts series:
- JavaScript for Beginners: https://tekcasts.com/play/javascript-for-beginners-what-is-javascript
- JavaScript in the Browser: https://tekcasts.com/play/javascript-in-the-browser-browser-runtime-environment
Official Docs & Resources:
- EJS Docs: https://ejs.co/
- Node.js Documentation: https://nodejs.org/en/docs/
- MDN JavaScript Guide: https://developer.mozilla.org/en-US/docs/Web/JavaScript
Coming Soon
laravel,php
18m:18s
Jan 8, 2026
Validation Errors
Welcome back to Laravel: The Pragmatic Way!In this episode, we build on our Form Request workflow and focus on how Laravel handles validation errors — and how you can present them cleanly in your UI.
We walk through the full flow: triggering errors, displaying them, styling them, and customizing their messages.
🎯 What You’ll Learn
- How Laravel automatically redirects back with validation errors
- Displaying all errors at the top of the page
- Field-specific error messages using Blade directives
- Highlighting invalid fields for better UX
- Creating custom error messages inside your Form Request
- Updating question components to surface validation issues cleanly
If you’re enjoying the series, hit 👍 Like, 🔔 Subscribe, and share with other Laravel devs!
💥 About the Series:
Pragmatic Laravel focuses on building real applications with Laravel — emphasizing clarity, maintainability, and thoughtful design decisions instead of shortcuts or magic.