diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000000000000000000000000000000000000..b3a59ea4064092fdeeabc18ebb745ac8b04ee837
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "hyperion"
+version = "0.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index 099d9f7ad6e4dc9bf909a66f4bcfd0f922652afc..0a1f4f7407f8b0a4d674907700d7474d54e7ddc4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,12 +8,4 @@ edition = "2021"
 [lib]
 crate-type = ["staticlib"]
 
-[profile.release]
-debug = 1
-
 [dependencies]
-
-
-[build-dependencies]
-#cc = "1.0.78"
-nasm-rs = "0.2.4"
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..0482834accd3b966deb274ec770bffc2c516b9ad
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,84 @@
+##
+# Hyperion
+#
+# @file
+# @version 0.1
+
+ARCH          ?= x86_64
+PROFILE       ?= debug
+#PROFILE       ?= release
+
+NASM          ?= nasm
+LD            ?= ld.lld
+OBJCOPY       ?= llvm-objcopy
+CARGO         ?= cargo
+#CARGO         ?= cargo-clif
+
+TARGET_DIR    ?= target
+HYPER_DIR     := ${TARGET_DIR}/hyperion/${ARCH}
+ARCH_DIR      := src/arch/${ARCH}
+
+# hyperion kernel lib
+RUST_T_x86_64 := x86_64-unknown-none
+CARGO_DIR     := ${TARGET_DIR}/${RUST_T_${ARCH}}/${PROFILE}
+RUST_F_debug  :=
+RUST_F_release:= --release
+CARGO_FLAGS   ?=
+CARGO_FLAGS   += ${RUST_F_${PROFILE}}
+CARGO_FLAGS   += --target=${RUST_T_${ARCH}}
+KERNEL_LIB    := ${CARGO_DIR}/libhyperion.a
+KERNEL_SRC    := $(filter-out %: ,$(file < ${CARGO_DIR}/libhyperion.d))
+${KERNEL_LIB} : ${KERNEL_SRC} Makefile Cargo.toml Cargo.lock
+	@echo "\n\033[32m--[[ building Hyperion lib ]]--\033[0m"
+	${CARGO} build ${CARGO_FLAGS}
+
+# hyperion boot code
+BOOT_SRC      := ${ARCH_DIR}/start.asm
+BOOT_OBJ      := ${HYPER_DIR}/start.o
+NASM_F_x86_64 := elf64
+NASM_F_x86    := elf32
+NASM_FLAGS    ?=
+NASM_FLAGS    += ${BOOT_SRC}
+NASM_FLAGS    += -o ${BOOT_OBJ}
+NASM_FLAGS    += -f ${NASM_F_${ARCH}}
+${BOOT_OBJ} : ${BOOT_SRC} Makefile
+	@echo "\n\033[32m--[[ building Hyperion boot ]]--\033[0m"
+	mkdir -p ${HYPER_DIR}
+	${NASM} ${NASM_FLAGS}
+
+# hyperion kernel elf
+LD_SCRIPT     := ${ARCH_DIR}/link.ld
+KERNEL_ELF    := ${HYPER_DIR}/hyperion
+KERNEL_DEPS   := ${BOOT_OBJ} ${KERNEL_LIB}
+LD_M_x86_64   := elf_x86_64
+LD_M_x86      := elf_i386
+LD_FLAGS      ?=
+LD_FLAGS      += ${KERNEL_DEPS}
+LD_FLAGS      += -o ${KERNEL_ELF}
+LD_FLAGS      += --gc-sections
+LD_FLAGS      += -T ${LD_SCRIPT}
+LD_FLAGS      += -m ${LD_M_${ARCH}}
+${KERNEL_ELF} : ${KERNEL_DEPS} ${LD_SCRIPT} Makefile
+	@echo "\n\033[32m--[[ building Hyperion kernel ]]--\033[0m"
+	mkdir -p ${HYPER_DIR}
+	${LD} ${LD_FLAGS}
+#	evil hack to satisfy qemu and grub:
+#	the entry format has to be x86 not x86_64
+	${OBJCOPY} -O elf32-i386 ${KERNEL_ELF}
+
+# build alias
+build : ${KERNEL_ELF}
+
+# qemu alias
+QEMU_x86_64   ?= qemu-system-x86_64
+QEMU_x86      ?= qemu-system-x86
+QEMU_FLAGS    ?=
+QEMU_FLAGS    += -enable-kvm
+QEMU_FLAGS    += -d cpu_reset,guest_errors
+QEMU_FLAGS    += -kernel ${KERNEL_ELF}
+qemu : ${KERNEL_ELF}
+	${QEMU_${ARCH}} ${QEMU_FLAGS}
+
+.PHONY : build qemu
+
+# end
diff --git a/kernel/src/cfg.rs b/kernel/src/cfg.rs
deleted file mode 100644
index 9c0f20e1d330059b5ff06f5e10457e89c93058d6..0000000000000000000000000000000000000000
--- a/kernel/src/cfg.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-const CONFIG: bootloader_api::BootloaderConfig = {
-    let mut config = bootloader_api::BootloaderConfig::new_default();
-    config.kernel_stack_size = 4096 * 4; // 16KiB
-    config
-};
-
-bootloader_api::entry_point!(super::kernel_main, config = &CONFIG);
diff --git a/src/arch/x86_64/link.ld b/src/arch/x86_64/link.ld
new file mode 100644
index 0000000000000000000000000000000000000000..eb5ae92337ff526991988521a56ef5b15407d977
--- /dev/null
+++ b/src/arch/x86_64/link.ld
@@ -0,0 +1,14 @@
+ENTRY(start)
+
+SECTIONS {
+    . = 1M;
+
+    .boot_text : ALIGN(4k) {
+          KEEP(*(.multiboot1))
+          *(.boot)
+    }
+
+    .text : ALIGN(4k) {
+          *(.text)
+    }
+}
diff --git a/src/arch/x86_64/start.asm b/src/arch/x86_64/start.asm
new file mode 100644
index 0000000000000000000000000000000000000000..c5ef80103f930633ba73799a8e83e938bcd5c0ef
--- /dev/null
+++ b/src/arch/x86_64/start.asm
@@ -0,0 +1,33 @@
+    ;; ----------
+    ;; Multiboot2
+    ;; ----------
+
+    section .multiboot2
+
+header_start:
+    dd 0xE85250D6                                             ;; multiboot2 magic
+    dd 0                                                      ;; arch: 32 bit (protected mode)
+    dd header_end - header_start                              ;; header length
+    dd 0x100000000 - (0xE85250D6 + header_end - header_start) ;; checksum
+
+    dd 0 ;; end tag
+    dd 8
+header_end:
+
+    ;; ----------
+    ;; Multiboot1
+    ;; ----------
+
+    section .multiboot1
+    dd 0x1BADB002                     ;; multiboot1 magic
+    dd 3                              ;; flags
+    dd 0x100000000 - (0x1BADB002 + 3) ;; checksum
+
+    section .boot
+    global start
+    bits 32
+
+start:
+    cli
+    cld
+    hlt
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1c26aad36a307c9123bab5c7443f91041fd278d2
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,11 @@
+#![no_std]
+#![no_main]
+
+#[panic_handler]
+fn panic_handler(_: &core::panic::PanicInfo) -> ! {
+    loop {}
+}
+
+#[no_mangle]
+#[link_section = ".boot"]
+pub extern "C" fn _start() {}