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

oop,php
25m:6s
Jun 10, 2025
Sessions / Redirects / Flash Messages
Now that users can submit reviews, let’s give them feedback! In this video, we bring in sessions, redirects, and flash messaging to guide the user experience after form submissions. ✨Here’s what gets built in version v18-redirects-with-flash:
- Create a Session class as a singleton, with a handy global session() helper 🔐
- Initialize the session at app start and build a clean API like:
- session()->error('Missing required parameters.')->redirect('/');
- Implement error() and redirect() methods for smooth flow and messaging
- Fix the issue of persistent flash messages by introducing delete_transient_data() to clear session data after one request cycle
- Use Alpine.js to display flash messages dynamically with a snappy user experience ⚡
- Create a reusable _flash.view.php layout file for flash UI 💡
- Hook flash messages into the review flow by updating all dd('TODO') redirects in the PhotoController
- Bonus: Add current_route support in the Router to improve context-awareness in views 🧭
With sessions and flash messages in place, your app now speaks back to the user—clear, friendly, and fast. 🚀

javascript
6m:24s
Apr 17, 2025
Setting Up The Environment
Before we dive deep into coding magic, we need a proper space to create it! In this episode, we’ll set up a clean and powerful JavaScript development environment so you can code confidently from the start. 🛠️✨🚀 Here’s what we’ll cover:
• Introduce two popular code editors: Visual Studio Code and WebStorm. You can choose either one to follow along comfortably!
• I’ll be using WebStorm throughout this series for demonstrations.
• Set up your first project folder called js-beginners, and create two important files inside: index.html and script.js.
• Learn how to open your HTML file in the browser and access the browser developer tools to run and inspect your JavaScript code.
• Connect your external JavaScript file to your HTML page so your scripts come alive right inside the browser console!
🎥 Visual Walkthroughs:
• We’ll create the project structure together, step-by-step.
• Open the browser console and verify everything’s working.
• Highlight important parts of the editor and project setup to keep things clean and organized.
By the end of this episode, you’ll have your environment ready, your first files created, and the confidence to start coding with JavaScript! 🚀

github,package,php
14m:42s
Mar 11, 2025
Setting Up the Package Structure
In this video, we start coding! 🚀 We’ll create the necessary directory structure, initialize a Git repository, and write the initial code for our PHP package.📌 What you’ll learn:
✅ Setting up the directory structure
✅ Initializing a Git repository
✅ Writing the first version of the package
💡 By the end of this video, you’ll have a solid foundation for your package!
🔔 Subscribe for more PHP tutorials!
🔗 Resources:
• GitHub: Getting Started

php
13m:4s
Mar 17, 2025
Setup a Development Environment
Before you start coding in PHP, you need the right tools! In this video, we’ll guide you through setting up a local development environment step by step. You’ll learn how to install PHP, set up a local server using XAMPP, MAMP, or the built-in PHP server, and explore containerized options like Docker. We’ll also discuss different code editors, from lightweight options like Sublime Text to powerful IDEs like PHPStorm and Visual Studio Code. By the end of this video, you’ll have everything configured and ready to start coding in PHP like a pro! 🚀
esp32
23m:9s
Apr 4, 2025
Software
Now that the hardware’s wired up, it’s time to breathe life into the Smart Garage Door with code! 🚀In this episode, we walk through the entire software that powers the project — written with clean, object-oriented design to keep things modular and maintainable 🧼👨💻.
We do a full code review and break down the key classes that make everything tick:
🔹 DoorSensor – encapsulates logic for detecting the door’s position
🔹 DoorButton – handles interactions with the door opener button
🔹 GarageDoor – the high-level controller that integrates with Apple Home using HomeSpan. It pulls it all together and exposes the device as a HomeKit accessory 🍏🏠
You’ll see how these components work together — and how dependency injection keeps things clean by passing DoorSensor and DoorButton instances right into the GarageDoor class constructor.
Whether you’re into embedded dev, smart home integrations, or just love clean code, this video dives into the software heart of the project. Let’s build smart! 💡💻

oop,php
3m:15s
Apr 15, 2025
Static HTML to PHP
It’s time to bring our static site to life! In this video, we take the first step toward dynamic content by converting our plain HTML files into PHP. 🧩Here’s what we’ll cover:
• Renaming .html files to .php ✅
• Updating the navigation links in two key places on each page for consistency 🔗
By the end of this video, our project will be PHP-ready and set up for future enhancements. This version is tagged in the repo as v2-php-files for easy reference. 🏷️
It’s a small change with big impact—let’s keep the momentum going! 🚀

oop,php
17m:24s
Mar 26, 2025
Static Methods and Properties
Ever wondered when to use static properties and methods? 🤔 In this video, we break it all down! 🔍We’ll start with a quick refresher on normal properties and methods, then dive into their static counterparts. 🏗️ What’s the difference? Static members belong to the class—shared across all instances—while normal members are instance-specific. 🌎➡️📦
But wait—static properties aren’t constants! ⚠️ We’ll explore constant properties using const and discuss real-world use cases where static methods shine. ✨
By the end, you’ll know exactly when and why to use static members in your PHP projects! 💡💻 Let’s go! 🎬

oop,php
29m:47s
Jun 5, 2025
Submitting Reviews
It’s time to let users have their say! In this video, we implement the “Leave a Review” feature, allowing users to submit feedback on photos directly from the app. 💬Here’s what’s packed into version v17-leave-review:
Add a POST route to handle form submissions 🛤️
Stub out the PhotoController::store method as our entry point for review handling
Wire up the review form and hook it into the controller 🧵
Introduce basic validation to catch missing fields or bad data 🧼
Add temporary dd('TODO') calls as placeholders for future redirects
Build the SQL insert logic using the photo_id from the query string 🔗
Validate that the photo exists before inserting a review to maintain data integrity 🔒
Refactor the Database class:
Rename exec() to raw() for clarity
Add a new execute() method to handle parameterized inserts and return the number of affected rows ⚙️
By the end of this video, users can leave their thoughts—and our app takes one more step toward being fully interactive. 🌟

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

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 🏁