W3docs

Learn Flutter & Dart to Build iOS & Android Apps

A Complete Guide to the Flutter SDK & Flutter Framework for building native iOS and Android apps

Start course

Join the most comprehensive & bestselling Flutter course and learn how to build amazing iOS and Android apps!

You don't need to learn Android/ Java and iOS/ Swift to build real native mobile apps!

Flutter - a framework developed by Google - allows you to learn one language (Dart) and build beautiful native mobile apps in no time. Flutter is a SDK providing the tooling to compile Dart code into native code and it also gives you a rich set of pre-built and pre-styled UI elements (so called widgets) which you can use to compose your user interfaces.

Flutter is extremely trending and gets used for major Google apps like their Adwords app - it's now marked as "ready for production", hence now is the time to jump in and learn it!

This course will teach Flutter & Dart from scratch, NO prior knowledge of either of the two is required! And you certainly don't need any Android or iOS development experience since the whole idea behind Flutter is to only learn one language.

You'll learn Flutter not only in theory but we'll build a complete, realistic app throughout this course. This app will feature both all the core basics as well as advanced features like using Google Maps, the device camera, adding animations and more!

With Flutter, you'll be able to write code only once and ship your apps both to the Apple AppStore and Google Play.

Use Google's Material Design to build beautiful, yet fully customizable, apps in no time with almost zero effort. You can use the rich widget suite Flutter provides to add common UI elements like buttons, switches, forms, toolbars, lists and more - or you simply build your own widgets - Flutter makes that a breeze, too.

Here's what's included in the course:

  • Detailed setup instructions for both macOS and Windows
  • A thorough introduction to Flutter, Dart and the concept behind widgets
  • An overview of the built-in widgets and how you may add your own ones
  • Debugging tipps & tricks
  • Page navigation with tabs, side drawers and stack-based navigation
  • State management solutions
  • Handling and validating user input
  • Connecting your Flutter app to backend servers by sending Http requests
  • User authentication
  • Adding Google Maps
  • Using native device features like the camera
  • Adding beautiful animations & page transitions
  • How to publish your app to the app stores
  • And more!

This course is for you if ...

  • You're interested in building real native mobile apps for the two most popular mobile platforms - iOS and Android
  • You want to explore the full set of features Flutter offers
  • Don't want to spend hours learning two completely different languages

Course content

Section 1Introduction

  • Introduction
    1:40
  • What is Flutter?
    5:54
  • Understanding the Flutter Architecture
    4:47
  • How Flutter & Dart Code Gets Compiled To Native Apps
    3:12
  • Join our Online Learning Community
    1:00
  • Understanding Flutter Versions
    2:49
  • Flutter macOS Setup
    19:35
  • macOS Development Environment
    4:08
  • Flutter Windows Setup
    31:46
  • Windows Development Environment
    3:45
  • Flutter & Material Design
    1:15
  • Flutter Alternatives
    6:06
  • Course Outline
    6:40
  • How To Get The Most Out Of The Course
    2:40
  • Useful Resources & Links
    1:00

Section 2Flutter Basics [QUIZ APP]

  • Module IntroductionPremium
    2:25
  • Creating a New ProjectPremium
    12:15
  • An Overview of the Generated Files & FoldersPremium
    8:20
  • Analyzing the Default AppPremium
    5:32
  • Dart BasicsPremium
    17:17
  • More Dart BasicsPremium
    13:06
  • Quiz 1: Dart FundamentalsPremium
    1:00
  • Building an App From ScratchPremium
    11:02
  • Running the App on an EmulatorPremium
    3:25
  • Class Constructors & Named ArgumentsPremium
    8:29
  • First Summary & Additional SyntaxPremium
    8:10
  • Quiz 2: Flutter App BasicsPremium
    1:00
  • Building a Widget TreePremium
    7:40
  • Visible (Input / Output) & Invisible (Layout / Control) WidgetsPremium
    3:13
  • Adding Layout WidgetsPremium
    6:52
  • Quiz 3: Widget BasicsPremium
    1:00
  • Connecting Functions & ButtonsPremium
    7:30
  • Anonymous FunctionsPremium
    3:20
  • Updating Widget Data (Or: Using StatelessWidget Incorrectly)Premium
    6:36
  • [DART DEEP DIVE] Understanding ListsPremium
    1:00
  • Updating Correctly with Stateful WidgetsPremium
    11:58
  • Quiz 4: Stateful & Stateless WidgetsPremium
    1:00
  • A Brief Look Under The HoodPremium
    2:27
  • Using Private PropertiesPremium
    5:16
  • Creating a New, Custom WidgetPremium
    11:50
  • First Styling & Layouting StepsPremium
    8:01
  • Enums & Multiple ConstructorsPremium
    4:06
  • Official Docs & The Widget CatalogPremium
    2:39
  • Passing Callback Functions AroundPremium
    10:38
  • Introducing MapsPremium
    5:52
  • Mapping Lists to WidgetsPremium
    10:24
  • final vs constPremium
    10:50
  • Quiz 5: Advanced Flutter & Dart BasicsPremium
    1:00
  • Introducing "if" StatementsPremium
    6:51
  • [DART DEEP DIVE] More on "if" StatementsPremium
    11:15
  • [DART DEEP DIVE] The "null" ValuePremium
    2:03
  • Outputting Widgets ConditionallyPremium
    2:20
  • Splitting the App Into WidgetsPremium
    9:57
  • Calculating a Total ScorePremium
    7:46
  • Getters & "else-if"Premium
    6:34
  • Resetting the QuizPremium
    4:53
  • Assignment - Basics (Problem)Premium
    1:55
  • Assignment - Basics (Solution)Premium
    12:45
  • Wrap UpPremium
    1:53
  • Useful Resources & LinksPremium
    1:00

Section 3Running Apps on Different Devices & Debugging Apps

  • Module IntroductionPremium
    2:00
  • Running the App on a Real Android DevicePremium
    3:56
  • Running the App on an iOS EmulatorPremium
    5:54
  • Running the App on a Real iOS DevicePremium
    1:52
  • Working with the Emulators / Using the EmulatorsPremium
    2:25
  • Understanding Error Messages & Fixing ErrorsPremium
    5:27
  • Using the DebuggerPremium
    6:21
  • Getting Started with the Dart DevToolsPremium
    4:54
  • Understanding the Repaint RainbowPremium
    3:23
  • Wrapping up the Dart DevToolsPremium
    1:34
  • Useful Resources & LinksPremium
    1:00

Section 4Widgets, Styling, Adding Logic - Building a Real App [PERSONAL EXPENSES APP]

  • Module IntroductionPremium
    3:19
  • An Overview of the Core Flutter WidgetsPremium
    9:42
  • Planning the AppPremium
    2:43
  • Combining WidgetsPremium
    9:18
  • Understanding Column AlignmentPremium
    6:11
  • Quiz 6: Columns & RowsPremium
    1:00
  • Not a Widget: Adding a Transaction Model & Transaction DataPremium
    8:28
  • Mapping Data Into WidgetsPremium
    3:39
  • Building a Custom List ItemPremium
    5:26
  • Styling a ContainerPremium
    5:12
  • Styling TextPremium
    2:46
  • More Styling!Premium
    1:55
  • Quiz 7: Styling Time!Premium
    1:00
  • Containers vs Columns vs RowsPremium
    3:38
  • Using String InterpolationPremium
    5:21
  • Installing External Packages & Formatting DatesPremium
    7:29
  • Adding Text Input Widgets (TextField)Premium
    9:41
  • Fetching User InputPremium
    9:29
  • Splitting the App Into WidgetsPremium
    12:44
  • Connecting Widgets & Managing Data / StatePremium
    6:33
  • Adding User Transactions to the ListPremium
    3:58
  • Making the List Scrollable!Premium
    6:11
  • Working with ListViewsPremium
    12:02
  • Quiz 8: Lists, Scrolling & Text InputPremium
    1:00
  • Further Input & Output Styling and ConfigurationPremium
    8:28
  • Adding AppBar Buttons & Floating Action ButtonsPremium
    4:32
  • Showing a Modal Bottom SheetPremium
    9:32
  • Improving & Styling the Modal Bottom SheetPremium
    6:30
  • Configuring & Using ThemesPremium
    8:41
  • Custom Fonts & Working with Text ThemesPremium
    11:07
  • Quiz 9: ThemingPremium
    1:00
  • Adding Images to the AppPremium
    7:57
  • Planning the Chart WidgetPremium
    4:22
  • Looping Through ListsPremium
    13:47
  • Deriving Recent TransactionsPremium
    7:24
  • Creating Bars for our ChartPremium
    10:59
  • Populating the Chart with ValuesPremium
    6:19
  • Finishing the Chart BarsPremium
    5:25
  • Flexible & Expanded: Deep DivePremium
    10:23
  • Adding a ListTile WidgetPremium
    5:29
  • Improving the Overall ChartPremium
    3:08
  • Widgets & Configuring Widgets - Summary / OverviewPremium
    5:07
  • Getting Started with Date SelectionPremium
    5:19
  • Showing a DatePickerPremium
    11:13
  • Adding Transactions with a DatePremium
    3:07
  • Deleting Transactions & Using IconButtonsPremium
    7:02
  • Final Polishing!Premium
    5:34
  • Wrap UpPremium
    3:54
  • Useful Resources & LinksPremium
    1:00

Section 5Responsive & Adaptive User Interfaces and Apps

  • Module IntroductionPremium
    1:37
  • What does "Responsive" and "Adaptive" Mean?Premium
    5:55
  • Examples: Where we could improve the App!Premium
    3:04
  • Calculating Sizes DynamicallyPremium
    9:13
  • Using the LayoutBuilder WidgetPremium
    7:43
  • Quiz 10: ResponsivenessPremium
    1:00
  • Controlling the Device OrientationPremium
    4:19
  • Rendering Alternative Landscape ContentPremium
    4:42
  • Finishing Landscape ModePremium
    2:58
  • Showing Different Content Based on Device OrientationPremium
    5:33
  • Respecting the Softkeyboard InsetsPremium
    3:43
  • Using the Device Size in ConditionsPremium
    4:10
  • Managing the MediaQuery ObjectPremium
    2:06
  • Checking the Device PlatformPremium
    5:36
  • Using Cupertino (iOS) WidgetsPremium
    9:05
  • Using the SafeAreaPremium
    1:43
  • More Cupertino StylesPremium
    3:09
  • Using Cupertino ButtonsPremium
    3:11
  • Creating Custom Adaptive WidgetsPremium
    5:04
  • Quiz 11: Adaptive WidgetsPremium
    1:00
  • Wrap UpPremium
    1:43
  • Useful Resources & LinksPremium
    1:00

Section 6Widget & Flutter Internals - Deep Dive

  • Module IntroductionPremium
    2:32
  • The Problem At HandPremium
    3:13
  • Widget Tree & Element Tree - What, Why and How?Premium
    10:45
  • How Flutter Rebuilds & Repaints the ScreenPremium
    8:48
  • How Flutter Executes build()Premium
    9:18
  • Using "const" Widgets & ConstructorsPremium
    11:16
  • Quiz 12: Widgets, Elements, build()Premium
    1:00
  • Writing Good CodePremium
    3:57
  • Extracting WidgetsPremium
    6:07
  • Using Builder MethodsPremium
    10:21
  • Assignment - Builder Methods (Problem)Premium
    0:32
  • Assignment - Builder Methods (Solution)Premium
    1:46
  • Understanding the Widget LifecyclePremium
    12:55
  • Understanding the App LifecyclePremium
    9:25
  • Understanding ContextPremium
    6:46
  • A Problem with Lists & Stateful WidgetsPremium
    5:34
  • Understanding the Problem RootPremium
    5:09
  • Using KeysPremium
    11:15
  • Quiz 13: Keys, Lists, Stateful WidgetsPremium
    1:00
  • Wrap UpPremium
    1:41
  • Useful Resources & LinksPremium
    1:00

Section 7Navigation & Multiple Screens [MEALS APP]

  • Module IntroductionPremium
    2:23
  • Planning the AppPremium
    4:45
  • Starting With The App - Adding Base DataPremium
    11:18
  • Creating a Grid & Working with Linear GradientsPremium
    7:49
  • Registering a Screen as the Main ScreenPremium
    3:10
  • Styling & ThemingPremium
    7:04
  • Navigating to a New PagePremium
    10:10
  • Passing Data via the ConstructorPremium
    2:38
  • Using Named Routes & Passing Data With Named RoutesPremium
    6:42
  • Quiz 14: Screens & NavigationPremium
    1:00
  • Diving Deeper into Named RoutesPremium
    2:46
  • Adding a Meal Model & DataPremium
    12:44
  • Selecting Meals for a Chosen CategoryPremium
    4:56
  • Displaying Recipe Items & Using Network ImagesPremium
    14:59
  • Finishing the Meal List ItemPremium
    15:21
  • Navigating to the Meal Detail PagePremium
    7:17
  • onGenerateRoute & onUnknownRoutePremium
    5:27
  • Quiz 15: More Navigation!Premium
    1:00
  • Finishing the Meal Detail PagePremium
    17:34
  • Adding a TabBar to the AppbarPremium
    10:26
  • Adding a Bottom TabBarPremium
    13:12
  • Adding a Custom DrawerPremium
    12:37
  • Adding Links to the DrawerPremium
    4:03
  • Quiz 16: Tabs & Drawers!Premium
    1:00
  • Replacing Pages (Instead of Pushing)Premium
    6:01
  • Popping Pages & Passing Data BackPremium
    17:06
  • Quiz 17: Replacing, Popping & DataPremium
    1:00
  • Adding Filter SwitchesPremium
    8:31
  • Adding Filtering LogicPremium
    16:19
  • Adding a "Mark as Favorite" FeaturePremium
    19:57
  • A Problem!Premium
    2:40
  • Wrap UpPremium
    2:55
  • Useful Resources & LinksPremium
    1:00

Section 8State Management [SHOP APP]

  • Module IntroductionPremium
    2:13
  • Planning the AppPremium
    6:55
  • Defining a Data ModelPremium
    6:32
  • Working on the "Products" Grid & Item WidgetsPremium
    16:24
  • Styling & Theming the AppPremium
    5:14
  • Adding Navigation to the AppPremium
    10:30
  • Why State Management? And what is "State" and "State Management"?Premium
    6:29
  • Understanding the "Provider" Package & ApproachPremium
    2:55
  • Working with Providers & ListenersPremium
    21:09
  • [DART DEEP DIVE] Inheritance ("extends") vs Mixins ("with")Premium
    6:23
  • Providing non-ObjectsPremium
    1:00
  • Listening in Different Places & WaysPremium
    5:58
  • Quiz 18: State, State Management & The Provider Package/ ApproachPremium
    1:00
  • Using Nested Models & ProvidersPremium
    13:03
  • Exploring Alternative Provider SyntaxesPremium
    6:55
  • Using "Consumer" instead of "Provider.of"Premium
    7:25
  • Local State vs App-wide StatePremium
    15:40
  • Adding Shopping Cart DataPremium
    8:39
  • Quiz 19: More on State Management & The Provider PackagePremium
    1:00
  • Working with Multiple ProvidersPremium
    3:41
  • Connecting the Cart ProviderPremium
    11:31
  • Working on the Shopping Cart & Displaying a TotalPremium
    11:37
  • Displaying a List of Cart ItemsPremium
    11:17
  • Making Cart Items DismissiblePremium
    8:47
  • Adding Product Detail DataPremium
    4:49
  • Providing an Orders ObjectPremium
    7:44
  • Adding OrdersPremium
    2:47
  • Adding an Orders ScreenPremium
    8:11
  • Using a Side DrawerPremium
    5:45
  • Making Orders Expandable & Stateful Widgets vs ProvidersPremium
    10:29
  • Wrap UpPremium
    3:29
  • Useful Resources & LinksPremium
    1:00

Section 9Working with User Input & Forms [SHOP APP]

  • Module IntroductionPremium
    3:02
  • Snackbars & Undoing "Add to Cart" ActionsPremium
    10:30
  • Showing Alert DialogsPremium
    7:12
  • Adding a "Manage Products" PagePremium
    14:15
  • "Edit Product" Screen & A ProblemPremium
    5:06
  • Using Forms & Working with Form InputsPremium
    7:59
  • Managing Form Input FocusPremium
    4:35
  • Multiline Inputs & Disposing ObjectsPremium
    4:11
  • Image Input & Image PreviewPremium
    13:15
  • Submitting FormsPremium
    12:01
  • Validating User InputPremium
    4:14
  • Adding Validation to All InputsPremium
    9:50
  • [OPTIONAL] Working with Regular ExpressionsPremium
    1:00
  • Saving New ProductsPremium
    3:52
  • Time to Update Products!Premium
    16:19
  • Allowing Users to Delete ProductsPremium
    3:39
  • Wrap UpPremium
    0:53
  • Useful Resources & LinksPremium
    1:00

Section 10Sending Http Requests [SHOP APP]

  • Module IntroductionPremium
    2:05
  • On-Device vs Web StoragePremium
    4:08
  • How to Connect Flutter to a DatabasePremium
    3:35
  • Preparing Our BackendPremium
    4:31
  • How To Send Http RequestsPremium
    5:56
  • Sending POST RequestsPremium
    10:55
  • Working with Futures in DartPremium
    7:35
  • [DART DEEP DIVE] Futures & Async CodePremium
    9:27
  • Quiz 20: Http Requests & FuturesPremium
    1:00
  • Showing a Loading IndicatorPremium
    6:59
  • Handling Errors GracefullyPremium
    12:11
  • Working with "async" & "await"Premium
    10:12
  • Fetching Data, initState & "of(context)"Premium
    8:27
  • How to Transform Fetched DataPremium
    7:38
  • Implementing Pull-to-RefreshPremium
    4:56
  • Updating Data via PATCH RequestsPremium
    6:35
  • Utilizing Optimistic UpdatingPremium
    8:07
  • Creating Custom Exceptions & More Error HandlingPremium
    9:05
  • A Challenge For You!Premium
    1:48
  • Updating the "Favorite" Status OptimisticallyPremium
    6:38
  • Storing Orders in the WebPremium
    11:29
  • Fetching Orders & Fixing an IssuePremium
    12:21
  • Using the "FutureBuilder" Widget & Improving the CodePremium
    13:47
  • Wrap UpPremium
    1:54
  • Useful Resources & LinksPremium
    1:00

Section 11Adding User Authentication [SHOP APP]

  • Module IntroductionPremium
    1:44
  • How Authentication WorksPremium
    5:46
  • Prepare BackendPremium
    3:39
  • Adding the Auth ScreenPremium
    15:49
  • Adding User SignupPremium
    13:33
  • Allowing Users to Log InPremium
    6:03
  • Handling Authentication ErrorsPremium
    13:10
  • Managing the Auth Token Locally (in the App)Premium
    11:07
  • Using the "ProxyProvider" and Attaching the Token to Outgoing Http RequestsPremium
    9:49
  • Adding the Token to All RequestsPremium
    8:31
  • Connecting the "Favorite" Status to UsersPremium
    10:17
  • Attaching Products to Users & Filtering By CreatorPremium
    13:25
  • Attaching Orders to UsersPremium
    2:55
  • Adding a Logout FunctionalityPremium
    4:18
  • Automatically Logging Users Out (After Some Time)Premium
    5:26
  • Automatically Logging Users InPremium
    18:19
  • Wrap UpPremium
    1:36
  • Useful Resources & LinksPremium
    1:00

Section 12Adding Animations [SHOP APP]

  • Module IntroductionPremium
    1:26
  • Animations From Scratch (Completely Manually Controlled)Premium
    14:03
  • Using the "AnimatedBuilder" WidgetPremium
    3:51
  • Working with the "AnimatedContainer"Premium
    2:47
  • More Built-in Animation & Transition WidgetsPremium
    9:12
  • Fading Loaded Images In (And Showing a Placeholder)Premium
    3:35
  • Adding a "Hero" TransitionPremium
    2:35
  • Working with SliversPremium
    5:55
  • Practice: Animating Order BoxesPremium
    4:00
  • Implementing Custom Route TransitionsPremium
    9:50
  • Wrap UpPremium
    0:53
  • Useful Resources & LinksPremium
    1:00

Section 13Using Native Device Features (Camera, Maps, Location, ...) [GREAT PLACES APP]

  • Module IntroductionPremium
    1:35
  • Planning the AppPremium
    3:23
  • PlaceList & Place Provider SetupPremium
    12:44
  • Adding the "Add Place" Screen & An Image InputPremium
    17:16
  • Using Image Picker & The Device CameraPremium
    12:11
  • Storing the Image on the Filesystem (on the Device)Premium
    10:15
  • Managing Data & Images via the Provider PackagePremium
    15:32
  • Handling ErrorsPremium
    1:23
  • Testing on Real DevicesPremium
    4:37
  • Preparing SQLitePremium
    12:33
  • Storing & Fetching Data with SQLitePremium
    11:48
  • Adding a Location Input & The "location" PackagePremium
    9:44
  • Fetching the User CoordinatesPremium
    2:29
  • Displaying a Static Map SnapshotPremium
    8:31
  • Rendering a Dynamic Map (via Google Maps)Premium
    13:55
  • Allowing Users to Pick a Location on the MapPremium
    9:43
  • Storing the Location in SQLitePremium
    18:09
  • Adding a "Place Detail" Screen & Opening the Map in "readonly" ModePremium
    11:33
  • Wrap UpPremium
    1:48
  • Useful Resources & LinksPremium
    1:00

Section 14Firebase, Image Upload & Push Notifications

  • Module IntroductionPremium
    1:51
  • What is Firebase?Premium
    4:12
  • Getting Started with FirebasePremium
    10:56
  • Creating a New AppPremium
    4:37
  • Getting Started with Firestore & the Flutter SDKPremium
    16:22
  • Rendering Stream Data with StreamBuilderPremium
    6:26
  • Adding DataPremium
    2:39
  • Adding a Basic Authentication ScreenPremium
    10:25
  • Adding an App ThemePremium
    3:39
  • Creating an Authentication FormPremium
    14:02
  • Connecting Auth Form & Auth ScreenPremium
    4:58
  • Implementing AuthenticationPremium
    13:15
  • Storing Extra User DataPremium
    6:57
  • Finishing Authentication & Adding LogoutPremium
    7:33
  • Adding Firebase Security RulesPremium
    9:44
  • Listening to Chat MessagesPremium
    5:11
  • Sending & Ordering Chat MessagesPremium
    11:56
  • Creating a Base Chat Bubble WidgetPremium
    6:04
  • Improving the Chat BubblesPremium
    12:29
  • Testing on Multiple DevicesPremium
    4:23
  • Displaying UsernamesPremium
    11:36
  • Adding an Image PickerPremium
    13:54
  • Preparing the File Upload & Image ValidationPremium
    7:11
  • Uploading ImagesPremium
    10:55
  • Improving Image UploadPremium
    5:13
  • Running on a Real iOS DevicePremium
    2:14
  • Displaying User ImagesPremium
    11:08
  • How Push Notifications WorkPremium
    5:41
  • An Introduction To Firebase Cloud MessagingPremium
    4:26
  • Android & Push NotificationsPremium
    9:44
  • iOS & Push NotificationsPremium
    13:41
  • Handling Push NotificationsPremium
    10:04
  • Getting Started with Cloud FunctionsPremium
    6:24
  • Setting a Firestore TriggerPremium
    8:50
  • Sending Automated Push NotificationsPremium
    8:46
  • Polishing & Wrap UpPremium
    7:15
  • Updating to the Latest Firebase Package VersionsPremium
    1:00
  • Module ResourcesPremium
    1:00

Section 15Running Native Swift, ObjectiveC, Java or Kotlin Code

  • Module IntroductionPremium
    1:30
  • Sending a Method Call from FlutterPremium
    8:33
  • Running Android CodePremium
    15:01
  • Running iOS CodePremium
    10:25
  • Wrap UpPremium
    0:58
  • Useful Resources & LinksPremium
    1:00

Section 16Publishing to the App Stores

  • Module IntroductionPremium
    1:42
  • Preparing the CodePremium
    2:24
  • Preparing the App ConfigurationPremium
    5:54
  • Preparing Third-Party ServicesPremium
    1:18
  • Adding Icons & Splash ScreensPremium
    9:07
  • Publishing Android AppsPremium
    8:46
  • Publishing iOS AppsPremium
    6:11
  • Useful Resources & LinksPremium
    1:00

Section 17Roundup & Next Steps

  • You did it!Premium
    1:11
  • Your Next Steps (To Become an Awesome Developer!)Premium
    3:31
  • How to Plan & Develop Successful AppsPremium
    10:57

Course instructor

Photo of Maximilian Schwarzmüller

Maximilian Schwarzmüller

As a self-taught professional I really know the hard parts and the difficult topics when learning new or improving on already-known languages. This background and experience enable me to focus on the most relevant key concepts and topics. My track record of many 5-star rated courses, more than 1,000,000 students worldwide as well as a successful YouTube channel is the best proof for that.

The most rewarding experience for me is to see how people find new, better jobs, build awesome web applications, work on amazing projects or simply enjoy their hobby with the help of my content. That's why, together with Manuel Lorenz, I founded Academind to offer the best possible learning experience and to share the pleasure of learning with our students.