diff --git a/src/args.cpp b/src/args.cpp
index b81de5a..f56da60 100644
--- a/src/args.cpp
+++ b/src/args.cpp
@@ -1,8 +1,8 @@
 #include "args.hpp"
 
-#include <fmt/format.h>
 #include <getopt.h>
 
+#include <format>
 #include <stdexcept>
 
 namespace kcsbridge
@@ -26,10 +26,10 @@
                 break;
             case ':':
                 throw std::runtime_error(
-                    fmt::format("Missing argument for `{}`", argv[optind - 1]));
+                    std::format("Missing argument for `{}`", argv[optind - 1]));
                 break;
             default:
-                throw std::runtime_error(fmt::format(
+                throw std::runtime_error(std::format(
                     "Invalid command line argument `{}`", argv[optind - 1]));
         }
     }
diff --git a/src/cmd.cpp b/src/cmd.cpp
index 4d0dec8..a3c9d3f 100644
--- a/src/cmd.cpp
+++ b/src/cmd.cpp
@@ -1,6 +1,6 @@
 #include "cmd.hpp"
 
-#include <fmt/format.h>
+#include "print.hpp"
 
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/exception.hpp>
@@ -10,6 +10,8 @@
 #include <stdplus/fd/ops.hpp>
 
 #include <array>
+#include <cstdio>
+#include <format>
 #include <map>
 #include <span>
 #include <stdexcept>
@@ -45,7 +47,7 @@
         // netfn needs to be changed to odd in KCS responses
         if (data.size() + 3 > buffer.size())
         {
-            throw std::runtime_error(fmt::format(
+            throw std::runtime_error(std::format(
                 "too large {} > {}", data.size() + 3, buffer.size()));
         }
         buffer[0] = (netfn | 1) << 2;
@@ -57,7 +59,7 @@
     }
     catch (const std::exception& e)
     {
-        fmt::print(stderr, "IPMI response failure: {}\n", e.what());
+        std::print(stderr, "IPMI response failure: {}\n", e.what());
         buffer[0] |= 1 << 2;
         buffer[2] = 0xff;
     }
@@ -74,12 +76,12 @@
     }
     if (outstanding)
     {
-        fmt::print(stderr, "Canceling outstanding request\n");
+        std::print(stderr, "Canceling outstanding request\n");
         outstanding = slot_t(nullptr);
     }
     if (in.size() < 2)
     {
-        fmt::print(stderr, "Read too small, ignoring\n");
+        std::print(stderr, "Read too small, ignoring\n");
         return;
     }
     auto m = bus.new_method_call("xyz.openbmc_project.Ipmi.Host",
diff --git a/src/main.cpp b/src/main.cpp
index 6abd949..9d7d99e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,8 +1,8 @@
 #include "args.hpp"
 #include "cmd.hpp"
+#include "print.hpp"
 #include "server.hpp"
 
-#include <fmt/format.h>
 #include <systemd/sd-daemon.h>
 
 #include <sdbusplus/bus.hpp>
@@ -15,6 +15,8 @@
 #include <stdplus/signal.hpp>
 
 #include <algorithm>
+#include <cstdio>
+#include <format>
 #include <stdexcept>
 #include <string>
 
@@ -36,7 +38,7 @@
 
     // Configure basic signal handling
     auto exit_handler = [&event](Signal&, const struct signalfd_siginfo*) {
-        fmt::print(stderr, "Interrupted, Exiting\n");
+        std::print(stderr, "Interrupted, Exiting\n");
         event.exit(0);
     };
     stdplus::signal::block(SIGINT);
@@ -46,7 +48,7 @@
 
     // Open an FD for the KCS channel
     stdplus::ManagedFd kcs = stdplus::fd::open(
-        fmt::format("/dev/{}", channel),
+        std::format("/dev/{}", channel),
         OpenFlags(OpenAccess::ReadWrite).set(OpenFlag::NonBlock));
     sdbusplus::slot_t slot(nullptr);
 
@@ -79,7 +81,7 @@
     }
     catch (const std::exception& e)
     {
-        fmt::print(stderr, "FAILED: {}\n", e.what());
+        std::print(stderr, "FAILED: {}\n", e.what());
         return 1;
     }
 }
diff --git a/src/meson.build b/src/meson.build
index 68b6f9a..55b914d 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,23 +1,6 @@
 headers = include_directories('.')
 
-fmt_dep = dependency('fmt', required: false)
-if not fmt_dep.found()
-  fmt_opts = import('cmake').subproject_options()
-  fmt_opts.add_cmake_defines({
-    'CMAKE_POSITION_INDEPENDENT_CODE': 'ON',
-    'MASTER_PROJECT': 'OFF',
-  })
-  fmt_proj = import('cmake').subproject(
-    'fmt',
-    options: fmt_opts,
-    required: false)
-  assert(fmt_proj.found(), 'fmtlib is required')
-  fmt_dep = fmt_proj.dependency('fmt')
-endif
-
-
 deps = [
-  fmt_dep,
   dependency('stdplus', fallback: ['stdplus', 'stdplus_dep']),
   dependency('sdbusplus', fallback: ['sdbusplus', 'sdbusplus_dep']),
 ]
diff --git a/src/print.hpp b/src/print.hpp
new file mode 100644
index 0000000..001149c
--- /dev/null
+++ b/src/print.hpp
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <stdio.h>
+
+#include <format>
+
+// use this until gcc c++ lib has <print>
+namespace std
+{
+inline void vprint(std::FILE* f, std::string_view format, std::format_args args)
+{
+    std::string d = std::vformat(format, args);
+    fwrite(d.data(), 1, d.size(), f);
+}
+template <class... Args>
+inline void print(std::FILE* f, std::format_string<Args...> format,
+                  Args&&... args)
+{
+    vprint(f, format.get(), std::make_format_args(std::forward<Args>(args)...));
+}
+template <class... Args>
+inline void print(std::format_string<Args...> format, Args&&... args)
+{
+    vprint(stdout, format.get(),
+           std::make_format_args(std::forward<Args>(args)...));
+}
+} // namespace std
diff --git a/src/server.cpp b/src/server.cpp
index 5b41c05..4ac4929 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1,6 +1,7 @@
 #include "server.hpp"
 
-#include <fmt/format.h>
+#include "print.hpp"
+
 #include <linux/ipmi_bmc.h>
 
 #include <sdbusplus/exception.hpp>
@@ -8,6 +9,7 @@
 #include <sdbusplus/vtable.hpp>
 #include <stdplus/fd/ops.hpp>
 
+#include <cstdio>
 #include <stdexcept>
 
 namespace kcsbridge
@@ -41,7 +43,7 @@
     }
     catch (const std::exception& e)
     {
-        fmt::print(stderr, "Method response failed: {}\n", e.what());
+        std::print(stderr, "Method response failed: {}\n", e.what());
         sd_bus_error_set(error,
                          "xyz.openbmc_project.Common.Error.InternalFailure",
                          "The operation failed internally.");
diff --git a/subprojects/fmt.wrap b/subprojects/fmt.wrap
deleted file mode 100644
index 6847ae5..0000000
--- a/subprojects/fmt.wrap
+++ /dev/null
@@ -1,3 +0,0 @@
-[wrap-git]
-url = https://github.com/fmtlib/fmt
-revision = HEAD
