- Home
- Build With Me
- Learn
Build With Me · Learn
Learn to build, level by level.
Nine levels, from basic vocabulary to running a product. Each level points to what really exists to learn it: Build School for the web, official documentation and this site’s guides for Apple and AI.
The levels
From zero to a running product.
Measured AI features and automations.
- 0
Computer and development fundamentals
Files and folders, the terminal, what a server, a database and an API are — the vocabulary that keeps you from getting lost.
- AvailableThe limits of AI in web development
- 1
Programming foundations
Variables, functions, conditions, collections, types — in your platform’s language.
- AvailableThe TypeScript HandbookMicrosoft
- 2
Git, GitHub and development environments
Version every step, go back, work with a coding agent without losing control.
- AvailableGitHub — Get startedGitHub
- 3
Platform-specific development
Screens, state, navigation and your platform’s conventions.
- 4
Databases and backend engineering
Modelling data, authentication, authorization and integrations.
- 5
Deployment and distribution
Going live, distributing a beta, submitting to a store.
- AvailableShipping an AI feature to production
- 6
Product architecture
Where rules, data and responsibilities live — and what makes a change safe.
- AvailableWhen should a SaaS use AI?
- 7
Production software engineering
Tests, security, error monitoring, proven launch readiness.
- 8
Operating and growing a digital product
Analytics, search visibility, user feedback, release rhythm.
- PlannedA Bynilson guide to operating an AI product
Formats
Written first, never audio only.
- Step-by-step written guides
- Checklists to tick
- Verified code samples
- Captioned screen recordings (in Build School)
- Practice projects
- No narration-only lessons
Starters
Starting points that really exist.
A starter is marked available only when its files and instructions exist. The others are planned, and labelled as such.
SwiftUI basic app (iOS)A task list: an @Observable model shared through the environment, add, check, delete, empty state.Available · iOS 17+
- Requirements
- A Mac with Xcode 26 or later.
- Supported versions
- iOS 17+
- Environment variables
- None.
- Security
- No data leaves the device and nothing is saved: tasks disappear when the app closes. Add SwiftData to keep them.
- Licence
- MIT
- Maintenance
- Reviewed with every major Xcode release.
Setup
- In Xcode: File → New → Project → iOS → App. Interface: SwiftUI. Any name.
- Set the deployment target (Minimum Deployments) to iOS 17 or later.
- Replace the whole content of <Name>App.swift with the code below, and delete ContentView.swift (the starter contains it).
- Run with ⌘R on a simulator, then on your iPhone (a free Apple Account is enough to test on your own device).
import SwiftUI
import Observation
@main
struct StarterApp: App {
@State private var store = TaskStore()
var body: some Scene {
WindowGroup {
ContentView()
.environment(store)
}
}
}
struct TaskItem: Identifiable, Hashable {
let id = UUID()
var title: String
var isDone = false
}
@Observable
final class TaskStore {
var items: [TaskItem] = []
func add(_ title: String) {
let trimmed = title.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty else { return }
items.append(TaskItem(title: trimmed))
}
func toggle(_ item: TaskItem) {
guard let index = items.firstIndex(where: { $0.id == item.id }) else { return }
items[index].isDone.toggle()
}
func delete(at offsets: IndexSet) {
items.remove(atOffsets: offsets)
}
}
struct ContentView: View {
@Environment(TaskStore.self) private var store
@State private var draft = ""
var body: some View {
NavigationStack {
List {
Section {
HStack {
TextField("New task", text: $draft)
.onSubmit(addDraft)
Button("Add", action: addDraft)
.disabled(draft.trimmingCharacters(in: .whitespaces).isEmpty)
}
}
Section {
if store.items.isEmpty {
ContentUnavailableView("No tasks yet", systemImage: "checklist", description: Text("Add your first task above."))
}
ForEach(store.items) { item in
Button {
store.toggle(item)
} label: {
Label(item.title, systemImage: item.isDone ? "checkmark.circle.fill" : "circle")
}
.accessibilityValue(item.isDone ? "Done" : "Not done")
}
.onDelete(perform: store.delete)
}
}
.navigationTitle("Tasks")
}
}
private func addDraft() {
store.add(draft)
draft = ""
}
}
#Preview {
ContentView()
.environment(TaskStore())
}
Typechecked: Xcode 27.1 (iOS SDK 27.1, macOS SDK 27.0), Swift 5 and Swift 6 modes — 2026-10-23