From 75b392d778972477333e66be49388a145294aa49 Mon Sep 17 00:00:00 2001
From: Marcello Lamonaca <marcello@lamonaca.eu>
Date: Thu, 26 May 2022 19:11:28 +0200
Subject: [PATCH] Setup Mkdocs (#7)

* Compile docs with Mkdocs

* Add info about project
---
 .gitignore                                    |   2 +
 {C++ => docs/C++}/cpp.md                      |   2 +-
 {bash => docs/bash}/commands.md               |   2 +-
 {bash => docs/bash}/scripting.md              |   2 +-
 {css => docs/css}/css.md                      |   4 +-
 {database => docs/database}/mongo-db.md       |   4 +-
 {database => docs/database}/redis.md          |   0
 {database => docs/database}/sql.md            |   0
 {dotnet => docs/dotnet}/C#/C#.md              |   4 +-
 .../dotnet}/C#/async-programming.md           |   0
 {dotnet => docs/dotnet}/C#/collections.md     |   0
 {dotnet => docs/dotnet}/C#/linq.md            |   0
 .../dotnet}/C#/reactive-extensions.md         |   0
 {dotnet => docs/dotnet}/C#/unit-tests.md      |   0
 .../dotnet}/asp.net/app-configuration.md      |   0
 {dotnet => docs/dotnet}/asp.net/blazor.md     |   4 +-
 {dotnet => docs/dotnet}/asp.net/filters.md    |   4 +-
 {dotnet => docs/dotnet}/asp.net/middleware.md |   6 +-
 .../dotnet}/asp.net/minimal-api.md            |   0
 {dotnet => docs/dotnet}/asp.net/mvc.md        |   0
 .../dotnet}/asp.net/razor-pages.md            |   0
 .../dotnet/asp.net/razor-syntax.md            |   0
 {dotnet => docs/dotnet}/asp.net/rest-api.md   |   0
 .../dotnet/asp.net/signalr.md                 |   0
 {dotnet => docs/dotnet}/asp.net/web-forms.md  |   0
 {dotnet => docs/dotnet}/database/ado.net.md   |   0
 .../dotnet}/database/entity-framework.md      |   0
 {git => docs/git}/git.md                      |   2 +-
 graph-ql.md => docs/graph-ql.md               |   0
 {html => docs/html}/html.md                   |   2 +-
 .../img}/android_activity-lifecycle.png       | Bin
 .../img}/android_fragment-lifecycle.png       | Bin
 {.images => docs/img}/android_fragments.png   | Bin
 ...missions-and-ownership-basics-in-linux.png | Bin
 {.images => docs/img}/css_box-model.png       | Bin
 .../img}/dotnet_blazor-server.png             | Bin
 .../img}/dotnet_blazor-webassembly.png        | Bin
 .../img}/dotnet_covariant_contravariant.png   | Bin
 .../img}/dotnet_filter-pipeline-1.png         | Bin
 .../img}/dotnet_filter-pipeline-2.png         | Bin
 .../img}/dotnet_middleware-pipeline.png       | Bin
 {.images => docs/img}/dotnet_mvc-endpoint.png | Bin
 ...y-reference-vs-pass-by-value-animation.gif | Bin
 .../img}/dotnet_request-delegate-pipeline.png | Bin
 .../img}/dotnet_xamarin-layouts.png           | Bin
 .../img}/dotnet_xamarin-pages.png             | Bin
 {.images => docs/img}/git_branches.png        | Bin
 .../img}/java_java-collection-framework.png   | Bin
 .../img}/javascript_event-inheritance.png     | Bin
 {.images => docs/img}/mongodb_ixscan.png      | Bin
 .../img}/mongodb_shared-cluster.png           | Bin
 {.images => docs/img}/node_url-structure.png  | Bin
 docs/index.md                                 |   4 +
 {ios => docs/ios}/content-view.md             |   0
 {java => docs/java}/dao.md                    |   0
 .../java}/java-collection-framework.md        |   2 +-
 {java => docs/java}/java.md                   |   2 +-
 {java => docs/java}/spring/pom.xml.md         |   0
 {java => docs/java}/spring/spring-project.md  |   0
 {java => docs/java}/web/servlet.md            |   0
 {javascript => docs/javascript}/ajax.md       |   0
 {javascript => docs/javascript}/dom.md        |   0
 .../javascript}/events-animation.md           |   2 +-
 {javascript => docs/javascript}/javascript.md |   2 +-
 {javascript => docs/javascript}/jquery.md     |   6 +-
 .../javascript}/react/react-router.md         |   0
 .../javascript}/react/react-tests.md          |   0
 .../javascript}/react/react.md                |   0
 .../javascript}/react/redux-tests.md          |   0
 .../javascript}/react/redux.md                |   0
 .../javascript}/svelte/svelte.md              |   0
 {kotlin => docs/kotlin}/kotlin.md             |   2 +-
 markdown.md => docs/markdown.md               |   0
 {php => docs/php}/composer.md                 |   0
 {php => docs/php}/database.md                 |   0
 .../php/dependency-injection.md               |   0
 {php => docs/php}/php.md                      |   2 +-
 {php => docs/php}/plates-templating.md        |   0
 {php => docs/php}/psr-7.md                    |   0
 {php => docs/php}/simple-mvc/rest-api.md      |   0
 {php => docs/php}/simple-mvc/simple-mvc.md    |   0
 {php => docs/php}/unit-tests.md               |   0
 {php => docs/php}/web.md                      |   0
 {powershell => docs/powershell}/commands.md   |   0
 {powershell => docs/powershell}/scripting.md  |   2 +-
 .../python}/argparse.md                       |   0
 .../python}/collections.md                    |   0
 .../standard-library => docs/python}/csv.md   |   2 +-
 .../python}/ftplib.md                         |   0
 .../python}/itertools.md                      |   0
 .../standard-library => docs/python}/json.md  |   2 +-
 .../python/libs}/beautiful-soup.md            |   0
 .../libs/math => docs/python/libs}/numpy.md   |   0
 .../libs/math => docs/python/libs}/pandas.md  |   0
 .../libs/web => docs/python/libs}/requests.md |   0
 .../libs/math => docs/python/libs}/seaborn.md |   0
 .../libs/gui => docs/python/libs}/tkinter.md  |   2 +-
 .../python}/logging.md                        |  12 +-
 {python => docs/python}/python.md             |   0
 .../python}/shutil.md                         |   0
 .../python}/smtplib.md                        |   2 +-
 .../python}/socket.md                         |   2 +-
 .../sqllite.md => docs/python/sqlite.md       |   2 +-
 .../python/time-datetime.md                   |   0
 .../python}/unittest.md                       |   0
 .../regular-expressions.md                    |   0
 {rust => docs/rust}/cargo.md                  |   0
 {rust => docs/rust}/rust.md                   |   0
 {rust => docs/rust}/unit-tests.md             |   0
 {swift => docs/swift}/swift.md                |   0
 dotnet/godot/scripting.md                     | 140 -------
 dotnet/lib/skia-sharp.md                      |  35 --
 dotnet/unity/collisions.md                    |  81 ----
 dotnet/unity/coroutines.md                    |  30 --
 dotnet/unity/input-manager.md                 |  81 ----
 dotnet/unity/prefabs-instantiation.md         |  14 -
 dotnet/unity/raycasting.md                    |  83 ----
 dotnet/unity/scripting.md                     | 135 -------
 dotnet/unity/vectors-tranfrorms-space.md      |  87 -----
 dotnet/xamarin/app.xaml.cs.md                 |  35 --
 dotnet/xamarin/app.xaml.md                    |  51 ---
 dotnet/xamarin/page.xaml.cs.md                |  22 --
 dotnet/xamarin/page.xaml.md                   |  86 -----
 dotnet/xamarin/view-model.cs.md               |  35 --
 dotnet/xamarin/xamarin-essentials.md          |  41 --
 mkdocs.yml                                    | 125 ++++++
 poetry.lock                                   | 362 ++++++++++++++++++
 pyproject.toml                                |  16 +
 python/jupyter/jupiter-notebook.md            |  46 ---
 python/libs/cli/click.md                      |  75 ----
 python/libs/image/pillow.md                   |  50 ---
 python/libs/image/py-cairo.md                 | 146 -------
 python/libs/web/flask/flask-requests.md       |  34 --
 python/libs/web/flask/flask.md                | 148 -------
 134 files changed, 549 insertions(+), 1495 deletions(-)
 create mode 100644 .gitignore
 rename {C++ => docs/C++}/cpp.md (99%)
 rename {bash => docs/bash}/commands.md (98%)
 rename {bash => docs/bash}/scripting.md (99%)
 rename {css => docs/css}/css.md (99%)
 rename {database => docs/database}/mongo-db.md (99%)
 rename {database => docs/database}/redis.md (100%)
 rename {database => docs/database}/sql.md (100%)
 rename {dotnet => docs/dotnet}/C#/C#.md (99%)
 rename {dotnet => docs/dotnet}/C#/async-programming.md (100%)
 rename {dotnet => docs/dotnet}/C#/collections.md (100%)
 rename {dotnet => docs/dotnet}/C#/linq.md (100%)
 rename {dotnet => docs/dotnet}/C#/reactive-extensions.md (100%)
 rename {dotnet => docs/dotnet}/C#/unit-tests.md (100%)
 rename {dotnet => docs/dotnet}/asp.net/app-configuration.md (100%)
 rename {dotnet => docs/dotnet}/asp.net/blazor.md (98%)
 rename {dotnet => docs/dotnet}/asp.net/filters.md (97%)
 rename {dotnet => docs/dotnet}/asp.net/middleware.md (97%)
 rename {dotnet => docs/dotnet}/asp.net/minimal-api.md (100%)
 rename {dotnet => docs/dotnet}/asp.net/mvc.md (100%)
 rename {dotnet => docs/dotnet}/asp.net/razor-pages.md (100%)
 rename dotnet/asp.net/Razor Syntax.md => docs/dotnet/asp.net/razor-syntax.md (100%)
 rename {dotnet => docs/dotnet}/asp.net/rest-api.md (100%)
 rename dotnet/asp.net/signal-r.md => docs/dotnet/asp.net/signalr.md (100%)
 rename {dotnet => docs/dotnet}/asp.net/web-forms.md (100%)
 rename {dotnet => docs/dotnet}/database/ado.net.md (100%)
 rename {dotnet => docs/dotnet}/database/entity-framework.md (100%)
 rename {git => docs/git}/git.md (99%)
 rename graph-ql.md => docs/graph-ql.md (100%)
 rename {html => docs/html}/html.md (99%)
 rename {.images => docs/img}/android_activity-lifecycle.png (100%)
 rename {.images => docs/img}/android_fragment-lifecycle.png (100%)
 rename {.images => docs/img}/android_fragments.png (100%)
 rename {.images => docs/img}/bash_files-permissions-and-ownership-basics-in-linux.png (100%)
 rename {.images => docs/img}/css_box-model.png (100%)
 rename {.images => docs/img}/dotnet_blazor-server.png (100%)
 rename {.images => docs/img}/dotnet_blazor-webassembly.png (100%)
 rename {.images => docs/img}/dotnet_covariant_contravariant.png (100%)
 rename {.images => docs/img}/dotnet_filter-pipeline-1.png (100%)
 rename {.images => docs/img}/dotnet_filter-pipeline-2.png (100%)
 rename {.images => docs/img}/dotnet_middleware-pipeline.png (100%)
 rename {.images => docs/img}/dotnet_mvc-endpoint.png (100%)
 rename {.images => docs/img}/dotnet_pass-by-reference-vs-pass-by-value-animation.gif (100%)
 rename {.images => docs/img}/dotnet_request-delegate-pipeline.png (100%)
 rename {.images => docs/img}/dotnet_xamarin-layouts.png (100%)
 rename {.images => docs/img}/dotnet_xamarin-pages.png (100%)
 rename {.images => docs/img}/git_branches.png (100%)
 rename {.images => docs/img}/java_java-collection-framework.png (100%)
 rename {.images => docs/img}/javascript_event-inheritance.png (100%)
 rename {.images => docs/img}/mongodb_ixscan.png (100%)
 rename {.images => docs/img}/mongodb_shared-cluster.png (100%)
 rename {.images => docs/img}/node_url-structure.png (100%)
 create mode 100644 docs/index.md
 rename {ios => docs/ios}/content-view.md (100%)
 rename {java => docs/java}/dao.md (100%)
 rename {java => docs/java}/java-collection-framework.md (97%)
 rename {java => docs/java}/java.md (99%)
 rename {java => docs/java}/spring/pom.xml.md (100%)
 rename {java => docs/java}/spring/spring-project.md (100%)
 rename {java => docs/java}/web/servlet.md (100%)
 rename {javascript => docs/javascript}/ajax.md (100%)
 rename {javascript => docs/javascript}/dom.md (100%)
 rename {javascript => docs/javascript}/events-animation.md (97%)
 rename {javascript => docs/javascript}/javascript.md (99%)
 rename {javascript => docs/javascript}/jquery.md (95%)
 rename {javascript => docs/javascript}/react/react-router.md (100%)
 rename {javascript => docs/javascript}/react/react-tests.md (100%)
 rename {javascript => docs/javascript}/react/react.md (100%)
 rename {javascript => docs/javascript}/react/redux-tests.md (100%)
 rename {javascript => docs/javascript}/react/redux.md (100%)
 rename {javascript => docs/javascript}/svelte/svelte.md (100%)
 rename {kotlin => docs/kotlin}/kotlin.md (99%)
 rename markdown.md => docs/markdown.md (100%)
 rename {php => docs/php}/composer.md (100%)
 rename {php => docs/php}/database.md (100%)
 rename php/dependecy-injection.md => docs/php/dependency-injection.md (100%)
 rename {php => docs/php}/php.md (99%)
 rename {php => docs/php}/plates-templating.md (100%)
 rename {php => docs/php}/psr-7.md (100%)
 rename {php => docs/php}/simple-mvc/rest-api.md (100%)
 rename {php => docs/php}/simple-mvc/simple-mvc.md (100%)
 rename {php => docs/php}/unit-tests.md (100%)
 rename {php => docs/php}/web.md (100%)
 rename {powershell => docs/powershell}/commands.md (100%)
 rename {powershell => docs/powershell}/scripting.md (99%)
 rename {python/standard-library => docs/python}/argparse.md (100%)
 rename {python/standard-library => docs/python}/collections.md (100%)
 rename {python/standard-library => docs/python}/csv.md (96%)
 rename {python/standard-library => docs/python}/ftplib.md (100%)
 rename {python/standard-library => docs/python}/itertools.md (100%)
 rename {python/standard-library => docs/python}/json.md (99%)
 rename {python/libs/web => docs/python/libs}/beautiful-soup.md (100%)
 rename {python/libs/math => docs/python/libs}/numpy.md (100%)
 rename {python/libs/math => docs/python/libs}/pandas.md (100%)
 rename {python/libs/web => docs/python/libs}/requests.md (100%)
 rename {python/libs/math => docs/python/libs}/seaborn.md (100%)
 rename {python/libs/gui => docs/python/libs}/tkinter.md (99%)
 rename {python/standard-library => docs/python}/logging.md (98%)
 rename {python => docs/python}/python.md (100%)
 rename {python/standard-library => docs/python}/shutil.md (100%)
 rename {python/standard-library => docs/python}/smtplib.md (99%)
 rename {python/standard-library => docs/python}/socket.md (97%)
 rename python/standard-library/sqllite.md => docs/python/sqlite.md (99%)
 rename python/standard-library/time_datetime.md => docs/python/time-datetime.md (100%)
 rename {python/standard-library => docs/python}/unittest.md (100%)
 rename regular-expressions.md => docs/regular-expressions.md (100%)
 rename {rust => docs/rust}/cargo.md (100%)
 rename {rust => docs/rust}/rust.md (100%)
 rename {rust => docs/rust}/unit-tests.md (100%)
 rename {swift => docs/swift}/swift.md (100%)
 delete mode 100644 dotnet/godot/scripting.md
 delete mode 100644 dotnet/lib/skia-sharp.md
 delete mode 100644 dotnet/unity/collisions.md
 delete mode 100644 dotnet/unity/coroutines.md
 delete mode 100644 dotnet/unity/input-manager.md
 delete mode 100644 dotnet/unity/prefabs-instantiation.md
 delete mode 100644 dotnet/unity/raycasting.md
 delete mode 100644 dotnet/unity/scripting.md
 delete mode 100644 dotnet/unity/vectors-tranfrorms-space.md
 delete mode 100644 dotnet/xamarin/app.xaml.cs.md
 delete mode 100644 dotnet/xamarin/app.xaml.md
 delete mode 100644 dotnet/xamarin/page.xaml.cs.md
 delete mode 100644 dotnet/xamarin/page.xaml.md
 delete mode 100644 dotnet/xamarin/view-model.cs.md
 delete mode 100644 dotnet/xamarin/xamarin-essentials.md
 create mode 100644 mkdocs.yml
 create mode 100644 poetry.lock
 create mode 100644 pyproject.toml
 delete mode 100644 python/jupyter/jupiter-notebook.md
 delete mode 100644 python/libs/cli/click.md
 delete mode 100644 python/libs/image/pillow.md
 delete mode 100644 python/libs/image/py-cairo.md
 delete mode 100644 python/libs/web/flask/flask-requests.md
 delete mode 100644 python/libs/web/flask/flask.md

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d29be9c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.venv
+site/
\ No newline at end of file
diff --git a/C++/cpp.md b/docs/C++/cpp.md
similarity index 99%
rename from C++/cpp.md
rename to docs/C++/cpp.md
index 4992021..3825520 100644
--- a/C++/cpp.md
+++ b/docs/C++/cpp.md
@@ -1,4 +1,4 @@
-# C/C++ Cheat Sheet
+# C/C++
 
 ## Naming convention
 
diff --git a/bash/commands.md b/docs/bash/commands.md
similarity index 98%
rename from bash/commands.md
rename to docs/bash/commands.md
index bd4cda8..e458fdf 100644
--- a/bash/commands.md
+++ b/docs/bash/commands.md
@@ -82,7 +82,7 @@ cp SOURCE DESTINATION  # copy SOURCE to DESTINATION
 
 ### Files Permissions & Ownership
 
-![Linux Permissions](../.images/bash_files-permissions-and-ownership-basics-in-linux.png "files info and permissions")
+![Linux Permissions](../img/bash_files-permissions-and-ownership-basics-in-linux.png "files info and permissions")
 
 ```sh
 chmod MODE FILE  # change file (or directory) permissions
diff --git a/bash/scripting.md b/docs/bash/scripting.md
similarity index 99%
rename from bash/scripting.md
rename to docs/bash/scripting.md
index ff39acf..5793dd1 100644
--- a/bash/scripting.md
+++ b/docs/bash/scripting.md
@@ -1,4 +1,4 @@
-# Bash Cheat Sheet
+# Bash Scripting
 
 [Bash Manual](https://www.gnu.org/software/bash/manual/)
 
diff --git a/css/css.md b/docs/css/css.md
similarity index 99%
rename from css/css.md
rename to docs/css/css.md
index baa2b15..7a86898 100644
--- a/css/css.md
+++ b/docs/css/css.md
@@ -1,4 +1,4 @@
-# CSS Cheat Sheet
+# CSS
 
 ## Applying CSS to HTML
 
@@ -644,7 +644,7 @@ Specificity is usually the reason why CSS-rules don't apply to some elements whe
 
 ## Box Model
 
-![Box Model](../.images/css_box-model.png)
+![Box Model](../img/css_box-model.png)
 
 ### Padding
 
diff --git a/database/mongo-db.md b/docs/database/mongo-db.md
similarity index 99%
rename from database/mongo-db.md
rename to docs/database/mongo-db.md
index c1d169b..585ffa3 100644
--- a/database/mongo-db.md
+++ b/docs/database/mongo-db.md
@@ -277,7 +277,7 @@ Indexes are special data structures that store a small portion of the collection
 
 Indexes _slow down writing operations_ since the index must be updated at every writing.
 
-![IXSCAN](../.images/mongodb_ixscan.png ".find() using an index")
+![IXSCAN](../img/mongodb_ixscan.png ".find() using an index")
 
 ### [Index Types](https://docs.mongodb.com/manual/indexes/#index-types)
 
@@ -403,7 +403,7 @@ Shard components are:
 - A config server, instance of MongoDB which contains metadata on the cluster, that is the set of instances that have the shard data.
 - A router (or `mongos`), instance of MongoDB used to redirect the user instructions from the client to the correct server.
 
-![Shared Cluster](../.images/mongodb_shared-cluster.png "Components of a shared cluster")
+![Shared Cluster](../img/mongodb_shared-cluster.png "Components of a shared cluster")
 
 ### [Replica set](https://docs.mongodb.com/manual/replication/)
 
diff --git a/database/redis.md b/docs/database/redis.md
similarity index 100%
rename from database/redis.md
rename to docs/database/redis.md
diff --git a/database/sql.md b/docs/database/sql.md
similarity index 100%
rename from database/sql.md
rename to docs/database/sql.md
diff --git a/dotnet/C#/C#.md b/docs/dotnet/C#/C#.md
similarity index 99%
rename from dotnet/C#/C#.md
rename to docs/dotnet/C#/C#.md
index 5a501a1..c48c13e 100644
--- a/dotnet/C#/C#.md
+++ b/docs/dotnet/C#/C#.md
@@ -1286,7 +1286,7 @@ public static System.Collections.IEnumerable<int> IterateRange(int start = 0, in
 
 ## Structs (Custom Value Types) & Classes (Custom Reference Types)
 
-![reference-vs-value](../../.images/dotnet_pass-by-reference-vs-pass-by-value-animation.gif)
+![reference-vs-value](../../img/dotnet_pass-by-reference-vs-pass-by-value-animation.gif)
 
 **Structure** types have _value semantics_. That is, a variable of a structure type contains an _instance_ of the type.
 
@@ -2030,7 +2030,7 @@ Generic type parameters support covariance and contravariance to provide greater
 - **Contravariance**: Enables to use a more generic (less derived) type than originally specified.
 - **Invariance**: it's possible to use _only_ the type originally specified; so an invariant generic type parameter is neither covariant nor contravariant.
 
-![covariance-vs-contravariance](../../.images/dotnet_covariant_contravariant.png)
+![covariance-vs-contravariance](../../img/dotnet_covariant_contravariant.png)
 
 **NOTE**: annotate generic type parameters with `out` and `in` annotations to specify whether they should behave covariantly or contravariantly.
 
diff --git a/dotnet/C#/async-programming.md b/docs/dotnet/C#/async-programming.md
similarity index 100%
rename from dotnet/C#/async-programming.md
rename to docs/dotnet/C#/async-programming.md
diff --git a/dotnet/C#/collections.md b/docs/dotnet/C#/collections.md
similarity index 100%
rename from dotnet/C#/collections.md
rename to docs/dotnet/C#/collections.md
diff --git a/dotnet/C#/linq.md b/docs/dotnet/C#/linq.md
similarity index 100%
rename from dotnet/C#/linq.md
rename to docs/dotnet/C#/linq.md
diff --git a/dotnet/C#/reactive-extensions.md b/docs/dotnet/C#/reactive-extensions.md
similarity index 100%
rename from dotnet/C#/reactive-extensions.md
rename to docs/dotnet/C#/reactive-extensions.md
diff --git a/dotnet/C#/unit-tests.md b/docs/dotnet/C#/unit-tests.md
similarity index 100%
rename from dotnet/C#/unit-tests.md
rename to docs/dotnet/C#/unit-tests.md
diff --git a/dotnet/asp.net/app-configuration.md b/docs/dotnet/asp.net/app-configuration.md
similarity index 100%
rename from dotnet/asp.net/app-configuration.md
rename to docs/dotnet/asp.net/app-configuration.md
diff --git a/dotnet/asp.net/blazor.md b/docs/dotnet/asp.net/blazor.md
similarity index 98%
rename from dotnet/asp.net/blazor.md
rename to docs/dotnet/asp.net/blazor.md
index 4edf2d7..9f5c2d8 100644
--- a/dotnet/asp.net/blazor.md
+++ b/docs/dotnet/asp.net/blazor.md
@@ -9,8 +9,8 @@ Components are .NET C# classes built into .NET assemblies that:
 - Can be nested and reused.
 - Can be shared and distributed as Razor class libraries or NuGet packages.
 
-![Blazor Server Architecture](../../.images/dotnet_blazor-server.png)
-![Blazor WASM Architecture](../../.images/dotnet_blazor-webassembly.png)
+![Blazor Server Architecture](../../img/dotnet_blazor-server.png)
+![Blazor WASM Architecture](../../img/dotnet_blazor-webassembly.png)
 
 The component class is usually written in the form of a Razor markup page with a `.razor` file extension. Components in Blazor are formally referred to as *Razor components*.
 
diff --git a/dotnet/asp.net/filters.md b/docs/dotnet/asp.net/filters.md
similarity index 97%
rename from dotnet/asp.net/filters.md
rename to docs/dotnet/asp.net/filters.md
index efc2b36..7b23f48 100644
--- a/dotnet/asp.net/filters.md
+++ b/docs/dotnet/asp.net/filters.md
@@ -13,8 +13,8 @@ Custom filters can be created to handle cross-cutting concerns. Examples of cros
 
 Filters run within the _ASP.NET Core action invocation pipeline_, sometimes referred to as the _filter pipeline_. The filter pipeline runs after ASP.NET Core selects the action to execute.
 
-![filter-pipeline-1](../../.images/dotnet_filter-pipeline-1.png)
-![filter-pipeline-2](../../.images/dotnet_filter-pipeline-2.png)
+![filter-pipeline-1](../../img/dotnet_filter-pipeline-1.png)
+![filter-pipeline-2](../../img/dotnet_filter-pipeline-2.png)
 
 ## **Filter types**
 
diff --git a/dotnet/asp.net/middleware.md b/docs/dotnet/asp.net/middleware.md
similarity index 97%
rename from dotnet/asp.net/middleware.md
rename to docs/dotnet/asp.net/middleware.md
index 58a985d..a6d29ed 100644
--- a/dotnet/asp.net/middleware.md
+++ b/docs/dotnet/asp.net/middleware.md
@@ -23,7 +23,7 @@ When a middleware short-circuits, it's called a *terminal middleware* because it
 
 The ASP.NET Core request pipeline consists of a sequence of request delegates, called one after the other.
 
-![request-delegate-pipeline](../../.images/dotnet_request-delegate-pipeline.png)
+![request-delegate-pipeline](../../img/dotnet_request-delegate-pipeline.png)
 
 Each delegate can perform operations before and after the next delegate. Exception-handling delegates should be called early in the pipeline, so they can catch exceptions that occur in later stages of the pipeline. It's possible to chain multiple request delegates together with `Use`.
 
@@ -74,8 +74,8 @@ public class Startup
 
 ## Middleware Order
 
-![middleware-pipeline](../../.images/dotnet_middleware-pipeline.png)
-![mvc-endpoint](../../.images/dotnet_mvc-endpoint.png)
+![middleware-pipeline](../../img/dotnet_middleware-pipeline.png)
+![mvc-endpoint](../../img/dotnet_mvc-endpoint.png)
 
 The Endpoint middleware executes the filter pipeline for the corresponding app type.
 
diff --git a/dotnet/asp.net/minimal-api.md b/docs/dotnet/asp.net/minimal-api.md
similarity index 100%
rename from dotnet/asp.net/minimal-api.md
rename to docs/dotnet/asp.net/minimal-api.md
diff --git a/dotnet/asp.net/mvc.md b/docs/dotnet/asp.net/mvc.md
similarity index 100%
rename from dotnet/asp.net/mvc.md
rename to docs/dotnet/asp.net/mvc.md
diff --git a/dotnet/asp.net/razor-pages.md b/docs/dotnet/asp.net/razor-pages.md
similarity index 100%
rename from dotnet/asp.net/razor-pages.md
rename to docs/dotnet/asp.net/razor-pages.md
diff --git a/dotnet/asp.net/Razor Syntax.md b/docs/dotnet/asp.net/razor-syntax.md
similarity index 100%
rename from dotnet/asp.net/Razor Syntax.md
rename to docs/dotnet/asp.net/razor-syntax.md
diff --git a/dotnet/asp.net/rest-api.md b/docs/dotnet/asp.net/rest-api.md
similarity index 100%
rename from dotnet/asp.net/rest-api.md
rename to docs/dotnet/asp.net/rest-api.md
diff --git a/dotnet/asp.net/signal-r.md b/docs/dotnet/asp.net/signalr.md
similarity index 100%
rename from dotnet/asp.net/signal-r.md
rename to docs/dotnet/asp.net/signalr.md
diff --git a/dotnet/asp.net/web-forms.md b/docs/dotnet/asp.net/web-forms.md
similarity index 100%
rename from dotnet/asp.net/web-forms.md
rename to docs/dotnet/asp.net/web-forms.md
diff --git a/dotnet/database/ado.net.md b/docs/dotnet/database/ado.net.md
similarity index 100%
rename from dotnet/database/ado.net.md
rename to docs/dotnet/database/ado.net.md
diff --git a/dotnet/database/entity-framework.md b/docs/dotnet/database/entity-framework.md
similarity index 100%
rename from dotnet/database/entity-framework.md
rename to docs/dotnet/database/entity-framework.md
diff --git a/git/git.md b/docs/git/git.md
similarity index 99%
rename from git/git.md
rename to docs/git/git.md
index 36153b0..3771dc6 100644
--- a/git/git.md
+++ b/docs/git/git.md
@@ -242,7 +242,7 @@ git checkout <primary_branch>
 git rebase <feature_branch>  # moves commits from the branch on top of master
 ```
 
-![branch](../.images/git_branches.png "how branches work")
+![branch](../img/git_branches.png "how branches work")
 
 ### Clone Branches
 
diff --git a/graph-ql.md b/docs/graph-ql.md
similarity index 100%
rename from graph-ql.md
rename to docs/graph-ql.md
diff --git a/html/html.md b/docs/html/html.md
similarity index 99%
rename from html/html.md
rename to docs/html/html.md
index 7289f37..b46bfc7 100644
--- a/html/html.md
+++ b/docs/html/html.md
@@ -1,4 +1,4 @@
-# HTML Cheat Sheet
+# HTML
 
 ## Terminology
 
diff --git a/.images/android_activity-lifecycle.png b/docs/img/android_activity-lifecycle.png
similarity index 100%
rename from .images/android_activity-lifecycle.png
rename to docs/img/android_activity-lifecycle.png
diff --git a/.images/android_fragment-lifecycle.png b/docs/img/android_fragment-lifecycle.png
similarity index 100%
rename from .images/android_fragment-lifecycle.png
rename to docs/img/android_fragment-lifecycle.png
diff --git a/.images/android_fragments.png b/docs/img/android_fragments.png
similarity index 100%
rename from .images/android_fragments.png
rename to docs/img/android_fragments.png
diff --git a/.images/bash_files-permissions-and-ownership-basics-in-linux.png b/docs/img/bash_files-permissions-and-ownership-basics-in-linux.png
similarity index 100%
rename from .images/bash_files-permissions-and-ownership-basics-in-linux.png
rename to docs/img/bash_files-permissions-and-ownership-basics-in-linux.png
diff --git a/.images/css_box-model.png b/docs/img/css_box-model.png
similarity index 100%
rename from .images/css_box-model.png
rename to docs/img/css_box-model.png
diff --git a/.images/dotnet_blazor-server.png b/docs/img/dotnet_blazor-server.png
similarity index 100%
rename from .images/dotnet_blazor-server.png
rename to docs/img/dotnet_blazor-server.png
diff --git a/.images/dotnet_blazor-webassembly.png b/docs/img/dotnet_blazor-webassembly.png
similarity index 100%
rename from .images/dotnet_blazor-webassembly.png
rename to docs/img/dotnet_blazor-webassembly.png
diff --git a/.images/dotnet_covariant_contravariant.png b/docs/img/dotnet_covariant_contravariant.png
similarity index 100%
rename from .images/dotnet_covariant_contravariant.png
rename to docs/img/dotnet_covariant_contravariant.png
diff --git a/.images/dotnet_filter-pipeline-1.png b/docs/img/dotnet_filter-pipeline-1.png
similarity index 100%
rename from .images/dotnet_filter-pipeline-1.png
rename to docs/img/dotnet_filter-pipeline-1.png
diff --git a/.images/dotnet_filter-pipeline-2.png b/docs/img/dotnet_filter-pipeline-2.png
similarity index 100%
rename from .images/dotnet_filter-pipeline-2.png
rename to docs/img/dotnet_filter-pipeline-2.png
diff --git a/.images/dotnet_middleware-pipeline.png b/docs/img/dotnet_middleware-pipeline.png
similarity index 100%
rename from .images/dotnet_middleware-pipeline.png
rename to docs/img/dotnet_middleware-pipeline.png
diff --git a/.images/dotnet_mvc-endpoint.png b/docs/img/dotnet_mvc-endpoint.png
similarity index 100%
rename from .images/dotnet_mvc-endpoint.png
rename to docs/img/dotnet_mvc-endpoint.png
diff --git a/.images/dotnet_pass-by-reference-vs-pass-by-value-animation.gif b/docs/img/dotnet_pass-by-reference-vs-pass-by-value-animation.gif
similarity index 100%
rename from .images/dotnet_pass-by-reference-vs-pass-by-value-animation.gif
rename to docs/img/dotnet_pass-by-reference-vs-pass-by-value-animation.gif
diff --git a/.images/dotnet_request-delegate-pipeline.png b/docs/img/dotnet_request-delegate-pipeline.png
similarity index 100%
rename from .images/dotnet_request-delegate-pipeline.png
rename to docs/img/dotnet_request-delegate-pipeline.png
diff --git a/.images/dotnet_xamarin-layouts.png b/docs/img/dotnet_xamarin-layouts.png
similarity index 100%
rename from .images/dotnet_xamarin-layouts.png
rename to docs/img/dotnet_xamarin-layouts.png
diff --git a/.images/dotnet_xamarin-pages.png b/docs/img/dotnet_xamarin-pages.png
similarity index 100%
rename from .images/dotnet_xamarin-pages.png
rename to docs/img/dotnet_xamarin-pages.png
diff --git a/.images/git_branches.png b/docs/img/git_branches.png
similarity index 100%
rename from .images/git_branches.png
rename to docs/img/git_branches.png
diff --git a/.images/java_java-collection-framework.png b/docs/img/java_java-collection-framework.png
similarity index 100%
rename from .images/java_java-collection-framework.png
rename to docs/img/java_java-collection-framework.png
diff --git a/.images/javascript_event-inheritance.png b/docs/img/javascript_event-inheritance.png
similarity index 100%
rename from .images/javascript_event-inheritance.png
rename to docs/img/javascript_event-inheritance.png
diff --git a/.images/mongodb_ixscan.png b/docs/img/mongodb_ixscan.png
similarity index 100%
rename from .images/mongodb_ixscan.png
rename to docs/img/mongodb_ixscan.png
diff --git a/.images/mongodb_shared-cluster.png b/docs/img/mongodb_shared-cluster.png
similarity index 100%
rename from .images/mongodb_shared-cluster.png
rename to docs/img/mongodb_shared-cluster.png
diff --git a/.images/node_url-structure.png b/docs/img/node_url-structure.png
similarity index 100%
rename from .images/node_url-structure.png
rename to docs/img/node_url-structure.png
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000..8d538bd
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,4 @@
+# Programming Notes
+
+Personal notes on various programming languages to be used as quick reference.  
+Sum-up of personal knowledge.
diff --git a/ios/content-view.md b/docs/ios/content-view.md
similarity index 100%
rename from ios/content-view.md
rename to docs/ios/content-view.md
diff --git a/java/dao.md b/docs/java/dao.md
similarity index 100%
rename from java/dao.md
rename to docs/java/dao.md
diff --git a/java/java-collection-framework.md b/docs/java/java-collection-framework.md
similarity index 97%
rename from java/java-collection-framework.md
rename to docs/java/java-collection-framework.md
index 2f6071c..eb1d01f 100644
--- a/java/java-collection-framework.md
+++ b/docs/java/java-collection-framework.md
@@ -12,7 +12,7 @@ The **Java Collection Framework** is constituted by:
 - **Classes** that implement the interfaces using different data structures.
 - **Algorithms** consisting in methods to operate over a collection.
 
-![Java Collection Hierarchy](../.images/java_java-collection-framework.png "Java Collection Hierarchy")
+![Java Collection Hierarchy](../img/java_java-collection-framework.png "Java Collection Hierarchy")
 
 ## java.util.Collections
 
diff --git a/java/java.md b/docs/java/java.md
similarity index 99%
rename from java/java.md
rename to docs/java/java.md
index af64ae5..9846254 100644
--- a/java/java.md
+++ b/docs/java/java.md
@@ -1,4 +1,4 @@
-# Java Cheat Sheet
+# Java
 
 ```java
 //single line comment
diff --git a/java/spring/pom.xml.md b/docs/java/spring/pom.xml.md
similarity index 100%
rename from java/spring/pom.xml.md
rename to docs/java/spring/pom.xml.md
diff --git a/java/spring/spring-project.md b/docs/java/spring/spring-project.md
similarity index 100%
rename from java/spring/spring-project.md
rename to docs/java/spring/spring-project.md
diff --git a/java/web/servlet.md b/docs/java/web/servlet.md
similarity index 100%
rename from java/web/servlet.md
rename to docs/java/web/servlet.md
diff --git a/javascript/ajax.md b/docs/javascript/ajax.md
similarity index 100%
rename from javascript/ajax.md
rename to docs/javascript/ajax.md
diff --git a/javascript/dom.md b/docs/javascript/dom.md
similarity index 100%
rename from javascript/dom.md
rename to docs/javascript/dom.md
diff --git a/javascript/events-animation.md b/docs/javascript/events-animation.md
similarity index 97%
rename from javascript/events-animation.md
rename to docs/javascript/events-animation.md
index e9c12fb..0dc6d8f 100644
--- a/javascript/events-animation.md
+++ b/docs/javascript/events-animation.md
@@ -44,7 +44,7 @@ let event = new CustomEvent(type, { detail: /* custom data */ });  // create eve
 domNode.dispatchEvent(event);  // launch the event
 ```
 
-![Event Inheritance](../.images/javascript_event-inheritance.png)
+![Event Inheritance](../img/javascript_event-inheritance.png)
 
 ## Animation
 
diff --git a/javascript/javascript.md b/docs/javascript/javascript.md
similarity index 99%
rename from javascript/javascript.md
rename to docs/javascript/javascript.md
index b5ec12e..9f39f10 100644
--- a/javascript/javascript.md
+++ b/docs/javascript/javascript.md
@@ -1,4 +1,4 @@
-# JavaScript Cheat Sheet
+# JavaScript 
 
 ## Basics
 
diff --git a/javascript/jquery.md b/docs/javascript/jquery.md
similarity index 95%
rename from javascript/jquery.md
rename to docs/javascript/jquery.md
index 80623cb..8c5c7ab 100644
--- a/javascript/jquery.md
+++ b/docs/javascript/jquery.md
@@ -6,7 +6,7 @@
 
 ```html
 <head>
-    <script src="jquery-3.2.1.min.js"></script>
+    <script src="jquery-x.x.x.min.js"></script>
 </head>
 ```
 
@@ -14,13 +14,13 @@
 
 ```html
 <head>
-    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/x.x.x/jquery.min.js"></script>
 </head>
 
 <!-- OR -->
 
 <head>
-    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.5.1.min.js"></script>
+    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-x.x.x.min.js"></script>
 </head>
 ```
 
diff --git a/javascript/react/react-router.md b/docs/javascript/react/react-router.md
similarity index 100%
rename from javascript/react/react-router.md
rename to docs/javascript/react/react-router.md
diff --git a/javascript/react/react-tests.md b/docs/javascript/react/react-tests.md
similarity index 100%
rename from javascript/react/react-tests.md
rename to docs/javascript/react/react-tests.md
diff --git a/javascript/react/react.md b/docs/javascript/react/react.md
similarity index 100%
rename from javascript/react/react.md
rename to docs/javascript/react/react.md
diff --git a/javascript/react/redux-tests.md b/docs/javascript/react/redux-tests.md
similarity index 100%
rename from javascript/react/redux-tests.md
rename to docs/javascript/react/redux-tests.md
diff --git a/javascript/react/redux.md b/docs/javascript/react/redux.md
similarity index 100%
rename from javascript/react/redux.md
rename to docs/javascript/react/redux.md
diff --git a/javascript/svelte/svelte.md b/docs/javascript/svelte/svelte.md
similarity index 100%
rename from javascript/svelte/svelte.md
rename to docs/javascript/svelte/svelte.md
diff --git a/kotlin/kotlin.md b/docs/kotlin/kotlin.md
similarity index 99%
rename from kotlin/kotlin.md
rename to docs/kotlin/kotlin.md
index eade744..3a07697 100644
--- a/kotlin/kotlin.md
+++ b/docs/kotlin/kotlin.md
@@ -1,4 +1,4 @@
-# Kotlin Cheat Sheet
+# Kotlin
 
 ## Package & Imports
 
diff --git a/markdown.md b/docs/markdown.md
similarity index 100%
rename from markdown.md
rename to docs/markdown.md
diff --git a/php/composer.md b/docs/php/composer.md
similarity index 100%
rename from php/composer.md
rename to docs/php/composer.md
diff --git a/php/database.md b/docs/php/database.md
similarity index 100%
rename from php/database.md
rename to docs/php/database.md
diff --git a/php/dependecy-injection.md b/docs/php/dependency-injection.md
similarity index 100%
rename from php/dependecy-injection.md
rename to docs/php/dependency-injection.md
diff --git a/php/php.md b/docs/php/php.md
similarity index 99%
rename from php/php.md
rename to docs/php/php.md
index a899913..3ea9c4a 100644
--- a/php/php.md
+++ b/docs/php/php.md
@@ -1,4 +1,4 @@
-# PHP CheatSheet
+# PHP
 
 [PHP Docs](https://www.php.net/docs.php)
 
diff --git a/php/plates-templating.md b/docs/php/plates-templating.md
similarity index 100%
rename from php/plates-templating.md
rename to docs/php/plates-templating.md
diff --git a/php/psr-7.md b/docs/php/psr-7.md
similarity index 100%
rename from php/psr-7.md
rename to docs/php/psr-7.md
diff --git a/php/simple-mvc/rest-api.md b/docs/php/simple-mvc/rest-api.md
similarity index 100%
rename from php/simple-mvc/rest-api.md
rename to docs/php/simple-mvc/rest-api.md
diff --git a/php/simple-mvc/simple-mvc.md b/docs/php/simple-mvc/simple-mvc.md
similarity index 100%
rename from php/simple-mvc/simple-mvc.md
rename to docs/php/simple-mvc/simple-mvc.md
diff --git a/php/unit-tests.md b/docs/php/unit-tests.md
similarity index 100%
rename from php/unit-tests.md
rename to docs/php/unit-tests.md
diff --git a/php/web.md b/docs/php/web.md
similarity index 100%
rename from php/web.md
rename to docs/php/web.md
diff --git a/powershell/commands.md b/docs/powershell/commands.md
similarity index 100%
rename from powershell/commands.md
rename to docs/powershell/commands.md
diff --git a/powershell/scripting.md b/docs/powershell/scripting.md
similarity index 99%
rename from powershell/scripting.md
rename to docs/powershell/scripting.md
index fb6f46c..6bce137 100644
--- a/powershell/scripting.md
+++ b/docs/powershell/scripting.md
@@ -1,4 +1,4 @@
-# PowerShell Cheat Sheet
+# PowerShell Scripting
 
 Cmdlets are formed by a verb-noun pair. Cmdlets are case-insensitive.
 
diff --git a/python/standard-library/argparse.md b/docs/python/argparse.md
similarity index 100%
rename from python/standard-library/argparse.md
rename to docs/python/argparse.md
diff --git a/python/standard-library/collections.md b/docs/python/collections.md
similarity index 100%
rename from python/standard-library/collections.md
rename to docs/python/collections.md
diff --git a/python/standard-library/csv.md b/docs/python/csv.md
similarity index 96%
rename from python/standard-library/csv.md
rename to docs/python/csv.md
index fbdd2b4..7b060de 100644
--- a/python/standard-library/csv.md
+++ b/docs/python/csv.md
@@ -1,5 +1,5 @@
 
-# CSV Module Cheat Sheet
+# CSV Module
 
 ``` python
 # iterate lines of csvfile
diff --git a/python/standard-library/ftplib.md b/docs/python/ftplib.md
similarity index 100%
rename from python/standard-library/ftplib.md
rename to docs/python/ftplib.md
diff --git a/python/standard-library/itertools.md b/docs/python/itertools.md
similarity index 100%
rename from python/standard-library/itertools.md
rename to docs/python/itertools.md
diff --git a/python/standard-library/json.md b/docs/python/json.md
similarity index 99%
rename from python/standard-library/json.md
rename to docs/python/json.md
index 868fe77..599f663 100644
--- a/python/standard-library/json.md
+++ b/docs/python/json.md
@@ -1,4 +1,4 @@
-# JSON Module Cheat Sheet
+# JSON Module
 
 ## JSON Format
 
diff --git a/python/libs/web/beautiful-soup.md b/docs/python/libs/beautiful-soup.md
similarity index 100%
rename from python/libs/web/beautiful-soup.md
rename to docs/python/libs/beautiful-soup.md
diff --git a/python/libs/math/numpy.md b/docs/python/libs/numpy.md
similarity index 100%
rename from python/libs/math/numpy.md
rename to docs/python/libs/numpy.md
diff --git a/python/libs/math/pandas.md b/docs/python/libs/pandas.md
similarity index 100%
rename from python/libs/math/pandas.md
rename to docs/python/libs/pandas.md
diff --git a/python/libs/web/requests.md b/docs/python/libs/requests.md
similarity index 100%
rename from python/libs/web/requests.md
rename to docs/python/libs/requests.md
diff --git a/python/libs/math/seaborn.md b/docs/python/libs/seaborn.md
similarity index 100%
rename from python/libs/math/seaborn.md
rename to docs/python/libs/seaborn.md
diff --git a/python/libs/gui/tkinter.md b/docs/python/libs/tkinter.md
similarity index 99%
rename from python/libs/gui/tkinter.md
rename to docs/python/libs/tkinter.md
index 5664144..de1ac1c 100644
--- a/python/libs/gui/tkinter.md
+++ b/docs/python/libs/tkinter.md
@@ -1,4 +1,4 @@
-# Tkinter Module/Library Cheat Sheet
+# Tkinter Module/Library
 
 ## Standard Imports
 
diff --git a/python/standard-library/logging.md b/docs/python/logging.md
similarity index 98%
rename from python/standard-library/logging.md
rename to docs/python/logging.md
index 388e969..d9311d8 100644
--- a/python/standard-library/logging.md
+++ b/docs/python/logging.md
@@ -69,12 +69,12 @@ logging.disable(level=LOG_LEVEL)
 
 Log Levels (Low To High):
 
-- NOTSET -- 0
-- DEBUG -- 10
-- INFO -- 20
-- WARNING -- 30
-- ERROR -- 40
-- CRITICAL -- 50
+- default: `0`
+- debug: `10`
+- info: `20`
+- warning: `30`
+- error: `40`
+- critical: `50`
 
 ```python
 logging.debug(msg)  # Logs a message with level DEBUG on the root logger
diff --git a/python/python.md b/docs/python/python.md
similarity index 100%
rename from python/python.md
rename to docs/python/python.md
diff --git a/python/standard-library/shutil.md b/docs/python/shutil.md
similarity index 100%
rename from python/standard-library/shutil.md
rename to docs/python/shutil.md
diff --git a/python/standard-library/smtplib.md b/docs/python/smtplib.md
similarity index 99%
rename from python/standard-library/smtplib.md
rename to docs/python/smtplib.md
index b35b7cb..99acd65 100644
--- a/python/standard-library/smtplib.md
+++ b/docs/python/smtplib.md
@@ -1,4 +1,4 @@
-# SMTPlib Module Cheat Sheet
+# SMTPlib Module
 
 ```python
 import smtplib
diff --git a/python/standard-library/socket.md b/docs/python/socket.md
similarity index 97%
rename from python/standard-library/socket.md
rename to docs/python/socket.md
index 40fc9a1..6720ad5 100644
--- a/python/standard-library/socket.md
+++ b/docs/python/socket.md
@@ -1,4 +1,4 @@
-# Socket Module CheatSheet
+# Socket Module
 
 ## Definition
 
diff --git a/python/standard-library/sqllite.md b/docs/python/sqlite.md
similarity index 99%
rename from python/standard-library/sqllite.md
rename to docs/python/sqlite.md
index f627e95..bf3f5e3 100644
--- a/python/standard-library/sqllite.md
+++ b/docs/python/sqlite.md
@@ -1,4 +1,4 @@
-# sqlite3 Module CheatSheet
+# sqlite3 Module
 
 ## Connecting To The Database
 
diff --git a/python/standard-library/time_datetime.md b/docs/python/time-datetime.md
similarity index 100%
rename from python/standard-library/time_datetime.md
rename to docs/python/time-datetime.md
diff --git a/python/standard-library/unittest.md b/docs/python/unittest.md
similarity index 100%
rename from python/standard-library/unittest.md
rename to docs/python/unittest.md
diff --git a/regular-expressions.md b/docs/regular-expressions.md
similarity index 100%
rename from regular-expressions.md
rename to docs/regular-expressions.md
diff --git a/rust/cargo.md b/docs/rust/cargo.md
similarity index 100%
rename from rust/cargo.md
rename to docs/rust/cargo.md
diff --git a/rust/rust.md b/docs/rust/rust.md
similarity index 100%
rename from rust/rust.md
rename to docs/rust/rust.md
diff --git a/rust/unit-tests.md b/docs/rust/unit-tests.md
similarity index 100%
rename from rust/unit-tests.md
rename to docs/rust/unit-tests.md
diff --git a/swift/swift.md b/docs/swift/swift.md
similarity index 100%
rename from swift/swift.md
rename to docs/swift/swift.md
diff --git a/dotnet/godot/scripting.md b/dotnet/godot/scripting.md
deleted file mode 100644
index 8fcf91a..0000000
--- a/dotnet/godot/scripting.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# Godot Scripting
-
-## Basics
-
-```cs
-using Godot;
-
-
-public class NodeName : NodeType
-{   
-    [Export]  // make variable visible in inspector
-    Type variable = value;
-
-
-
-    // Called when the node enters the scene tree for the first time.
-    public override void _Ready()
-    {
-        GetNode("NodeName");  // fetch a child node in the scene
-        GetNode("ParentNode/ChildNode");  // fetch a child node in the scene
-
-        AddToGroup("Group");  // add a node to a group (similar to tags)
-
-        GetTree().CallGroup("Group", "Function");  // call Function on all group members
-        var groupMembers = GetTree().GetNodesInGroup("Group");
-    }
-
-    // Called every frame. 'delta' is the elapsed time since the previous frame.
-    public override void _Process(float delta)
-    {
-        
-    }
-
-    public void _OnEmitterSignal() { }
-}
-```
-
-### Overridable Functions
-
-```cs
-public override void _EnterTree()
-{
-    // When the node enters the Scene Tree, it becomes active and  this function is called.
-    // Children nodes have not entered the active scene yet. 
-    // In general, it's better to use _ready() for most cases.
-    base._EnterTree();
-}
-
-public override void _Ready()
-{
-    // This function is called after _enter_tree, but it ensures
-    // that all children nodes have also entered the Scene Tree,
-    // and became active.
-    base._Ready();
-}
-
-public override void _ExitTree()
-{
-    // When the node exits the Scene Tree, this function is called.
-    // Children nodes have all exited the Scene Tree at this point and all became inactive.
-    base._ExitTree();
-}
-
-public override void _Process(float delta)
-{
-    // This function is called every frame.
-    base._Process(delta);
-}
-
-public override void _PhysicsProcess(float delta)
-{
-    // This is called every physics frame.
-    base._PhysicsProcess(delta);
-}
-```
-
-### Creating Nodes
-
-```cs
-private Sprite _sprite;
-
-public override void _Ready()
-{
-    base._Ready();
-
-    _sprite = new Sprite();  // Create a new sprite
-
-    AddChild(_sprite);  // Add it as a child of this node
-    _sprite.Free(); // Immediately removes the node from the scene and frees it.
-}
-```
-
-**Note**: When a node is freed, it also frees all its child nodes.
-
-The safest way to delete a node is by using `Node.QueueFree()`. This erases the node safely during idle.
-
-### Instantiating Scenes
-
-```cs
-// STEP 1: load the scene
-var scene = GD.Load<PackedScene>("res://scene.tscn");  // Will load when the script is instanced.
-
-// STEP 2: instantiate the scene-node
-var node = scene.Instance();
-AddChild(node);
-```
-
-The advantage of this two-step process is that a packed scene may be kept loaded and ready to use so that it's possible to create as many instances as desired.  
-This is especially useful to quickly instance several enemies, bullets, and other entities in the active scene.
-
-## Signals
-
-Signals are Godot's version of the *observer* pattern. They allow a node to send out a message that other nodes can listen for and respond to.
-
-Signals are a way to decouple game objects, which leads to better organized and more manageable code. Instead of forcing game objects to expect other objects to always be present, they can instead emit signals that all interested objects can subscribe to and respond to.
-
-```cs
-public override _Ready()
-{
-    GetNode("Node").Connect("signal", targetNode, nameof(TargetFunction));  // connect node and signal
-}
-
-// Signal Handler
-public void OnEmitterSignal() { }
-```
-
-### Custom Signals
-
-```cs
-public class Node : Node2D
-{
-    [Signal]
-    public delegate void CustomSignal(Type arg, ...);
-
-    public override void _Ready()
-    {
-        EmitSignal(nameof(CustomSignal), args);
-    }
-}
-```
diff --git a/dotnet/lib/skia-sharp.md b/dotnet/lib/skia-sharp.md
deleted file mode 100644
index 09b2aee..0000000
--- a/dotnet/lib/skia-sharp.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# SkiaSharp
-
-```cs
-SKImageInfo info = new SKImageInfo(width, height);
-
-using (SKSurface surface = SKSurface.Create(info))
-{
-    SKCanvas canvas = surface.Canvas;
-    canvas.DrawColor(SKColors.<color>);
-
-    using (SKPaint paint = new SKPaint())
-    {
-        paint.Color = SKColors.Blue;
-        paint.IsAntialias = true;
-        paint.StrokeWidth = 5;
-        paint.Style = SKPaintStyle.Stroke;
-
-        // draw
-        canvas.DrawLine(x0, y0, x1, y1, paint);
-
-    }
-
-    // save to file
-    using (var image = surface.Snapshot())
-    {
-        using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
-        {
-            using (var stream = File.OpenWrite(png_filename))
-            {
-                data.SaveTo(stream);
-            }
-        }
-    }
-}
-```
diff --git a/dotnet/unity/collisions.md b/dotnet/unity/collisions.md
deleted file mode 100644
index 58155c9..0000000
--- a/dotnet/unity/collisions.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# Collisions (Physics)
-
-## Rigidbody Component
-
-Enables physics on the game objects.
-
-Rigidbodies collide with other objects instead of going through them.
-
-Avoid object rotation on collisions:
-
-1. Assign `Rigidbody` component to object
-2. Enable Freeze Rotation in Rigidbody > Constraints
-
-```cs
-using UnityEngine;
-using System.Collections;
-
-public class GameObject : MonoBehaviour {
-
-    Rigidbody = rigidbody;  // game object rigidbody reference container
-
-    void Start()
-    {
-        rigidbody = GetComponent<Rigidbody>();  // get rigidbody reference
-    }
-
-    void Update()
-    {
-    }
-
-    // FixedUpdate is calls every x seconds (not influenced by FPS instability)
-    // used for physics calculations which should be FPS independent
-    void FixedUpdate()
-    {
-        Time.fixedDeltaTime;  // fixed amount of time
-        Time.timeDelta;  // if called inside FIxedUpdate() behaves like fixedDeltaTime
-    }
-
-}
-```
-
-## Box Collider Component
-
-Enable `Is Trigger` to register the collision but avoid blocking the movement of the objects.
-The trigger can generate a event to signal the contact with the object.
-
-One of the colliding GameObjects *must have* the `Rigidbody` component and the other `Is Trigger` enabled.
-To detect the collision but avoid computing the physics `Is Kinematic` must be enabled in the `Rigidbody` component.
-
-```cs
-using UnityEngine;
-using System.Collections;
-
-public class GameObject : MonoBehaviour {
-
-    Rigidbody = rigidbody;  // game object rigidbody reference container
-
-    void Start()
-    {
-        rigidbody = GetComponent<Rigidbody>();  // get rigidbody reference
-    }
-
-    // FixedUpdate is calls every x seconds (not influenced by FPS instability)
-    // used for physics calculations which should be FPS independent
-    void FixedUpdate()
-    {
-        Time.fixedDeltaTime;  // fixed amount of time
-        Time.timeDelta;  // if called inside FixedUpdate() behaves like fixedDeltaTime
-    }
-
-    // called on box collision.
-    void OnTriggerEnter(Collider triggerCollider) {
-
-        // detect a collision with a particular GameObject(must have a TAG)
-        if (triggerCollider.tag = "tag") {
-            Destroy(triggerCollider.gameObject);  // destroy tagged item on collision
-            //or
-            Destroy(gameObject);  // destroy itself
-        }
-    }
-```
diff --git a/dotnet/unity/coroutines.md b/dotnet/unity/coroutines.md
deleted file mode 100644
index 08ef8a2..0000000
--- a/dotnet/unity/coroutines.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Coroutines
-
-[Coroutines - Unity manual](https://docs.unity3d.com/Manual/Coroutines.html)
-
-When you call a function, it runs to completion before returning. This effectively means that any action taking place in a function must happen *within a single frame update*; a function call can't be used to contain a procedural animation or a sequence of events over time.
-
-A coroutine is like a function that has the ability to pause execution and return control to Unity but then to continue where it left off on the following frame.
-
-It is essentially a function declared with a return type of IEnumerator and with the yield return statement included somewhere in the body. The `yield return null` line is the point at which execution will pause and be resumed the following frame.
-
-```cs
-//coroutine
-IEnumerator coroutine()
-{
-    // action performed
-    yield return null;  // pause until next iteration
-
-    // or
-
-    // By default, a coroutine is resumed on the frame after it yields but it is also possible to introduce a time delay
-    yield return new WaitForSeconds(seconds);  // wait seconds before resuming
-
-    // or
-
-    yeld return StartCoroutine(coroutine());  // wait for another coroutine to finish before starting
-}
-
-StartCoroutine(coroutine());  // start the coroutine
-StopCoroutine(coroutine());  // stop the coroutine
-```
diff --git a/dotnet/unity/input-manager.md b/dotnet/unity/input-manager.md
deleted file mode 100644
index 30c26a7..0000000
--- a/dotnet/unity/input-manager.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# Input Manager
-
-The Input Manager uses the following types of controls:
-
-- **Key** refers to any key on a physical keyboard, such as `W`, `Shift`, or the `space bar`.
-- **Button** refers to any button on a physical controller (for example, gamepads), such as the `X` button on an Xbox One controller.
-- A **virtual axis** (plural: axes) is mapped to a **control**, such as a button or a key. When the user activates the control, the axis receives a value in the range of `[-1..1]`.
-
-## Virtual axes
-
-### Axis Properties
-
-**Name**: Axis name. You can use this to access the axis from scripts.
-**Negative Button**, **Positive Button**: The controls to push the axis in the negative and positive direction respectively. These can be keys on a keyboard, or buttons on a joystick or mouse.
-**Alt Negative Button**, **Alt Positive Button**: Alternative controls to push the axis in the negative and positive direction respectively.
-**Gravity**: Speed in units per second that the axis falls toward neutral when no input is present.
-**Dead**: How far the user needs to move an analog stick before your application registers the movement. At runtime, input from all analog devices that falls within this range will be considered null.
-**Sensitivity**: Speed in units per second that the axis will move toward the target value. This is for digital devices only.
-**Snap**: If enabled, the axis value will reset to zero when pressing a button that corresponds to the opposite direction.
-**Type**: The type of input that controls the axis. Select from these values:
-
-- Key or Mouse button
-- Mouse Movement
-- Joystick Axis
-
-**Axis**: The axis of a connected device that controls this axis.
-**JoyNum**: The connected Joystick that controls this axis. You can select a specific joystick, or query input from all joysticks.
-
-### Axis Values
-
-Axis values can be:
-
-- Between `-1` and `1` for joystick and keyboard input. The neutral position for these axes is `0`. Some types of controls, such as buttons on a keyboard, aren't sensitive to input intensity, so they can't produce values other than `-1`, `0`, or `1`.
-- Mouse delta (how much the mouse has moved during the last frame) for mouse input. The values for mouse input axes can be larger than `1` or smaller than `-1` when the user moves the mouse quickly.
-
-```cs
-//Define the speed at which the object moves.
-float moveSpeed = 10;
-
-//Get the value of the Horizontal input axis.
-float horizontalInput = Input.GetAxis("Horizontal");
-
-//Get the value of the Vertical input axis.
-float verticalInput = Input.GetAxis("Vertical");
-
-Vector3 direction = new Vector3(horizontalInput, 0, verticalInput).normalized;
-Vector3 velocity = direction * moveSpeed;
-
-//Move the object to XYZ coordinates defined as horizontalInput, 0, and verticalInput respectively.
-transform.Translate(velocity * Time.deltaTime);
-```
-
-[Time.deltaTime][dt] represents the time that passed since the last frame. Multiplying the moveSpeed variable by Time.deltaTime ensures that the GameObject moves at a constant speed every frame.
-
-[dt]: https://docs.unity3d.com/ScriptReference/Time-deltaTime.html
-
-`GetAxis`: returns the value of the virtual axis identified.
-`GetAxisRaw`: returns the value of the virtual axis identified with no smoothing filtering applied.
-
-## Keys
-
-**Letter keys**: `a`, `b`, `c`, ...
-**Number keys**: `1`, `2`, `3`, ...
-**Arrow keys**: `up`, `down`, `left`, `right`
-**Numpad keys**: `[1]`, `[2]`, `[3]`, `[+]`, `[equals]`, ...
-**Modifier keys**: `right shift`, `left shift`, `right ctrl`, `left ctrl`, `right alt`, `left alt`, `right cmd`, `left cmd`
-**Special keys**: `backspace`, `tab`, `return`, `escape`, `space`, `delete`, `enter`, `insert`, `home`, `end`, `page up`, `page down`
-**Function keys**: `f1`, `f2`, `f3`, ...
-
-**Mouse buttons**: `mouse 0`, `mouse 1`, `mouse 2`, ...
-
-**Specific button on *any* joystick**: `joystick button 0`, `joystick button 1`, `joystick button 2`, ...
-**specific button on a *specific* joystick**: `joystick 1 button 0`, `joystick 1 button 1`, `joystick 2 button 0`, ...
-
-```cs
-Input.GetKey("a");
-Input.GetKey(KeyCode.A);
-```
-
-[Input.GetKey](https://docs.unity3d.com/ScriptReference/Input.GetKey.html)
-[KeyCode](https://docs.unity3d.com/ScriptReference/KeyCode.html)
diff --git a/dotnet/unity/prefabs-instantiation.md b/dotnet/unity/prefabs-instantiation.md
deleted file mode 100644
index 9c8833b..0000000
--- a/dotnet/unity/prefabs-instantiation.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Prefabs
-
-Prefabs are a blueprint for GameObjects and any change made to the prefab is inherited by all it's instances.
-
-## Script Instantiation
-
-```cs
-
-public GameObject prefab;  // reference to the prefab
-
-// instantiate a game GameObject from the prefab with specified position and rotation (rotation must be a quaternion)
-GameObject newInstance = (GameObject) Instantiate(prefab, positionVector3, Quaternion.Euler(rotationVector3));  // instantiate prefab and get reference to instance
-// Instance returns a object and since a GameObject was passed to Instantiate() the returned object can be casted to a GameObject
-```
diff --git a/dotnet/unity/raycasting.md b/dotnet/unity/raycasting.md
deleted file mode 100644
index 51bc979..0000000
--- a/dotnet/unity/raycasting.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Raycasting Notes
-
-A raycast is conceptually like a laser beam that is fired from a point in space along a particular direction. Any object making contact with the beam can be detected and reported.
-
-## 3D Raycasting
-
-```cs
-void Update()
-{
-    // constructor takes in a position end direction
-    Ray ray = new Ray(transform,position, transform.forward);
-    RaycastHit hitInfo;  // struct, stores data on ray collision
-
-    hitInfo.distance  // distance from origin to collision point
-    hitInfo.collider  // collider of the hit object
-    hitInfo.transform  // transform og the hit object
-    hitInfo.collider.gameObject  // reference to the object hit by the ray
-    hitInfo.collider.gameObject  // reference to the object hit by the ray
-    hitInfo.normal  // normal vector og the hit surface
-    hitInfo.point  // actual point of collision
-
-    // static method, object must have a collider dot the collision to happen, returns a BOOL
-    Physics.Raycast(ray, out hitInfo);  // update hitInfo based on ray collisions
-    Physics.Raycast(ray, out hitInfo, float maxRayDistance);  // limit the ray length
-    Physics.Raycast(ray, out hitInfo, Mask mask);  // specify with which layers the ray can interact, layer must be applied to object's mask
-    Physics.Raycast(ray, out hitInfo, Mask mask, QueryTriggerInteraction.Ignore);  // ignore collision if "is trigger" is enabled on other objects
-
-    // detect a collision
-    if (Physics.Raycast(ray, out hitInfo))
-    {
-        //collision happened
-
-        // draw the ray in game for debugging
-        Debug.DrawLine(ray.origin, hitInfo.point, Color.red);  // draw red line if collision happens
-    }
-    else
-    {
-        Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.blue);  // draw blue line if collision happens, arrival point is 100 units from the origin since the ray goes to infinity
-    }
-}
-```
-
-### Detect mouse pointed point in-game
-
-```cs
-public Camera gameCamera;
-
-void Update()
-{
-    // ray going from camera through a screen point
-    Ray ray = gameCamera.ScreenPointToRay(Input.mousePosition);  // Input.mousePosition is the position of the mouse in pixels (screen points)
-    RaycastHit hitInfo;  // place pointed by the mouse
-
-    Physics.Raycast(ray, out hitInfo)  // update pointed position
-}
-```
-
-## 2D Raycasting
-
-```cs
-
-void Start()
-{
-    Physics2D.queriesStartColliders = false;  // avoid collision with collider of the ray generator gameObject
-}
-
-void Update()
-{
-    // returns a RaycastHit2D, needs an origin and direction separately
-    Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction);
-    Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction, float maxRayDistance);
-    Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction, float maxRayDistance);
-    Raycast2D hitInfo = Physics2D.Raycast(Vector2 origin, Vector2 direction, float minDepth, float maxDepth);  // set range of z-coord values in which detect hits (sprites depth)
-
-    //! the ray starts from INSIDE the gameObject and can collider with it's collider
-
-    // detect collision
-    if (hitInfo.collider != null) {
-        // collision happened
-        Debug.DrawLine(transform.position, hitInfo.point)
-    }
-}
-```
diff --git a/dotnet/unity/scripting.md b/dotnet/unity/scripting.md
deleted file mode 100644
index bc57190..0000000
--- a/dotnet/unity/scripting.md
+++ /dev/null
@@ -1,135 +0,0 @@
-# Unity C# Scripting
-
-## Logging
-
-```c#
-Debug.Log(string);    //output message to console (more powerful and flexible than print())
-Print(string);    //output message to console
-```
-
-## Scripts
-
-```c#
-public class ClassName : MonoBehaviour {
-
-    // Start is called before the first frame update
-    void Start()
-    {
-
-    }
-
-    // Update is called once per frame
-    void Update()
-    {
-        Time.deltaTime;  // time since last frame
-    }
-
-    // FixedUpdate is calls every x seconds (not influenced by FPS instability)
-    // used for physics calculations which should be FPS independent
-    void FixedUpdate()
-    {
-        Time.fixedDeltaTime;  // fixed amount of time
-        Time.timeDelta;  // if called inside FIxedUpdate() behaves like fixedDeltaTime
-    }
-}
-```
-
-### Script communication
-
-Referencing data in a script from another.
-
-```cs
-//example of a script to be referenced in another
-Using System;
-
-public class Player : MonoBehaviour {
-
-    public float health = 10;
-    public event Action OnPlayerDeath;  //event of type Action, needs using System
-
-    void Start() {
-
-    }
-
-    void Update() {
-
-        if (health <= 0) {
-            if (OnPlayerDeath != null) {
-                OnPlayerDeath();  // invoke Action (if no subscribers event will be NULL, can cause errors)
-            }
-
-            Destroy(GameObject);  // needs to be notified
-        }
-    }
-}
-```
-
-```cs
-// example of script needing a reference to another
-public class GameUI : MonoBehaviour {
-
-    Player player;  //instance of referenced GameObject to be found by its type
-
-    void Start(){
-        GameObject playerObj = GameObject.Find("Player");  //reference to game object
-        GameObject playerObj = GameObject.FindGameObjectWithTag("Tag");  //reference to game object
-        player = playerObj.GetComponent<Player>();  // get script attached to the GameObject
-
-        player = FindObjectOfType<Player>();  // get reference to an object
-
-        // on event invocation all subscriber methods will be called
-        player.OnPlayerDeath += GameOver;  // subscribe method to event
-    }
-
-    void Update() {
-        DrawHealthBar(plyer.health);  // call method passing data of player GameObject
-    }
-
-    void DrawHealthBar(float playerHealth) {
-        // implementation
-    }
-
-    public void GameOver() {
-        //game over screen
-    }
-}
-```
-
-## Screen
-
-### 2D Screen Measures
-
-Aspect Ratio = `(screen_width [px]) / (screen_height [px])`
-Orthographic Size `[world units]` = `(screen_height [world units] / 2)`
-Aspect Ratio * Orthographic Size = `(screen_width [world units] / 2)`
-Screen Width `[world units]` = `(AspectRatio * OrthographicSize * 2)`
-
-```cs
-screenWidth = Camera.main.aspect * Camera.main.orthographicSize * 2;
-```
-
-## Scriptable Objects
-
-Class to store data in stand alone assets, used to keep data out of scripts.  
-Can be used as a template.
-
-```c#
-[CreateAssetMenu(menuName = "ScriptableObjectName")]    //enable creation of scriptable object
-public class ScriptableObjectName : ScriptableObject {
-    //data structure here
-}
-```
-
-### Game Object Serialization
-
-```c#
-[SerializeField] type variable;    //access game object from code
-```
-
-### Game Object Data Access
-
-```c#
-public type GetVariable(){
-    return variable;
-}
-```
diff --git a/dotnet/unity/vectors-tranfrorms-space.md b/dotnet/unity/vectors-tranfrorms-space.md
deleted file mode 100644
index 81842a3..0000000
--- a/dotnet/unity/vectors-tranfrorms-space.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# Vector, Transform, Space
-
-## Vector2, Vector3, Vector4
-
-[Vector3 Docs](https://docs.unity3d.com/ScriptReference/Vector3.html)
-
-Used to store positions, velocities and directions.
-
-Magnitude = `sqrt(Math.pow(x, 2) + Math.pow(y, 2))`
-Direction = `(x / Magnitude, y / Magnitude)`
-
-The direction is calculated by normalizing the vector to make it become a unit vector (*versor*).
-
-```cs
-Vector3.x  // x coord of vector
-Vector3.y  // x coord of vector
-Vector3.z  // x coord of vector
-
-Vector3.magnitude
-Vector3.normalized
-
-Vector3.up // Vector3(0, 1, 0)
-Vector3.down // Vector3(0, -1, 0)
-Vector3.left // Vector3(-1, 0, 0)
-Vector3.right // Vector3(1, 0, 0)
-Vector3.forward // Vector3(0, 0, 1)
-Vector3.back // Vector3(0, 0, -1)
-Vector3.one // Vector3(1, 1, 1)
-Vector3.zero // Vector3(0, 0, 0)
-Vector3.one // Vector3(1, 1, 1)
-```
-
-### Operations
-
-```cs
-Vector3(x, y, z) * n = Vector3(xn, yn, yz);
-Vector3(x, y, z) / n = Vector3(x / n, y / n, y / z);
-
-Vector3(x1, y1, z1) + Vector3(x2, y2, z2) = Vector3(x1 + x2, y1 + y2, z1 + z2);
-Vector3(x1, y1, z1) - Vector3(x2, y2, z2) = Vector3(x1 - x2, y1 - y2, z1 - z2);
-
-Quaternion.Euler(Vector3)  // convert a Vector3 to a Quaternion
-```
-
-### Movement
-
-Speed = value m/s
-Velocity = Direction * Speed
-
-MovementInFrame = Speed * timeSinceLastFrame
-
-## Transform
-
-[Transform Docs](https://docs.unity3d.com/ScriptReference/Transform.html)
-
-```cs
-// properties
-transform.position // Vector3 - global position
-transform.localPosition // Vector3 - local position
-transform.rotation  // Quaternion - global rotation
-transform.parent  // Transform - parent of the object
-
-transform.localScale = Vector3;  // set object dimensions
-
-// methods
-transform.Rotate(Vector3 * Time.deltaTime * speed, Space);  // set rotation using vectors in selected space (Space.Self or Space.World)
-transform.Translate(Vector3 * Time.deltaTime * speed, Space);  // set movement in selected space
-```
-
-### Local, GLobal & Object Space
-
-**Local Space**: Applies transformation relative to the *local* coordinate system (`Space.Self`).
-**Global Space**: Applies transformation relative to the *world* coordinate system (`Space.World`)
-
-### Parenting
-
-Changing the parent will make position, scale and rotation of the child object relative to the parent but keep the world space's position, rotation and scale the same.
-
-Setting the parentele by script:
-
-```cs
-public class ParentScript : MonoBehaviour {
-    public Transform childTransform;  // reference to the child object transform
-
-    childTransform.parent = transform;  // when evaluated at runtime sets current object as parent of another
-}
-```
diff --git a/dotnet/xamarin/app.xaml.cs.md b/dotnet/xamarin/app.xaml.cs.md
deleted file mode 100644
index 08a675c..0000000
--- a/dotnet/xamarin/app.xaml.cs.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# App.xaml.cs
-
-This `App` class is defined as `public` and derives from the Xamarin.Forms `Application` class.
-The constructor has just one responsibility: to set the `MainPage` property of the `Application` class to an object of type `Page`.
-
-```cs
-using System;
-using Xamarin.Forms;
-using Xamarin.Forms.Xaml;
-
-namespace AppName
-{
-    public partial class App : Application
-    {
-        public App()
-        {
-            InitializeComponent();
-
-            MainPage = new MainPage();
-        }
-
-        protected override void OnStart()
-        {
-        }
-
-        protected override void OnSleep()
-        {
-        }
-
-        protected override void OnResume()
-        {
-        }
-    }
-}
-```
diff --git a/dotnet/xamarin/app.xaml.md b/dotnet/xamarin/app.xaml.md
deleted file mode 100644
index c1fd1f5..0000000
--- a/dotnet/xamarin/app.xaml.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# App.xaml
-
-## Root Tag
-
-The `<Application>` tag begins with two XML namespace declarations, both of which are URIs.
-
-The default namespace belongs to **Xamarin**. This is the XML namespace (`xmlns`) for elements in the file with no prefix, such as the `ContentPage` tag.
-The URI includes the year that this namespace came into being and the word *forms* as an abbreviation for Xamarin.Forms.
-
-The second namespace is associated with a prefix of `x` by convention, and it belongs to **Microsoft**. This namespace refers to elements and attributes that are intrinsic to XAML and are found in every XAML implementation.
-The word *winfx* refers to a name once used for the .NET Framework 3.0, which introduced WPF and XAML.
-
-The `x:Class` attribute can appear only on the root element of a XAML file. It specifies the .NET namespace and name of a derived class. The base class of this derived class is the root element.
-
-In other words, this `x:Class` specification indicates that the `App` class in the `AppName` namespace derives from `Application`.
-That's exactly the same information as the `App` class definition in the `App.xaml.cs` file.
-
-```xml
-<?xml version="1.0" encoding="utf-8" ?>
-<Application xmlns="http://xamarin.com/schemas/2014/forms"
-             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
-             x:Class="AppName.App">
-</Application>
-```
-
-## Shared Resources
-
-```xml
-<?xml version="1.0" encoding="utf-8" ?>
-<Application xmlns="http://xamarin.com/schemas/2014/forms"
-             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
-             x:Class="AppName.App">
-
-    <!-- collection of shared resources definitions -->
-    <Application.Resources>
-
-        <!-- Application resource dictionary -->
-        <ResourceDictionary>
-            <!-- Key-Value Pair -->
-            <Type x:Key="DictKey">value<Type>
-        </ResourceDictionary>
-
-        <!-- define a reusable style -->
-        <Style x:Key="Style Name" TargetType="Element Type">
-            <!-- set properties of the style -->
-            <Setter Property="PropertyName" Value="PropertyValue">
-        </Style>
-
-    </Application.Resources>
-</Application>
-```
diff --git a/dotnet/xamarin/page.xaml.cs.md b/dotnet/xamarin/page.xaml.cs.md
deleted file mode 100644
index d408e8b..0000000
--- a/dotnet/xamarin/page.xaml.cs.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Page.xaml.cs
-
-```cs
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Xamarin.Forms;
-
-namespace AppName
-{
-    public partial class PageName : ContentPage
-    {
-        public PageName()
-        {
-            InitializeComponent();
-        }
-    }
-}
-```
diff --git a/dotnet/xamarin/page.xaml.md b/dotnet/xamarin/page.xaml.md
deleted file mode 100644
index 9ea1369..0000000
--- a/dotnet/xamarin/page.xaml.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# Page.xaml
-
-## Anatomy of an app
-
-The modern user interface is constructed from visual objects of various sorts. Depending on the operating system, these visual objects might go by different names—controls, elements, views, widgets—but they are all devoted to the jobs of presentation or interaction or both.
-
-In Xamarin.Forms, the objects that appear on the screen are collectively called *visual elements* (`VisualElement` class).
-
-They come in three main categories:
-
-- page (`Page` class)
-- layout (`Layout` class)
-- view (`View` class)
-
-A Xamarin.Forms application consists of one or more pages. A page usually occupies all (or at least a large area) of the screen.
-Some applications consist of only a single page, while others allow navigating between multiple pages.
-
-On each page, the visual elements are organized in a parent-child hierarchy.
-Some layouts have a single child, but many layouts have multiple children that the layout arranges within itself. These children can be other layouts or views.
-
-The term *view* in Xamarin.Forms denotes familiar types of presentation and interactive objects.
-
-## Pages
-
-![pages](../../.images/dotnet_xamarin-pages.png)
-
-```xml
-<?xml version="1.0" encoding="utf-8" ?>
-
-<!-- Sets the Content property to a single View -->
-<ContentPage></ContentPage>
-
-<!-- Manages two panes of information (Master and Detail property) -->
-<MasterDetailPage></MasterDetailPage>
-
-<!-- Manages navigation among other pages using a stack-based architecture -->
-<NavigationPage></NavigationPage>
-
-<!-- Allows navigation among child pages using tabs -->
-<TabbedPage></TabbedPage>
-
-<!-- Displays full-screen content with a control template -->
-<TemplatePage></TemplatePage>
-
-<!-- Allows navigation among child pages through finger swiping -->
-<CarouselPage></CarouselPage>
-```
-
-## Layouts
-
-![layouts](../../.images/dotnet_xamarin-layouts.png)
-
-- StackLayout: Organizes views linearly, either horizontally or vertically.
-- AbsoluteLayout: Organizes views by setting coordinates & size in terms of absolute values or ratios.
-- RelativeLayout: Organizes views by setting constraints relative to their parent's dimensions & position.
-- Grid: Organizes views in a grid of Rows and Columns
-- FlexLayout: Organizes views horizontally or vertically with wrapping.
-- ScrollView: Layout that's capable of scrolling its content.
-
-### Grid Layout
-
-```xml
-<!-- "<num>*" makes the dimensions proportional -->
-<Gird.RowDefinitions>
-    <!-- insert a row in the layout -->
-    <RowDefinition Height="2*"/>
-</Gird.RowDefinitions>
-
-<Grid.ColumnDefinitions>
-    <!-- insert column in layout -->
-    <ColumnDefinition Width=".5*"/>
-</Grid.ColumnDefinitions>
-```
-
-## [Views](https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-controls "XAML Views")
-
-```xml
-<Image Source="" BackgroundColor="" [LayoutPosition]/>
-<!-- source contains reference to image file in Xamarin.[OS]/Resources/drawable -->
-
-<!-- box to insert text -->
-<Editor Placeholder="placeholder text" [LayoutPosition]/>
-
-<!-- clickable button -->
-<Button Text="button text" BackgroundColor="" Clicked="function_to_call" [LayoutPosition]/>
-```
diff --git a/dotnet/xamarin/view-model.cs.md b/dotnet/xamarin/view-model.cs.md
deleted file mode 100644
index d17ae2e..0000000
--- a/dotnet/xamarin/view-model.cs.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# ViewModel.cs
-
-```cs
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.ComponentModel;
-using System.Text;
-using Xamarin.Forms;
-
-namespace AppName.ViewModels
-{
-    class PageNameViewModel : INotifyPropertyChanged
-    {
-        public MainPageViewModel()
-        {
-        }
-
-        public event PropertyChangedEventHandler PropertyChanged;  // event handler to notify changes
-
-        public string field;  // needed, if substituted by ExprBody will cause infinite loop of access with the binding
-        public string Property
-        {
-            get => field;
-            set
-            {
-                field = value;
-
-                var args = new PropertyChangedEventArgs(nameof(Property));  // EVENT: let view know that the Property has changed
-                PropertyChanged?.Invoke(this, args);  // Invoke event to notify the view
-            }
-        }
-    }
-}
-```
diff --git a/dotnet/xamarin/xamarin-essentials.md b/dotnet/xamarin/xamarin-essentials.md
deleted file mode 100644
index b3965b1..0000000
--- a/dotnet/xamarin/xamarin-essentials.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Xamarin.Essentials
-
-Android, iOS, and UWP offer unique operating system and platform APIs that developers have access to all in C# leveraging Xamarin.
-**Xamarin.Essentials** provides a *single cross-platform API* that works with any Xamarin.Forms, Android, iOS, or UWP application that can be accessed from shared code no matter how the user interface is created.
-
-- [Accelerometer](https://docs.microsoft.com/en-us/xamarin/essentials/accelerometer): Retrieve acceleration data of the device in three dimensional space.
-- [App Information](https://docs.microsoft.com/en-us/xamarin/essentials/app-information): Find out information about the application.
-- [App Theme](https://docs.microsoft.com/en-us/xamarin/essentials/app-theme): Detect the current theme requested for the application.
-- [Barometer](https://docs.microsoft.com/en-us/xamarin/essentials/barometer): Monitor the barometer for pressure changes.
-- [Battery](https://docs.microsoft.com/en-us/xamarin/essentials/battery): Easily detect battery level, source, and state.
-- [Clipboard](https://docs.microsoft.com/en-us/xamarin/essentials/clipboard): Quickly and easily set or read text on the clipboard.
-- [Color Converters](https://docs.microsoft.com/en-us/xamarin/essentials/color-converters): Helper methods for System.Drawing.Color.
-- [Compass](https://docs.microsoft.com/en-us/xamarin/essentials/compass): Monitor compass for changes.
-- [Connectivity](https://docs.microsoft.com/en-us/xamarin/essentials/connectivity): Check connectivity state and detect changes.
-- [Detect Shake](https://docs.microsoft.com/en-us/xamarin/essentials/detect-shake): Detect a shake movement of the device.
-- [Device Display Information](https://docs.microsoft.com/en-us/xamarin/essentials/device-display): Get the device's screen metrics and orientation.
-- [Device Information](https://docs.microsoft.com/en-us/xamarin/essentials/device-information): Find out about the device with ease.
-- [Email](https://docs.microsoft.com/en-us/xamarin/essentials/email): Easily send email messages.
-- [File System Helpers](https://docs.microsoft.com/en-us/xamarin/essentials/file-system-helpers): Easily save files to app data.
-- [Flashlight](https://docs.microsoft.com/en-us/xamarin/essentials/flashlight): A simple way to turn the flashlight on/off.
-- [Geocoding](https://docs.microsoft.com/en-us/xamarin/essentials/geocoding): Geocode and reverse geocode addresses and coordinates.
-- [Geolocation](https://docs.microsoft.com/en-us/xamarin/essentials/geolocation): Retrieve the device's GPS location.
-- [Gyroscope](https://docs.microsoft.com/en-us/xamarin/essentials/gyroscope): Track rotation around the device's three primary axes.
-- [Launcher](https://docs.microsoft.com/en-us/xamarin/essentials/launcher): Enables an application to open a URI by the system.
-- [Magnetometer](https://docs.microsoft.com/en-us/xamarin/essentials/magnetometer): Detect device's orientation relative to Earth's magnetic field.
-- [MainThread](https://docs.microsoft.com/en-us/xamarin/essentials/main-thread): Run code on the application's main thread.
-- [Maps](https://docs.microsoft.com/en-us/xamarin/essentials/maps): Open the maps application to a specific location.
-- [Open Browser](https://docs.microsoft.com/en-us/xamarin/essentials/open-browser): Quickly and easily open a browser to a specific website.
-- [Orientation Sensor](https://docs.microsoft.com/en-us/xamarin/essentials/orientation-sensor): Retrieve the orientation of the device in three dimensional space.
-- [Permissions](https://docs.microsoft.com/en-us/xamarin/essentials/permissions): Check and request permissions from users.
-- [Phone Dialer](https://docs.microsoft.com/en-us/xamarin/essentials/phone-dialer): Open the phone dialer.
-- [Platform Extensions](https://docs.microsoft.com/en-us/xamarin/essentials/platform-extensions): Helper methods for converting Rect, Size, and Point.
-- [Preferences](https://docs.microsoft.com/en-us/xamarin/essentials/preferences): Quickly and easily add persistent preferences.
-- [Secure Storage](https://docs.microsoft.com/en-us/xamarin/essentials/secure-storage): Securely store data.
-- [Share](https://docs.microsoft.com/en-us/xamarin/essentials/share): Send text and website uris to other apps.
-- [SMS](https://docs.microsoft.com/en-us/xamarin/essentials/sms): Create an SMS message for sending.
-- [Text-to-Speech](https://docs.microsoft.com/en-us/xamarin/essentials/text-to-speech): Vocalize text on the device.
-- [Unit Converters](https://docs.microsoft.com/en-us/xamarin/essentials/unit-converters): Helper methods to convert units.
-- [Version Tracking](https://docs.microsoft.com/en-us/xamarin/essentials/version-tracking): Track the applications version and build numbers.
-- [Vibrate](https://docs.microsoft.com/en-us/xamarin/essentials/vibrate): Make the device vibrate.
-- [Web Authenticator](https://docs.microsoft.com/en-us/xamarin/essentials/web-authenticator): Start web authentication flows and listen for a callback.
diff --git a/mkdocs.yml b/mkdocs.yml
new file mode 100644
index 0000000..195d51b
--- /dev/null
+++ b/mkdocs.yml
@@ -0,0 +1,125 @@
+site_name: Programming Notes
+repo_url: https://github.com/m-lamonaca/programming-notes
+repo_name: GitHub
+edit_uri: /blob/main/docs
+remote_branch: gh-pages
+remote_name: origin
+site_url: http://m-lamonaca.github.io/programming-notes
+site_author: Marcello Lamonaca
+copyright: MIT
+
+docs_dir: docs
+site_dir: site
+
+theme:
+  name: readthedocs
+  locale: en
+  include_sidebar: true
+
+nav:
+  - Home: index.md
+  - Git: git/git.md
+  - HTML: html/html.md
+  - CSS: css/css.md
+  - Markdown: markdown.md
+  - GraphQL: graph-ql.md
+  - RegEx: regular-expressions.md
+  - C++: C++/cpp.md
+  - Kotlin: kotlin/kotlin.md
+  - Swift: swift/swift.md
+  - Database:
+    - Redis: database/redis.md
+    - SQL: database/sql.md
+    - MongoDB: database/mongo-db.md
+  - Python:
+      - Python: python/python.md
+      - argparse: python/argparse.md
+      - collection: python/collections.md
+      - csv: python/csv.md
+      - ftplib: python/ftplib.md
+      - itertools: python/itertools.md
+      - json: python/json.md
+      - logging: python/logging.md
+      - shutil: python/shutil.md
+      - smtplib: python/smtplib.md
+      - socket: python/socket.md
+      - sqlite: python/sqlite.md
+      - time & datetime: python/time-datetime.md
+      - unittest: python/unittest.md
+      - Libraries:
+        - TKinter: python/libs/tkinter.md
+        - Numpy: python/libs/numpy.md
+        - Pandas: python/libs/pandas.md
+        - Seaborn: python/libs/seaborn.md
+        - Requests: python/libs/requests.md
+        - Beatiful Soup: python/libs/beautiful-soup.md
+  - .NET:
+      - C#:
+          - C#: dotnet/C#/C#.md
+          - Linq: dotnet/C#/linq.md
+          - Collections: dotnet/C#/collections.md
+          - Reactive Extensions: dotnet/C#/reactive-extensions.md
+          - Async Programming: dotnet/C#/async-programming.md
+          - Unit Tests: dotnet/C#/unit-tests.md
+      - ASP.NET:
+          - App Configuration: dotnet/asp.net/app-configuration.md
+          - Minimal API: dotnet/asp.net/minimal-api.md
+          - MVC: dotnet/asp.net/mvc.md
+          - FIlters: dotnet/asp.net/filters.md
+          - Middleware: dotnet/asp.net/middleware.md
+          - Razor Pages: dotnet/asp.net/razor-syntax.md
+          - Blazor: dotnet/asp.net/blazor.md
+          - Razor Pages: dotnet/asp.net/razor-pages.md
+          - Razor Syntax: dotnet/asp.net/razor-syntax.md
+          - REST API: dotnet/asp.net/rest-api.md
+          - SignalR: dotnet/asp.net/signalr.md
+          - Web Forms: dotnet/asp.net/web-forms.md
+      - Database:
+          - ADO.NET: dotnet/database/ado.net.md
+          - Entity Framework: dotnet/database/entity-framework.md
+  - Java:
+      - Java: java/java.md
+      - Java Collection Framework: java/java-collection-framework.md
+      - DAO: java/dao.md
+      - Web:
+          - Serverlet: java/web/servlet.md
+          - Spring:
+              - POM: java/spring/pom.xml.md
+              - Project Structure: java/spring/spring-project.md
+  - PHP:
+      - PHP: php/php.md
+      - Database: php/database.md
+      - Web: php/web.md
+      - Dependency Injection: php/dependency-injection.md
+      - Unit Tests: php/unit-tests.md
+      - Composer: php/composer.md
+      - PSR 7: php/psr-7.md
+      - Plates: php/plates-templating.md
+      - Simple MVC:
+          - Simple MVC: php/simple-mvc/simple-mvc.md
+          - REST API: php/simple-mvc/rest-api.md
+  - Rust:
+      - Rust: rust/rust.md
+      - Cargo: rust/cargo.md
+      - Unit Tests: rust/unit-tests.md
+  - Javascript:
+      - Javascript: javascript/javascript.md
+      - DOM: javascript/dom.md
+      - Events & Animation: javascript/events-animation.md
+      - AJAX: javascript/ajax.md
+      - jQuery: javascript/jquery.md
+      - React:
+          - React: javascript/react/react.md
+          - React Router: javascript/react/react-router.md
+          - React Tests: javascript/react/react-tests.md
+          - Redux: javascript/react/redux.md
+          - Redux Tests: javascript/react/redux-tests.md
+      - Svelte: javascript/svelte/svelte.md
+  - iOS:
+      - ContentView: ios/content-view.md
+  - PowerShell:
+      - Scripting: powershell/scripting.md
+      - Commands: powershell/commands.md
+  - Bash:
+      - Scripting: bash/scripting.md
+      - Commands: bash/commands.md
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..bdef867
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,362 @@
+[[package]]
+name = "click"
+version = "8.1.3"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[[package]]
+name = "colorama"
+version = "0.4.4"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "ghp-import"
+version = "2.1.0"
+description = "Copy your docs directly to the gh-pages branch."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+python-dateutil = ">=2.8.1"
+
+[package.extras]
+dev = ["twine", "markdown", "flake8", "wheel"]
+
+[[package]]
+name = "importlib-metadata"
+version = "4.11.4"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+perf = ["ipython"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "jinja2"
+version = "3.1.2"
+description = "A very fast and expressive template engine."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
+[[package]]
+name = "markdown"
+version = "3.3.7"
+description = "Python implementation of Markdown."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+testing = ["coverage", "pyyaml"]
+
+[[package]]
+name = "markupsafe"
+version = "2.1.1"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "mergedeep"
+version = "1.3.4"
+description = "A deep merge function for 🐍."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "mkdocs"
+version = "1.3.0"
+description = "Project documentation with Markdown."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+click = ">=3.3"
+ghp-import = ">=1.0"
+importlib-metadata = ">=4.3"
+Jinja2 = ">=2.10.2"
+Markdown = ">=3.2.1"
+mergedeep = ">=1.3.4"
+packaging = ">=20.5"
+PyYAML = ">=3.10"
+pyyaml-env-tag = ">=0.1"
+watchdog = ">=2.0"
+
+[package.extras]
+i18n = ["babel (>=2.9.0)"]
+
+[[package]]
+name = "packaging"
+version = "21.3"
+description = "Core utilities for Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
+
+[[package]]
+name = "pyparsing"
+version = "3.0.9"
+description = "pyparsing module - Classes and methods to define and execute parsing grammars"
+category = "main"
+optional = false
+python-versions = ">=3.6.8"
+
+[package.extras]
+diagrams = ["railroad-diagrams", "jinja2"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+description = "Extensions to the standard Python datetime module"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "pyyaml"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "pyyaml-env-tag"
+version = "0.1"
+description = "A custom YAML tag for referencing environment variables in YAML files. "
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyyaml = "*"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "watchdog"
+version = "2.1.8"
+description = "Filesystem events monitoring"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+watchmedo = ["PyYAML (>=3.10)"]
+
+[[package]]
+name = "zipp"
+version = "3.8.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.10"
+content-hash = "cac52b61c8c358718274193929c33d3eacb9e0637b4f93b74dd72bd90fc7a827"
+
+[metadata.files]
+click = [
+    {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
+    {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
+]
+colorama = [
+    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+ghp-import = [
+    {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
+    {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-4.11.4-py3-none-any.whl", hash = "sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec"},
+    {file = "importlib_metadata-4.11.4.tar.gz", hash = "sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700"},
+]
+jinja2 = [
+    {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
+    {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
+]
+markdown = [
+    {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"},
+    {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"},
+]
+markupsafe = [
+    {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"},
+    {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"},
+]
+mergedeep = [
+    {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
+    {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
+]
+mkdocs = [
+    {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"},
+    {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"},
+]
+packaging = [
+    {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
+    {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
+]
+pyparsing = [
+    {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
+    {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
+]
+python-dateutil = [
+    {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+    {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+pyyaml = [
+    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
+pyyaml-env-tag = [
+    {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
+    {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
+]
+six = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+watchdog = [
+    {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:676263bee67b165f16b05abc52acc7a94feac5b5ab2449b491f1a97638a79277"},
+    {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aa68d2d9a89d686fae99d28a6edf3b18595e78f5adf4f5c18fbfda549ac0f20c"},
+    {file = "watchdog-2.1.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e2e51c53666850c3ecffe9d265fc5d7351db644de17b15e9c685dd3cdcd6f97"},
+    {file = "watchdog-2.1.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7721ac736170b191c50806f43357407138c6748e4eb3e69b071397f7f7aaeedd"},
+    {file = "watchdog-2.1.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ce7376aed3da5fd777483fe5ebc8475a440c6d18f23998024f832134b2938e7b"},
+    {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f9ee4c6bf3a1b2ed6be90a2d78f3f4bbd8105b6390c04a86eb48ed67bbfa0b0b"},
+    {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:68dbe75e0fa1ba4d73ab3f8e67b21770fbed0651d32ce515cd38919a26873266"},
+    {file = "watchdog-2.1.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0c520009b8cce79099237d810aaa19bc920941c268578436b62013b2f0102320"},
+    {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efcc8cbc1b43902571b3dce7ef53003f5b97fe4f275fe0489565fc6e2ebe3314"},
+    {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:746e4c197ec1083581bb1f64d07d1136accf03437badb5ff8fcb862565c193b2"},
+    {file = "watchdog-2.1.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ae17b6be788fb8e4d8753d8d599de948f0275a232416e16436363c682c6f850"},
+    {file = "watchdog-2.1.8-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ddde157dc1447d8130cb5b8df102fad845916fe4335e3d3c3f44c16565becbb7"},
+    {file = "watchdog-2.1.8-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4978db33fc0934c92013ee163a9db158ec216099b69fce5aec790aba704da412"},
+    {file = "watchdog-2.1.8-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b962de4d7d92ff78fb2dbc6a0cb292a679dea879a0eb5568911484d56545b153"},
+    {file = "watchdog-2.1.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e5d0fdfaa265c29dc12621913a76ae99656cf7587d03950dfeb3595e5a26102"},
+    {file = "watchdog-2.1.8-py3-none-manylinux2014_armv7l.whl", hash = "sha256:036ed15f7cd656351bf4e17244447be0a09a61aaa92014332d50719fc5973bc0"},
+    {file = "watchdog-2.1.8-py3-none-manylinux2014_i686.whl", hash = "sha256:2962628a8777650703e8f6f2593065884c602df7bae95759b2df267bd89b2ef5"},
+    {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64.whl", hash = "sha256:156ec3a94695ea68cfb83454b98754af6e276031ba1ae7ae724dc6bf8973b92a"},
+    {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:47598fe6713fc1fee86b1ca85c9cbe77e9b72d002d6adeab9c3b608f8a5ead10"},
+    {file = "watchdog-2.1.8-py3-none-manylinux2014_s390x.whl", hash = "sha256:fed4de6e45a4f16e4046ea00917b4fe1700b97244e5d114f594b4a1b9de6bed8"},
+    {file = "watchdog-2.1.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:24dedcc3ce75e150f2a1d704661f6879764461a481ba15a57dc80543de46021c"},
+    {file = "watchdog-2.1.8-py3-none-win32.whl", hash = "sha256:6ddf67bc9f413791072e3afb466e46cc72c6799ba73dea18439b412e8f2e3257"},
+    {file = "watchdog-2.1.8-py3-none-win_amd64.whl", hash = "sha256:88ef3e8640ef0a64b7ad7394b0f23384f58ac19dd759da7eaa9bc04b2898943f"},
+    {file = "watchdog-2.1.8-py3-none-win_ia64.whl", hash = "sha256:0fb60c7d31474b21acba54079ce9ff0136411183e9a591369417cddb1d7d00d7"},
+    {file = "watchdog-2.1.8.tar.gz", hash = "sha256:6d03149126864abd32715d4e9267d2754cede25a69052901399356ad3bc5ecff"},
+]
+zipp = [
+    {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"},
+    {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..e875dad
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,16 @@
+[tool.poetry]
+name = "programming-notes"
+version = "0.1.0"
+description = ""
+authors = ["Marcello Lamonaca <marcello@lamonaca.eu>"]
+license = "MIT"
+
+[tool.poetry.dependencies]
+python = "^3.10"
+mkdocs = "^1.3.0"
+
+[tool.poetry.dev-dependencies]
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/python/jupyter/jupiter-notebook.md b/python/jupyter/jupiter-notebook.md
deleted file mode 100644
index 7b8f961..0000000
--- a/python/jupyter/jupiter-notebook.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Jupyter Notebooks Cheat Sheet
-
-## MAGIC COMMANDS
-
-`%quickref` Display the IPython Quick Reference Card  
-`%magic` Display detailed documentation for all of the available magic commands  
-`%debug` Enter the interactive debugger at the bottom of the last exception trace-back  
-`%hist` Print command input (and optionally output) history  
-`%pdb` Automatically enter debugger after any exception  
-`%paste` Execute pre-formatted Python code from clipboard  
-`%cpaste` Open a special prompt for manually pasting Python code to be executed  
-`%reset` Delete all variables / names defined in interactive namespace  
-`%page` OBJECT Pretty print the object and display it through a pager  
-`%run` script.py Run a Python script inside IPython  
-`%prun` statement Execute statement with cProfile and report the profiler output  
-`%time` statement Report the execution time of single statement  
-`%timeit` statement Run a statement multiple times to compute an ensemble average execution time. Useful for timing code with very short execution time  
-`%who`, `%who_ls`, `%whos` Display variables defined in interactive namespace, with varying levels of information / verbosity  
-`%xdel` variable Delete a variable and attempt to clear any references to the object in the IPython internals  
-
-## INTERACTING WITH THE OPERATING SYSTEM
-
-`!cmd` Execute cmd in the system shell  
-`output = !cmd args` Run cmd and store the stdout in output  
-`%alias alias_name cmd` Define an alias for a system (shell) command  
-`%bookmark` Utilize IPython's directory bookmarking system  
-`%cd` directory Change system working directory to passed directory  
-`%pwd` Return the current system working directory  
-`%pushd` directory Place current directory on stack and change to target directory  
-`%popd` Change to directory popped off the top of the stack  
-`%dirs` Return a list containing the current directory stack  
-`%dhist` Print the history of visited directories  
-`%env` Return the system environment variables as a dict  
-
-Input variables are stored in variables named like `iX`, where `X` is the input line number  
-
-IPython is capable of logging the entire console session including input and output  
-Logging is turned on by typing `%logstart`  
-
-Starting a line in IPython with an exclamation point `!`, or bang, tells IPython to execute everything after the bang in the system shell  
-The console output of a shell command can be stored in a variable by assigning the !-escaped expression to a variable  
-
-## TIMING CODE
-
-`%time` runs a statement once, reporting the total execution time  
-`%timeit` given an arbitrary statement, it has a heuristic to run a statement multiple times to produce a fairly accurate average runtime
diff --git a/python/libs/cli/click.md b/python/libs/cli/click.md
deleted file mode 100644
index 0be8644..0000000
--- a/python/libs/cli/click.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# [Click](https://click.palletsprojects.com) Lib
-
-## Command Creation
-
-```py
-import click
-
-# the decorator converts the function into a Command which then can be invoked
-@click.command()
-def hello():
-    click.echo('Hello World!')
-
-if __name__ == '__main__':
-    hello()
-```
-
-### Nesting Commands
-
-Commands can be attached to other commands of type `Group`. This allows arbitrary nesting of scripts. As an example here is a script that implements two commands for managing databases:
-
-```py
-@click.group()
-def cli():
-    pass
-
-@click.command()
-def initdb():
-    click.echo('Initialized the database')
-
-@click.command()
-def dropdb():
-    click.echo('Dropped the database')
-
-cli.add_command(initdb)
-cli.add_command(dropdb)
-```
-
-The `group()` decorator works like the `command()` decorator, but creates a Group object instead which can be given multiple subcommands that can be attached with `Group.add_command()`.
-
-For simple scripts, it's also possible to automatically attach and create a command by using the `Group.command()` decorator instead.  
-The above script can instead be written like this:
-
-```py
-@click.group()
-def cli():
-    pass
-
-@cli.command()
-def initdb():
-    click.echo('Initialized the database')
-
-@cli.command()
-def dropdb():
-    click.echo('Dropped the database')
-```
-
-You would then invoke the Group in your setup-tools entry points or other invocations:
-
-```py
-if __name__ == '__main__':
-    cli()
-```
-
-### Adding Parameters
-
-To add parameters, use the `option()` and `argument()` decorators:
-
-```py
-@click.command()
-@click.option('--count', default=1, help='number of greetings')
-@click.argument('name')
-def hello(count, name):
-    for x in range(count):
-        click.echo(f'Hello {name}!')
-```
diff --git a/python/libs/image/pillow.md b/python/libs/image/pillow.md
deleted file mode 100644
index 6b5e99e..0000000
--- a/python/libs/image/pillow.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Pillow
-
-## Standard Imports
-
-```py
-from PIL import Image
-```
-
-## OPENING IMAGE FILE
-
-Returns `IOError` if file cannot be opened.
-
-```py
-image = Image.open(filepath, mode)    # open image file (returns Image object)
-# FILEPATH: filename (string) or file object (musk implement seek, tell, write methods)
-
-image.format    # image file extension
-image.size    # 2-tuple (width, height) in pixels
-image.mode    # defines number and name of bands in image, pixel type and depth
-```
-
-## SAVING IMAGE FILE
-
-```py
-image.save(filepath, fmt)
-# FMT: optional format override
-```
-
-## IMAGE CROPPING
-
-```py
-box = (left, top, right, bottom)    # position in pixels
-cropped = image.crop(box)
-```
-
-## IMAGE PASTE
-
-```èy
-# region dimension MUST be same as box
-image.paste(region, box)
-```
-
-## SPLITTING AND MERGING BANDS
-
-`image.mode` should be RGB
-
-```py
-r, g, b = image.split()
-img = image.merge(r, g, b)
-```
diff --git a/python/libs/image/py-cairo.md b/python/libs/image/py-cairo.md
deleted file mode 100644
index 23484dd..0000000
--- a/python/libs/image/py-cairo.md
+++ /dev/null
@@ -1,146 +0,0 @@
-# PyCairo
-
-## Definitions
-
-To do some drawing in PyCairo, we must first create a `Drawing Context`.  
-The drawing context holds all of the graphics state parameters that describe how drawing is to be done.  
-This includes information such as line width, color, the surface to draw to, and many other things.  
-It allows the actual drawing functions to take fewer arguments to simplify the interface.
-
-A `Path` is a collection of points used to create primitive shapes such as lines, arcs, and curves. There are two kinds of paths: open and closed paths.  
-In a closed path, starting and ending points meet. In an open path, starting and ending point do not meet. In PyCairo, we start with an empty path.  
-First, we define a path and then we make them visible by stroking and/or filling them. After each `stroke()` or `fill()` method call, the path is emptied.  
-We have to define a new path. If we want to keep the existing path for later drawing, we can use the `stroke_preserve()` and `fill_preserve()` methods.  
-A path is made of sub-paths.
-
-A `Source` is the paint we use in drawing. We can compare the source to a pen or ink that we use to draw the outlines and fill the shapes.  
-There are four kinds of basic sources: colors, gradients, patterns, and images.
-
-A `Surface` is a destination that we are drawing to. We can render documents using the PDF or PostScript surfaces, directly draw to a platform via the Xlib and Win32 surfaces.
-
-Before the source is applied to the surface, it is filtered first. The `Mask` is used as a filter.  
-It determines where the source is applied and where not. Opaque parts of the mask allow to copy the source.  
-Transparent parts do not let to copy the source to the surface.
-
-A `Pattern` represents a source when drawing onto a surface.  
-In PyCairo, a pattern is something that you can read from and that is used as the source or mask of a drawing operation.  
-Patterns can be solid, surface-based, or gradients.
-
-## Initial Settings
-
-### Context and Surface Setup
-
-```py
-surface = cairo.ImageSurface(FORMAT, width, height)    # surface setup
-context = cairo.Context(surface)    # drawing context setup
-
-```
-
-Formats:
-
-* `FORMAT_ARGB32`:  
-  each pixel is a 32-bit quantity, with alpha in the upper 8 bits, then red, then green, then blue.  
-  The 32-bit quantities are stored native-endian. Pre-multiplied alpha is used.  
-  (That is, 50% transparent red is 0x80800000, not 0x80ff0000.)
-
-* `FORMAT_RGB24`:  
-  each pixel is a 32-bit quantity, with the upper 8 bits unused.  
-  Red, Green, and Blue are stored in the remaining 24 bits in that order.
-
-* `FORMAT_A8`:  
-  each pixel is a 8-bit quantity holding an alpha value.
-
-* `FORMAT_A1`:  
-   each pixel is a 1-bit quantity holding an alpha value. Pixels are packed together into 32-bit quantities.  
-   The ordering of the bits matches the endianess of the platform.  
-   On a big-endian machine, the first pixel is in the uppermost bit, on a little-endian machine the first pixel is in the least-significant bit.
-
-* `FORMAT_RGB16_565`:  
-  each pixel is a 16-bit quantity with red in the upper 5 bits, then green in the middle 6 bits, and blue in the lower 5 bits.
-
-### Source Setup
-
-```py
-# Sets the source pattern within Context to an opaque color.
-# This opaque color will then be used for any subsequent drawing operation until a new source pattern is set.
-context.set_source_rgb(red, green, blue)
-# The color components are floating point numbers in the range 0 to 1.
-# The default source pattern is opaque black -- set_source_rgb(0.0, 0.0, 0.0).
-```
-
-## Drawing
-
-### Lines and Arcs
-
-`context.move_to(x, y)` begins a new sub-path. After this call the current point will be `(x, y)`.  
-
-`context.line_to(x, y)` adds a line to the path from the current position to `(x, y)`
-
-### Path
-
-`context.new_path()` clears current PATH. After this call there will be no path and no current point.  
-
-`context.new_sub_path()` begins a new sub-path. Note that the existing path is not affected. After this call there will be no current point.  
-In many cases, this call is not needed since new sub-paths are frequently started with `Context.move_to()`.  
-A call to `new_sub_path()` is particularly useful when beginning a new sub-path with one of the `Context.arc()` calls.  
-This makes things easier as it is no longer necessary to manually compute the arc's initial coordinates for a call to `Context.move_to()`.
-
-### Stroke
-
-A drawing operator that strokes the current path according to the current line width, line join, line cap, and dash settings.  
-After `stroke()`, the current path will be cleared from the cairo context.
-
-### Fill
-
-A drawing operator that fills the current path according to the current *fill rule*.  
-(each sub-path is implicitly closed before being filled).  
-After `fill()`, the current path will be cleared from the Context.
-
-`context.set_fill_rule(fill_rule)` set a FILL RULE to the cairo context.
-
-For both fill rules, whether or not a point is included in the fill is determined by taking a ray from that point to infinity and looking at intersections with the path.  
-The ray can be in any direction, as long as it doesn't pass through the end point of a segment or have a tricky intersection such as intersecting tangent to the path.  
-(Note that filling is not actually implemented in this way. This is just a description of the rule that is applied.)
-
-* `cairo.FILL_RULE_WINDING` (default):  
-    If the path crosses the ray from left-to-right, counts +1. If the path crosses the ray from right to left, counts -1.  
-    (Left and right are determined from the perspective of looking along the ray from the starting point.)  
-    If the total count is non-zero, the point will be filled.
-
-* `cairo.FILL_RULE_EVEN_ODD`:  
-    Counts the total number of intersections, without regard to the orientation of the contour.  
-    If the total number of intersections is odd, the point will be filled.
-
-## Writing
-
-```py
-surface = cairo.ImageSurface(FORMAT, width, height)    # surface setup
-context = cairo.Context(surface)    # drawing context setup
-
-# Replaces the current FontFace object in the Context.
-context.set_font_face(family, slant, weight)
-context.set_font_size()    # float -- he new font size, in user space units. DEFAULT 10.0
-
-context.show_text(string)
-```
-
-Font Slants:
-
-* `FONT_SLANT_NORMAL` (default)
-* `FONT_SLANT_ITALIC`
-* `FONT_SLANT_OBLIQUE`
-
-Font Weights:
-
-* `FONT_WEIGHT_NORMAL` (default)
-* `FONT_WEIGHT_BOLD`
-
-## Creating the image
-
-```py
-surface.show_page()    # Emits and clears the current page for backends that support multiple pages. Use copy_page() if you don't want to clear the page.
-
-surface.copy_page()   # Emits the current page for backends that support multiple pages, but doesn't clear it, so that the contents of the current page will be retained for the next page. Use show_page() if you want to get an empty page after the emission.
-
-surface.write_to_png("filename")    # Writes the contents of Surface to filename as a PNG image
-```
diff --git a/python/libs/web/flask/flask-requests.md b/python/libs/web/flask/flask-requests.md
deleted file mode 100644
index d13e23b..0000000
--- a/python/libs/web/flask/flask-requests.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Flask Requests
-
-Specify allowed HTTP methods in `file.py`:  
-`@app.route("/page/", methods=["allowed methods"])`
-
-## Forms
-
-in `file.py`:
-
-```py
-from flask import Flask, render_template
-from flask.globals import request
-
-@app.route("/login/", methods=["GET", "POST"])
-def login():
-    if request.method == "POST":    # if POST then form has been filled
-        data = request.form["field name"]    # store the form's data in variable
-        # manipulate form data
-
-        req_args = request.args  # request args
-
-    else:    # if GET then is asking for form page
-        return render_template("login.html")
-```
-
-In `login.html`:
-
-```html
-<html>
-    <!-- action="#" goes to page itself but with # at the end of the URL -->
-    <form action="#" method="post">
-    <input type="text" name="field name">
-</html>
-```
diff --git a/python/libs/web/flask/flask.md b/python/libs/web/flask/flask.md
deleted file mode 100644
index 0a9a4a9..0000000
--- a/python/libs/web/flask/flask.md
+++ /dev/null
@@ -1,148 +0,0 @@
-# Flask
-
-```python
-from flask import Flask, render_template
-
-app = Flask(__name__, template_folder="path_to_folder")    # create app
-
-# template folder contains html pages
-@app.route("/")    # define URLs
-def index():
-
-    return render_template("index.html")    # parse HTML page and return it
-
-
-if __name__ == "__main__":
-    # run server if server is single file
-    app.run(debug=True, host="0.0.0.0")
-```
-
-`@app.route("/page/")` enables to access the page with `url/page` and `url/page/`. The same is possible using `app.add_url_rule("/", "page", function)`.
-
-## Variable Rules
-
-You can add variable sections to a URL by marking sections with `<variable_name>`.  
-Your function then receives the `<variable_name>` as a keyword argument.  
-Optionally, you can use a converter to specify the type of the argument like `<converter:variable_name>`.
-
-Converter Type | Accepts
----------------|------------------------------
-`string`       | any text without a slash (default option)
-`int`          | positive integers
-`float`        | positive floating point values
-`path`         | strings with slashes
-`uuid`         | UUID strings
-
-```python
-@app.route("/user/<string:username>")    # handle URL at runtime
-def profile(username):
-    return f"{escape(username)}'s profile'"
-```
-
-## Redirection
-
-`url_for(endpoint, **values)` is used to redirect passing keyworded arguments. It can be used in combination with `@app.route("/<value>")` to accept the passed arguments.
-
-```py
-from flask import Flask, redirect, url_for
-
-@app.route("/url")
-def func():
-
-    return redirect(url_for("html_file/function"))    # redirect to other page
-```
-
-## Jinja Template Rendering (Parsing Python Code in HTML, CSS)
-
-* `{% ... %}` for **Statements**
-* `{{ ... }}` for **Expressions** to print to the template output
-* `{# ... #}` for **Comments** not included in the template output
-* `#  ... ##` for **Line Statements**
-
-Use `{% block block_code %}` to put a line python code inside HTML.
-Use `{% end<block> %}` to end a block of code.
-
-In `page.html`;
-
-```py
-<html>
-    {% for item in content %}
-        <p>{{item}}</p>
-    {% endfor %}
-</html>
-```
-
-In `file.py`:
-
-```py
-@app.route("/page/)
-def func():
-    return render_template("page.html", content=["A", "B", "C"])
-```
-
-### Hyperlinks
-
-In `file.py`:
-
-```py
-@app.route('/linked_page/')
-def cool_form():
-    return render_template('linked_page.html')
-```
-
-In `page.html`:
-
-```html
-<!doctype html>
-<html>
-  <head>
-  </head>
-
-  <body>
-    <a href="{{ url_for('linked_page') }}">link text</a>
-  </body>
-</html>
-```
-
-### CSS
-
-Put `style.css` inside `/static/style`.  
-
-In `page.html`:
-
-```html
-<!doctype html>
-<html>
-  <head>
-  </head>
-    <link rel="stylesheet" href="{{ url_for('static', filename='style/style.css') }}">
-  <body>
-
-  </body>
-</html>
-```
-
-## Template Inheritance
-
-In `parent_template.html`:
-
-```html
-<html>
-    <!-- html content -->
-    {% block block_name %}
-    {% endblock %}
-    <!-- html content -->
-</html>
-```
-
-The content of the block will be filled by the child class.
-
-In `child_template.html`:
-
-```html
-{% extends "parent_template.html" %}
-{% block block_name}
-    {{ super() }}  <!-- use parent's contents -->
-    <!-- block content -->
-{% endblock %}
-```