diff --git a/Cargo.toml b/Cargo.toml
index c3cb7c56122f0ce0fb0afccbccf1819d2de0d706..7cee41468f039b559510392b890639b3b9e9cbbd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -188,47 +188,52 @@ codegen-units=1
 workspace = true
 
 [workspace.lints.rust]
-# missing_abi = "warn"
+missing_abi = "warn"
 # missing_docs = "warn"
-# noop_method_call = "warn"
-# pointer_structural_match = "warn"
+noop_method_call = "warn"
+pointer_structural_match = "warn"
 # unreachable_pub = "warn"
-# unused_extern_crates = "warn"
-# unused_import_braces = "warn"
+unused_extern_crates = "warn"
+unused_import_braces = "warn"
 # unused_lifetimes = "warn"
 unused_qualifications = "warn"
-# unused_tuple_struct_fields = "warn"
+unused_tuple_struct_fields = "warn"
 
 [workspace.lints.clippy]
 suspicious = "warn" # assume deny in practice
 perf = "warn" # assume deny in practice
-# redundant_clone = "warn"
-# cloned_instead_of_copied = "warn"
+redundant_clone = "warn"
+cloned_instead_of_copied = "warn"
 expl_impl_clone_on_copy = "warn"
 # pedantic = "warn"
-# as_conversions = "warn"
+unnecessary_cast = "warn"
+cast_lossless = "warn"
+ptr_as_ptr = "warn"
+ref_to_mut = "warn"
+char_lit_as_u8 = "warn"
 dbg_macro = "warn"
-# empty_structs_with_brackets = "warn"
+empty_structs_with_brackets = "warn"
 # get_unwrap = "warn"
 # if_then_some_else_none = "warn"
 # let_underscore_must_use = "warn"
 # map_err_ignore = "warn"
 # missing_docs_in_private_items = "warn"
-# negative_feature_names = "warn"
-# pub_without_shorthand = "warn"
+negative_feature_names = "warn"
+pub_without_shorthand = "warn"
 rc_buffer = "warn"
 rc_mutex = "warn"
-# redundant_feature_names = "warn"
-# redundant_type_annotations = "warn"
+redundant_feature_names = "warn"
+redundant_type_annotations = "warn"
 # ref_patterns = "warn"
-# rest_pat_in_fully_bound_structs = "warn"
-# str_to_string = "warn"
+rest_pat_in_fully_bound_structs = "warn"
+str_to_string = "warn"
 # string_add = "warn"
 # string_slice = "warn"
 # string_to_string = "warn"
 tests_outside_test_module = "warn"
 undocumented_unsafe_blocks = "warn"
-# unneeded_field_pattern = "warn"
-# unseparated_literal_suffix = "warn"
+unneeded_field_pattern = "warn"
+unseparated_literal_suffix = "warn"
 # unwrap_used = "warn"
-# wildcard_dependencies = "warn"
\ No newline at end of file
+# expect_used = "warn"
+wildcard_dependencies = "warn"
\ No newline at end of file
diff --git a/src/api/client_server/media.rs b/src/api/client_server/media.rs
index 2c34a24ec0f59986d4394aac22f60c24e672be02..d114cf671e3a143bff02a924c834e48ec523daba 100644
--- a/src/api/client_server/media.rs
+++ b/src/api/client_server/media.rs
@@ -132,9 +132,7 @@ pub async fn get_content_as_filename_route(
     let mxc = format!("mxc://{}/{}", body.server_name, body.media_id);
 
     if let Some(FileMeta {
-        content_disposition: _,
-        content_type,
-        file,
+        content_type, file, ..
     }) = services().media.get(mxc.clone()).await?
     {
         Ok(get_content_as_filename::v3::Response {
diff --git a/src/api/client_server/membership.rs b/src/api/client_server/membership.rs
index 5c297948746ec01ee8f19849e984a753b041ca65..df7980fffc976e5a8fbdd5d83d5175a3a38873d8 100644
--- a/src/api/client_server/membership.rs
+++ b/src/api/client_server/membership.rs
@@ -1221,7 +1221,7 @@ fn validate_and_add_event_id(
     Ok((event_id, value))
 }
 
-pub(crate) async fn invite_helper<'a>(
+pub(crate) async fn invite_helper(
     sender_user: &UserId,
     user_id: &UserId,
     room_id: &RoomId,
diff --git a/src/api/client_server/report.rs b/src/api/client_server/report.rs
index 19b76c49ffa33f67c4b321882386c5de64b76945..412590ba5bccf92ce9cd1cce44e4e4b739fd4da9 100644
--- a/src/api/client_server/report.rs
+++ b/src/api/client_server/report.rs
@@ -41,7 +41,7 @@ pub async fn report_event_route(
     services().admin
         .send_message(message::RoomMessageEventContent::text_html(
             format!(
-                "Report received from: {}\n\n\
+                "@room Report received from: {}\n\n\
                 Event ID: {:?}\n\
                 Room ID: {:?}\n\
                 Sent By: {:?}\n\n\
diff --git a/src/api/server_server.rs b/src/api/server_server.rs
index cbd511b7be2f23c32efaad0d3955092d5fefa7c2..1570b54161fbe4f43da7cce85daf6eea53cfe98a 100644
--- a/src/api/server_server.rs
+++ b/src/api/server_server.rs
@@ -95,7 +95,7 @@ fn into_https_string(self) -> String {
     fn into_uri_string(self) -> String {
         match self {
             Self::Literal(addr) => addr.to_string(),
-            Self::Named(host, ref port) => host + port,
+            Self::Named(host, port) => host + &port,
         }
     }
 
diff --git a/src/config/mod.rs b/src/config/mod.rs
index d1550728bce33636012beab67e9f85684e4867cb..567870a8bcfc4a650b34614548ee65ef2fd805d5 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -218,10 +218,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
                 "Allow device name federation",
                 &self.allow_device_name_federation.to_string(),
             ),
-            (
-                "Notification push path",
-                &self.notification_push_path.to_string(),
-            ),
+            ("Notification push path", &self.notification_push_path),
             ("Allow room creation", &self.allow_room_creation.to_string()),
             (
                 "Allow public room directory over federation",
@@ -280,10 +277,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
                 "zstd Response Body Compression",
                 &self.zstd_compression.to_string(),
             ),
-            (
-                "RocksDB database log level",
-                &self.rocksdb_log_level.to_string(),
-            ),
+            ("RocksDB database log level", &self.rocksdb_log_level),
             (
                 "RocksDB database log time-to-roll",
                 &self.rocksdb_log_time_to_roll.to_string(),
@@ -393,11 +387,11 @@ fn default_rocksdb_log_time_to_roll() -> usize {
 }
 
 // I know, it's a great name
-pub fn default_default_room_version() -> RoomVersionId {
+pub(crate) fn default_default_room_version() -> RoomVersionId {
     RoomVersionId::V10
 }
 
-pub fn default_rocksdb_max_log_file_size() -> usize {
+fn default_rocksdb_max_log_file_size() -> usize {
     // 4 megabytes
     4 * 1024 * 1024
 }
diff --git a/src/config/proxy.rs b/src/config/proxy.rs
index 28ffada4b309f9cfdd3431d44bb5c42558f4c2f1..715d59f2ae2bd03743fd307bd7c297f220ca0f7b 100644
--- a/src/config/proxy.rs
+++ b/src/config/proxy.rs
@@ -95,20 +95,20 @@ pub fn for_url(&self, url: &Url) -> Option<&Url> {
 
 /// A domain name, that optionally allows a * as its first subdomain.
 #[derive(Clone, Debug)]
-pub enum WildCardedDomain {
+enum WildCardedDomain {
     WildCard,
     WildCarded(String),
     Exact(String),
 }
 impl WildCardedDomain {
-    pub fn matches(&self, domain: &str) -> bool {
+    fn matches(&self, domain: &str) -> bool {
         match self {
             WildCardedDomain::WildCard => true,
             WildCardedDomain::WildCarded(d) => domain.ends_with(d),
             WildCardedDomain::Exact(d) => domain == d,
         }
     }
-    pub fn more_specific_than(&self, other: &Self) -> bool {
+    fn more_specific_than(&self, other: &Self) -> bool {
         match (self, other) {
             (WildCardedDomain::WildCard, WildCardedDomain::WildCard) => false,
             (_, WildCardedDomain::WildCard) => true,
diff --git a/src/database/abstraction.rs b/src/database/abstraction.rs
index 83e8231484bbfbcc4dd6eaae2bb0f6be2bce9af4..5056de8f069547eb9f015daf944a0de843368283 100644
--- a/src/database/abstraction.rs
+++ b/src/database/abstraction.rs
@@ -7,12 +7,12 @@
 pub mod sqlite;
 
 #[cfg(feature = "rocksdb")]
-pub mod rocksdb;
+pub(crate) mod rocksdb;
 
 #[cfg(any(feature = "sqlite", feature = "rocksdb"))]
-pub mod watchers;
+pub(crate) mod watchers;
 
-pub trait KeyValueDatabaseEngine: Send + Sync {
+pub(crate) trait KeyValueDatabaseEngine: Send + Sync {
     fn open(config: &Config) -> Result<Self>
     where
         Self: Sized;
@@ -27,7 +27,7 @@ fn memory_usage(&self) -> Result<String> {
     fn clear_caches(&self) {}
 }
 
-pub trait KvTree: Send + Sync {
+pub(crate) trait KvTree: Send + Sync {
     fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
 
     fn insert(&self, key: &[u8], value: &[u8]) -> Result<()>;
diff --git a/src/database/abstraction/rocksdb.rs b/src/database/abstraction/rocksdb.rs
index 47203f0872985cca106db7eb2c76f8f0e71db43c..7aca3fade656e0dc23312d299fb1080ddc7bcb86 100644
--- a/src/database/abstraction/rocksdb.rs
+++ b/src/database/abstraction/rocksdb.rs
@@ -8,14 +8,14 @@
 
 use rocksdb::LogLevel::{Debug, Error, Fatal, Info, Warn};
 
-pub struct Engine {
+pub(crate) struct Engine {
     rocks: rocksdb::DBWithThreadMode<rocksdb::MultiThreaded>,
     cache: rocksdb::Cache,
     old_cfs: Vec<String>,
     config: Config,
 }
 
-pub struct RocksDbEngineTree<'a> {
+struct RocksDbEngineTree<'a> {
     db: Arc<Engine>,
     name: &'a str,
     watchers: Watchers,
diff --git a/src/database/key_value/globals.rs b/src/database/key_value/globals.rs
index 7a70af183a10eecad289c920c22ddf82e7767631..3cc1663bc645043ec636a754a8db89865135a188 100644
--- a/src/database/key_value/globals.rs
+++ b/src/database/key_value/globals.rs
@@ -11,8 +11,8 @@
 
 use crate::{database::KeyValueDatabase, service, services, utils, Error, Result};
 
-pub const COUNTER: &[u8] = b"c";
-pub const LAST_CHECK_FOR_UPDATES_COUNT: &[u8] = b"u";
+const COUNTER: &[u8] = b"c";
+const LAST_CHECK_FOR_UPDATES_COUNT: &[u8] = b"u";
 
 #[async_trait]
 impl service::globals::Data for KeyValueDatabase {
diff --git a/src/database/mod.rs b/src/database/mod.rs
index 7234f8b80ff334cd0ba31960e15d12db8fa9c648..9b53785f5f7b877a773688312d158b4aee97d923 100644
--- a/src/database/mod.rs
+++ b/src/database/mod.rs
@@ -1,5 +1,5 @@
-pub mod abstraction;
-pub mod key_value;
+pub(crate) mod abstraction;
+pub(crate) mod key_value;
 
 use crate::{
     service::rooms::{edus::presence::presence_handler, timeline::PduCount},
@@ -1094,7 +1094,7 @@ pub async fn start_cleanup_task() {
         use tokio::time::Instant;
 
         let timer_interval =
-            Duration::from_secs(services().globals.config.cleanup_second_interval as u64);
+            Duration::from_secs(u64::from(services().globals.config.cleanup_second_interval));
 
         fn perform_cleanup() {
             let start = Instant::now();
diff --git a/src/main.rs b/src/main.rs
index cce432fd5d5654a501e36efc12dd0afee013578b..49ceb1b7cbebfb73c314841c6845a6d0ccdfa9a9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -53,7 +53,7 @@
 
 #[derive(Parser)]
 #[clap(version, about, long_about = None)]
-struct Args {}
+struct Args;
 
 #[tokio::main]
 async fn main() {
diff --git a/src/service/account_data/mod.rs b/src/service/account_data/mod.rs
index f9c49b1a750f9da189e1175e4fe2c20362ed091e..bfdbd5f5d646523771ff59ee9cf035d87b70bfb3 100644
--- a/src/service/account_data/mod.rs
+++ b/src/service/account_data/mod.rs
@@ -1,6 +1,6 @@
 mod data;
 
-pub use data::Data;
+pub(crate) use data::Data;
 
 use ruma::{
     events::{AnyEphemeralRoomEvent, RoomAccountDataEventType},
diff --git a/src/service/appservice/mod.rs b/src/service/appservice/mod.rs
index 3052964d1336f89cad7125314bd9d1c7aba2cacb..7789968c525f2a8dd50d2780fb884c022f9ce6e7 100644
--- a/src/service/appservice/mod.rs
+++ b/src/service/appservice/mod.rs
@@ -1,6 +1,6 @@
 mod data;
 
-pub use data::Data;
+pub(crate) use data::Data;
 
 use crate::Result;
 
diff --git a/src/service/globals/mod.rs b/src/service/globals/mod.rs
index 78d913e723e77a600b19c6ea4f2ef1daff0f1dbc..46d83206f42eeaf63a3fd993d666388e7952e3d3 100644
--- a/src/service/globals/mod.rs
+++ b/src/service/globals/mod.rs
@@ -75,7 +75,7 @@ pub struct Service<'a> {
     pub roomid_mutex_federation: RwLock<HashMap<OwnedRoomId, Arc<TokioMutex<()>>>>, // this lock will be held longer
     pub roomid_federationhandletime: RwLock<HashMap<OwnedRoomId, (OwnedEventId, Instant)>>,
     pub stateres_mutex: Arc<Mutex<()>>,
-    pub rotate: RotationHandler,
+    pub(crate) rotate: RotationHandler,
 
     pub shutdown: AtomicBool,
     pub argon: Argon2<'a>,
@@ -84,12 +84,12 @@ pub struct Service<'a> {
 /// Handles "rotation" of long-polling requests. "Rotation" in this context is similar to "rotation" of log files and the like.
 ///
 /// This is utilized to have sync workers return early and release read locks on the database.
-pub struct RotationHandler(broadcast::Sender<()>, broadcast::Receiver<()>);
+pub(crate) struct RotationHandler(broadcast::Sender<()>, ());
 
 impl RotationHandler {
     pub fn new() -> Self {
-        let (s, r) = broadcast::channel(1);
-        Self(s, r)
+        let (s, _r) = broadcast::channel(1);
+        Self(s, ())
     }
 
     pub fn watch(&self) -> impl Future<Output = ()> {
@@ -113,13 +113,13 @@ fn default() -> Self {
 
 type DnsOverrides = Box<dyn Fn(&str) -> Option<SocketAddr> + Send + Sync>;
 
-pub struct Resolver {
+struct Resolver {
     inner: GaiResolver,
     overrides: DnsOverrides,
 }
 
 impl Resolver {
-    pub fn new(overrides: DnsOverrides) -> Resolver {
+    fn new(overrides: DnsOverrides) -> Resolver {
         Resolver {
             inner: GaiResolver::new(),
             overrides,
diff --git a/src/service/key_backups/mod.rs b/src/service/key_backups/mod.rs
index 5fc52ceddf1d229f703dba20d4d186e1bdcb4430..50eca0b664506ce9f47cf457ec9ab6d822fb7770 100644
--- a/src/service/key_backups/mod.rs
+++ b/src/service/key_backups/mod.rs
@@ -1,5 +1,5 @@
 mod data;
-pub use data::Data;
+pub(crate) use data::Data;
 
 use crate::Result;
 use ruma::{
diff --git a/src/service/media/mod.rs b/src/service/media/mod.rs
index 327abd861b1f9d433c90e4a2d8d732bad005bb4e..4a016bda9707feba3a529e632d78a996514f34c5 100644
--- a/src/service/media/mod.rs
+++ b/src/service/media/mod.rs
@@ -1,7 +1,7 @@
 mod data;
 use std::io::Cursor;
 
-pub use data::Data;
+pub(crate) use data::Data;
 
 use crate::{services, Result};
 use image::imageops::FilterType;
diff --git a/src/service/mod.rs b/src/service/mod.rs
index 883c567cfbc10e76ec6aed44cc73627c8cffbab4..0597c211a7ea4ec12bdc0f32c794ebc1762b03b5 100644
--- a/src/service/mod.rs
+++ b/src/service/mod.rs
@@ -7,19 +7,19 @@
 
 use crate::{Config, Result};
 
-pub mod account_data;
-pub mod admin;
-pub mod appservice;
-pub mod globals;
-pub mod key_backups;
-pub mod media;
-pub mod pdu;
-pub mod pusher;
-pub mod rooms;
-pub mod sending;
-pub mod transaction_ids;
-pub mod uiaa;
-pub mod users;
+pub(crate) mod account_data;
+pub(crate) mod admin;
+pub(crate) mod appservice;
+pub(crate) mod globals;
+pub(crate) mod key_backups;
+pub(crate) mod media;
+pub(crate) mod pdu;
+pub(crate) mod pusher;
+pub(crate) mod rooms;
+pub(crate) mod sending;
+pub(crate) mod transaction_ids;
+pub(crate) mod uiaa;
+pub(crate) mod users;
 
 pub struct Services<'a> {
     pub appservice: appservice::Service,
diff --git a/src/utils/mod.rs b/src/utils/mod.rs
index 79e83f97a44897f77de17f29afa906db64357959..e737df17cae7c18529af3b7662797f7f4e1b6f2e 100644
--- a/src/utils/mod.rs
+++ b/src/utils/mod.rs
@@ -1,4 +1,4 @@
-pub mod error;
+pub(crate) mod error;
 
 use crate::{services, Error, Result};
 use argon2::{password_hash::SaltString, PasswordHasher};
@@ -14,14 +14,14 @@
     time::{SystemTime, UNIX_EPOCH},
 };
 
-pub fn millis_since_unix_epoch() -> u64 {
+pub(crate) fn millis_since_unix_epoch() -> u64 {
     SystemTime::now()
         .duration_since(UNIX_EPOCH)
         .expect("time is valid")
         .as_millis() as u64
 }
 
-pub fn increment(old: Option<&[u8]>) -> Option<Vec<u8>> {
+pub(crate) fn increment(old: Option<&[u8]>) -> Option<Vec<u8>> {
     let number = match old.map(|bytes| bytes.try_into()) {
         Some(Ok(bytes)) => {
             let number = u64::from_be_bytes(bytes);
@@ -89,7 +89,7 @@ pub fn calculate_hash(keys: &[&[u8]]) -> Vec<u8> {
     hash.as_ref().to_owned()
 }
 
-pub fn common_elements(
+pub(crate) fn common_elements(
     mut iterators: impl Iterator<Item = impl Iterator<Item = Vec<u8>>>,
     check_order: impl Fn(&[u8], &[u8]) -> Ordering,
 ) -> Option<impl Iterator<Item = Vec<u8>>> {
@@ -116,7 +116,7 @@ pub fn common_elements(
 /// Fallible conversion from any value that implements `Serialize` to a `CanonicalJsonObject`.
 ///
 /// `value` must serialize to an `serde_json::Value::Object`.
-pub fn to_canonical_object<T: serde::Serialize>(
+pub(crate) fn to_canonical_object<T: serde::Serialize>(
     value: T,
 ) -> Result<CanonicalJsonObject, CanonicalJsonError> {
     use serde::ser::Error;
@@ -129,7 +129,7 @@ pub fn to_canonical_object<T: serde::Serialize>(
     }
 }
 
-pub fn deserialize_from_str<
+pub(crate) fn deserialize_from_str<
     'de,
     D: serde::de::Deserializer<'de>,
     T: FromStr<Err = E>,
@@ -160,7 +160,7 @@ fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
 
 /// Wrapper struct which will emit the HTML-escaped version of the contained
 /// string when passed to a format string.
-pub struct HtmlEscape<'a>(pub &'a str);
+pub(crate) struct HtmlEscape<'a>(pub(crate) &'a str);
 
 impl<'a> fmt::Display for HtmlEscape<'a> {
     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {