diff --git a/sbs b/sbs
index 1e8ca9063a710a790678e85066e233d0f93b6cfa..26331166386df6fdb4b3aa53bf5a2de2e723a796 100755
--- a/sbs
+++ b/sbs
@@ -39,28 +39,53 @@ print_banner() {
 EOF
 }
 
-find_deps() {
-    command -v ccache          > /dev/null 2>&1 && config_ccache=true
-    command -v ninja           > /dev/null 2>&1 && config_ninja=true
-    command -v st-flash        > /dev/null 2>&1 && config_stflash=true
-    command -v ST-LINK_CLI.exe > /dev/null 2>&1 && config_stlink=true
+ohai() {
+    printf "${TTY_BLUE}==>${TTY_RESET}${TTY_BOLD} %s${TTY_RESET}\n" "$@";
+}
+
+init_dirs() {
+    sbs_base="$(cd -- "$(dirname "$0")" > /dev/null 2>&1 && pwd -P)"
+    source_dir="$PWD"
+    build_dir="$source_dir/build"
 }
 
-print_found_deps() {
-    printf "Found Ccache: "; [ "$config_ccache" = true ] && echo "yes" || echo "no"
-    printf "Found Ninja: ";  [ "$config_ninja" = true ]  && echo "yes" || echo "no"
+find_deps() {
+    ohai "Find dependencies"
+
+    command -v cmake           > /dev/null 2>&1 && found_cmake=true
+    command -v ccache          > /dev/null 2>&1 && found_ccache=true
+    command -v ninja           > /dev/null 2>&1 && found_ninja=true
+    command -v cppcheck        > /dev/null 2>&1 && found_cppcheck=true
+    command -v clang-format    > /dev/null 2>&1 && found_clangformat=true
+    command -v python          > /dev/null 2>&1 && found_python=true
+    command -v st-flash        > /dev/null 2>&1 && found_stflash=true
+    command -v ST-LINK_CLI.exe > /dev/null 2>&1 && found_stlink=true
+
+    printf "Found CMake: ";        [ "$found_cmake" = true ]       && echo "yes" || echo "no"
+    printf "Found Ccache: ";       [ "$found_ccache" = true ]      && echo "yes" || echo "no"
+    printf "Found Ninja: ";        [ "$found_ninja" = true ]       && echo "yes" || echo "no"
+    printf "Found Cppcheck: ";     [ "$found_cppcheck" = true ]    && echo "yes" || echo "no"
+    printf "Found clang-format: "; [ "$found_clangformat" = true ] && echo "yes" || echo "no"
+    printf "Found Python: ";       [ "$found_python" = true ]      && echo "yes" || echo "no"
+    printf "Found flasher: ";      [ "$found_stflash" = true ]     && echo "st-flash" \
+                                    || ([ "$found_stlink" = true ] && echo "st-link" || echo "no")
     echo
+
+    if [ "$found_cmake" = false ]; then
+        echo "Error: CMake must be installed"
+        exit 1
+    fi
 }
 
 configure() {
-    print_found_deps
-
+    ohai "Configure"
+    
     defs="-DCMAKE_TOOLCHAIN_FILE=$sbs_base/libs/miosix-kernel/miosix/_tools/toolchain.cmake"
     defs="$defs -DCMAKE_C_FLAGS=-fdiagnostics-color=always -DCMAKE_CXX_FLAGS=-fdiagnostics-color=always"
-    [ "$config_ccache" = true ]  && defs="$defs -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
+    [ "$found_ccache" = true ]   && defs="$defs -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
     [ "$config_debug" = true ]   && defs="$defs -DCMAKE_BUILD_TYPE=Debug" || defs="$defs -DCMAKE_BUILD_TYPE=Release"
     [ "$config_verbose" = true ] && defs="$defs -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
-    [ "$config_ninja" = true ]   && gen="-GNinja" || gen="-GUnix Makefiles"
+    [ "$found_ninja" = true ]    && gen="-GNinja" || gen="-GUnix Makefiles"
 
     if cmake -B"$build_dir" $defs "$gen" "$source_dir"; then
         [ "$config_debug" = true ]   && touch "$build_dir/$DEBUG_FILENAME"   || rm -f "$build_dir/$DEBUG_FILENAME"
@@ -70,7 +95,7 @@ configure() {
 
 check_configured() {
     to_reconfigure=false
-    
+
     if [ ! -d "$build_dir" ]; then
         to_reconfigure=true
     elif [ ! -f "$build_dir/$CMAKE_FILENAME" ]; then
@@ -85,19 +110,74 @@ check_configured() {
         fi
     fi
 
-    [ "$to_reconfigure" = true ] && configure && echo || true
+    if [ "$to_reconfigure" = true ]; then
+        configure
+        echo
+    fi
+    
+    true
 }
 
 build() {
     if check_configured; then
+        ohai "Build"
+        
         cmake --build "$build_dir" $(get_jobs_opt) --target "$1"
     fi
 }
 
+lint_cppcheck() {
+    ohai "Lint (Cppcheck)"
+
+    # Real-time colored output of Cppcheck
+    cppcheck --quiet --language=c++ --enable=all --inline-suppr --suppress=unusedFunction --suppress=missingInclude --error-exitcode=1 "$source_dir/src"
+    echo
+}
+
+lint_clangformat() {
+    ohai "Lint (clang-format)"
+
+    # Real-time colored output of clang-format
+    find "$source_dir/src" -type f \( -iname \*.cpp -o -iname \*.h -o -iname \*.c \) -exec clang-format --dry-run --Werror {} \;
+    echo
+}
+
+lint_copyright() {
+    ohai "Lint (Copyright)"
+
+    "$sbs_base/scripts/linter.py" --copyright "$source_dir/src"
+    echo
+}
+
+lint_find() {
+    ohai "Lint (Find)"
+
+    "$sbs_base/scripts/linter.py" --find "$source_dir/src"
+    echo
+}
+
+lint() {
+    if [ "$found_cppcheck" = true ]; then
+        lint_cppcheck
+    fi
+
+    if [ "$found_clangformat" = true ]; then
+        lint_clangformat
+    fi
+
+    if [ "$found_python" = true ]; then
+        lint_copyright
+        lint_find
+    fi
+}
+
 clean() {
+    ohai "Clean"
+
     if [ -f "$build_dir/$CMAKE_FILENAME" ]; then
         cmake --build "$build_dir" $(get_jobs_opt) --target clean && echo
     fi
+
     echo "Removing build folder..."
     rm -rf "$build_dir"
 }
@@ -105,33 +185,38 @@ clean() {
 flash() {
     if build "$1"; then
         echo
-        if [ -f "$build_dir/$1.bin" ]; then
-            printf "Flashing software: ";
-            [ "$config_stflash" = true ] && echo "st-flash" || ([ "$config_stlink" = true ] && echo "st-link" || "no")
-            echo
-
-            if [ "$config_stflash" = true ]; then
-                st-flash --reset write "$build_dir/$1.bin" 0x8000000
-            elif [ "$config_stlink" = true ]; then
-                ST-LINK_CLI.exe -P "$build_dir/$1.bin" 0x8000000 -V -Rst
-            else
-                echo "Error: No flashing software found!"
-            fi
-        else
+        ohai "Flash"
+
+        if [ ! -f "$build_dir/$1.bin" ]; then
             echo "Error: target '$1' is not flashable"
+            return 1
+        fi
+
+        if [ "$found_stflash" = true ]; then
+            st-flash --reset write "$build_dir/$1.bin" 0x8000000
+        elif [ "$found_stlink" = true ]; then
+            ST-LINK_CLI.exe -P "$build_dir/$1.bin" 0x8000000 -V -Rst
+        else
+            echo "Error: No flashing software found!"
         fi
     fi
 }
 
 list() {
     if check_configured; then
+        ohai "List targets"
+
         echo "[1/1] All SBS targets available:"
         cmake --build "$build_dir" $(get_jobs_opt) --target help | grep -o '^[^/]*\.bin' | cut -f 1 -d '.'
     fi
 }
 
 boards() {
-    build help-boards
+    if check_configured; then
+        ohai "List boards"
+
+        cmake --build "$build_dir" $(get_jobs_opt) --target help-boards
+    fi
 }
 
 build_all() {
@@ -154,10 +239,6 @@ get_jobs_opt() {
     [ -n "$build_jobs" ] && echo "-j $build_jobs" || echo
 }
 
-lint() {
-    "$sbs_base/scripts/linter.sh" "$source_dir/src/shared"
-}
-
 usage() {
     cat <<EOF
 Usage: $(basename "$0") [OPTIONS]
@@ -174,29 +255,34 @@ OPTIONS:
   -v, --verbose         Print a verbose output
   -l, --list            List all targets available
   -r, --boards          List all boards available
-  -n, --lint            Run the linter
+  -n, --lint            Lint the code
 EOF
 }
 
 CMAKE_FILENAME="CMakeCache.txt"
 DEBUG_FILENAME=".sbs_debug"
 VERBOSE_FILENAME=".sbs_verbose"
-
-print_banner
-
-sbs_base="$(cd -- "$(dirname "$0")" > /dev/null 2>&1 && pwd -P)"
-source_dir="$PWD"
-build_dir="$source_dir/build"
-
-config_ccache=false
+TTY_BLUE="\033[34m"
+TTY_BOLD="\033[1m"
+TTY_RESET="\033[0m"
+
+sbs_base=
+source_dir=
+build_dir=
+found_cmake=false
+found_ccache=false
+found_ninja=false
+found_cppcheck=false
+found_clangformat=false
+found_python=false
+found_stflash=false
+found_stlink=false
 config_debug=false
 config_verbose=false
-config_ninja=false
-config_stflash=false
-config_stlink=false
 build_jobs=
 
-find_deps
+print_banner
+init_dirs
 
 for arg in "$@"; do
     shift
@@ -218,18 +304,19 @@ done
 while getopts hcb:f:j:dvlrn opt; do
     case "$opt" in
         h)  usage; exit 0;;
-        c)  clean; exit;;
-        b)  build "$OPTARG"; exit;;
-        f)  flash "$OPTARG"; exit;;
+        c)  find_deps; clean; exit;;
+        b)  find_deps; build "$OPTARG"; exit;;
+        f)  find_deps; flash "$OPTARG"; exit;;
         j)  set_jobs "$OPTARG";;
         d)  set_debug;;
         v)  set_verbose;;
-        l)  list; exit;;
-        r)  boards; exit;;
-        n)  lint; exit;;
+        l)  find_deps; list; exit;;
+        r)  find_deps; boards; exit;;
+        n)  find_deps; lint; exit;;
         ?)  usage; exit 2;;
     esac
 done
 shift $((OPTIND - 1))
 
+find_deps
 build_all