- 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.
Websites, web apps, SaaS — with Build School.
- 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.
- Build SchoolBuild School N1 — Bienvenue : comment Build School fonctionneIn French
- Build SchoolBuild School N2 — Définir ton produitIn French
- AvailableMDN — Learn web developmentMozilla
- 1
Programming foundations
Variables, functions, conditions, collections, types — in your platform’s language.
- AvailableThe TypeScript HandbookMicrosoft
- Build SchoolBuild School N3 — Réduire le périmètre de la V1In French
- Build SchoolBuild School N4 — Comprendre ton architectureIn French
- 2
Git, GitHub and development environments
Version every step, go back, work with a coding agent without losing control.
- Build SchoolBuild School N5 — Dépôt + agent de codeIn French
- AvailablePro Git (book)Git
- 3
Platform-specific development
Screens, state, navigation and your platform’s conventions.
- Build SchoolBuild School N8 — Le parcours principalIn French
- AvailableReact — LearnMeta / React
- 4
Databases and backend engineering
Modelling data, authentication, authorization and integrations.
- Build SchoolBuild School N6 — Base de donnéesIn French
- Build SchoolBuild School N7 — AuthentificationIn French
- Build SchoolBuild School N9 — Autorisation & sécuritéIn French
- Build SchoolBuild School N10 — PaiementsIn French
- Build SchoolBuild School N11 — EmailsIn French
- 5
Deployment and distribution
Going live, distributing a beta, submitting to a store.
- Build SchoolBuild School N15 — DéploiementIn French
- 6
Product architecture
Where rules, data and responsibilities live — and what makes a change safe.
- 7
Production software engineering
Tests, security, error monitoring, proven launch readiness.
- Build SchoolBuild School N14 — Erreurs & Debug ModeIn French
- Build SchoolBuild School N16 — ShipCheck & Ship PassportIn French
- Build SchoolBuild School N17 — LancementIn French
- AvailableShipCheck — is your app production-ready? (in French)
- AvailableOWASP ASVSOWASP
- 8
Operating and growing a digital product
Analytics, search visibility, user feedback, release rhythm.
- Build SchoolBuild School N12 — AnalyticsIn French
- PlannedBuild School N13 — SEO & métadonnéesPlanned: Début 2027 · in French
- PlannedBuild School N18 — Surveiller & améliorerPlanned: Début 2027 · in French
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