diff --git a/Cargo.toml b/Cargo.toml
index 8d023fd..d645556 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,3 +1,5 @@
+workspace = { members = ["config", "logging"] }
+
[package]
name = "wanessa"
version = "0.1.0"
@@ -9,12 +11,13 @@ edition = "2021"
[lints.rust]
unsafe_code = "forbid"
+missing_docs = "warn"
[lints.clippy]
enum_glob_use = "deny" # https://rust-lang.github.io/rust-clippy/master/index.html#/enum_glob_use
pedantic = "deny" # https://rust-lang.github.io/rust-clippy/master/index.html#/?groups=pedantic
nursery = "deny" # wip lints: https://rust-lang.github.io/rust-clippy/master/index.html#/?groups=nursery
-unwrap_used = "deny" # https://rust-lang.github.io/rust-clippy/master/index.html#/unwrap_used
+unwrap_used = "forbid" # https://rust-lang.github.io/rust-clippy/master/index.html#/unwrap_used
missing_const_for_fn = "warn" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_const_for_fn
-missing_assert_message = "deny" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_assert_message
-missing_errors_doc = "deny" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_assert_message
\ No newline at end of file
+missing_assert_message = "warn" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_assert_message
+missing_errors_doc = "warn" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_assert_message
diff --git a/config/Cargo.toml b/config/Cargo.toml
new file mode 100644
index 0000000..4e5c462
--- /dev/null
+++ b/config/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+name = "config"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+getset = { version = "0.1.2", default-features = false }
+once_cell = { version = "1.19.0", default-features = false, features = ["std"] }
+
+[lints.rust]
+unsafe_code = "forbid"
+missing_docs = "warn"
+
+[lints.clippy]
+enum_glob_use = "deny" # https://rust-lang.github.io/rust-clippy/master/index.html#/enum_glob_use
+pedantic = "deny" # https://rust-lang.github.io/rust-clippy/master/index.html#/?groups=pedantic
+nursery = "deny" # wip lints: https://rust-lang.github.io/rust-clippy/master/index.html#/?groups=nursery
+unwrap_used = "forbid" # https://rust-lang.github.io/rust-clippy/master/index.html#/unwrap_used
+missing_const_for_fn = "warn" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_const_for_fn
+missing_assert_message = "warn" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_assert_message
+missing_errors_doc = "warn" # https://rust-lang.github.io/rust-clippy/master/index.html#/missing_assert_message
diff --git a/config/src/db.rs b/config/src/db.rs
new file mode 100644
index 0000000..ad74bf2
--- /dev/null
+++ b/config/src/db.rs
@@ -0,0 +1,57 @@
+/*!
+* This module contains everything related to [`DbConfig`].
+*/
+#![allow(clippy::module_name_repetitions)]
+
+use getset::Getters;
+
+/**
+* A immutable record of all the information needed to connect to the SQL database.
+*/
+#[allow(clippy::module_name_repetitions)]
+#[derive(Clone, PartialEq, Eq, Getters, Debug)]
+#[getset(get = "pub")]
+pub struct DbConfig {
+ /// Database connection address.
+ /// Is an option to allow constructing a default config during compile time.
+ addr: String,
+ /// Database connection port.
+ port: u16,
+}
+
+impl Default for DbConfig {
+ fn default() -> Self {
+ Self {
+ addr: String::from("localhost"),
+ port: 6969,
+ }
+ }
+}
+
+/**
+* Builder for [`DbConfig`].
+*/
+#[derive(Default, Debug)]
+pub struct DbConfigBuilder(DbConfig);
+
+impl DbConfigBuilder {
+ /// Get a new [`DbConfigBuilder`]
+ #[must_use]
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ /// Set the address to the location of the database.
+ #[must_use]
+ pub fn set_addr(mut self, addr: impl Into) -> Self {
+ self.0.addr = addr.into();
+ self
+ }
+
+ /// Set the port to the port the database uses.
+ #[must_use]
+ pub fn set_port(mut self, port: impl Into) -> Self {
+ self.0.port = port.into();
+ self
+ }
+}
diff --git a/config/src/lib.rs b/config/src/lib.rs
new file mode 100644
index 0000000..4534cfe
--- /dev/null
+++ b/config/src/lib.rs
@@ -0,0 +1,31 @@
+/*!
+* Containing all singleton and thread-safe structs related to configuring `WANessa`.
+*
+* This crate differentiates between `Configs` and `Settings`:
+* Configs:
+* - Configs are immutable after they have been initialized. Example [`DbConfig`].
+* - Changing the config requires a restart of `WANessa`.
+*
+* Settings:
+* - Settings are mutable after they have been initialized. Example [`LogSettings`].
+* - `WANessa` always uses the current setting and does not need a restart to apply new settings.
+*/
+
+pub mod db;
+pub mod log;
+
+use crate::db::DbConfig;
+use crate::log::LogSettings;
+
+use std::sync::{Arc, RwLock};
+
+use once_cell::sync::Lazy;
+
+// TODO: replace default with parsed settings from files+flags
+
+/// Singelton [`DbConfig`].
+pub static DB_CONFIG: Lazy> = Lazy::new(|| Arc::new(DbConfig::default()));
+
+/// Singelton [`LogSettings`].
+pub static LOG_SETTINGS: Lazy> =
+ Lazy::new(|| RwLock::new(LogSettings::default()));
diff --git a/config/src/log.rs b/config/src/log.rs
new file mode 100644
index 0000000..87f2c4e
--- /dev/null
+++ b/config/src/log.rs
@@ -0,0 +1,98 @@
+/*!
+* This module contains everything related to [`LogSettings`].
+*/
+#![allow(clippy::module_name_repetitions)]
+use std::cmp::Ordering;
+use std::path::Path;
+
+use crate::log::LogVerbosity::Warning;
+
+use std::path::PathBuf;
+
+use getset::Getters;
+use getset::Setters;
+
+/**
+* All settings relating to how the project logs information.
+*/
+#[allow(clippy::struct_excessive_bools)]
+#[derive(Clone, PartialEq, Eq, Getters, Setters, Debug)]
+#[getset(get = "pub", set = "pub")]
+pub struct LogSettings {
+ /// See [`LogVerbosity`].
+ verbosity: LogVerbosity,
+ /// Logs UTC time and date of message, if true.
+ time: bool,
+ /// Time and date format.
+ /// See [chrono](https://docs.rs/chrono/latest/chrono/format/strftime/index.html).
+ time_format: String,
+ /// Logs location in code, where the message was logged, if true.
+ location: bool,
+ /// If `Some(path)` tries to also write the log to `path` in addition to stderr/stderr.
+ #[getset(skip)]
+ path: Option,
+ /// Logs to standard out, if true.
+ stdout: bool,
+ /// Logs to standard err, if true.
+ stderr: bool,
+}
+
+impl LogSettings {
+ /// Setter for log path, including syntactic sugar for the [Option] enum.
+ pub fn set_path(&mut self, path: impl Into