diff --git a/src/Bif/Bif.fsproj b/src/Bif/Bif.fsproj
new file mode 100644
index 0000000..b6d18c5
--- /dev/null
+++ b/src/Bif/Bif.fsproj
@@ -0,0 +1,16 @@
+
+
+
+ Exe
+ net10.0
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Bif/Program.fs b/src/Bif/Program.fs
new file mode 100644
index 0000000..3e108fb
--- /dev/null
+++ b/src/Bif/Program.fs
@@ -0,0 +1,82 @@
+open System.Net
+open System.IO
+open Fibble.FibLib
+open Fibble.FibLib.Ast // Ger oss tillgång till Element, Text, RawHtml etc.
+open Fibble.FibLib.Pandoc
+open Fibble.FibLib.Utils
+
+// ==========================================
+// 1. Prelude (Dina egna taggar)
+// ==========================================
+
+
+let myPrelude : Map =
+ Map [
+ "quotient", fun _ args _ ->
+ match args with
+ | [_, one; _, two] ->
+ Text (sprintf "%d" (int one / int two))
+ | _ ->
+ Text "[Fel: quotient kräver två argument]"
+ "bold", fun _ args children ->
+ Element("b", args, children)
+ "image", positional (fun _ args _ -> Element("img", [("src", args[0])], []))
+ "value", positional (fun meta args _ ->
+ match Map.tryFind args.Head meta with
+ | Some(v) -> Text v
+ | None -> Text $"value {args.Head} not found in metadata")
+ "link", positional (fun _ args children ->
+ let url = if args.Length > 0 then args.[0].Trim '"' else "#"
+ Element("a", [("href", args.Head)], children))
+
+ // @br har varken argument eller barn, så vi returnerar bara rå HTML direkt
+ "br", nameToElement "br"
+ "table", fun _ _ children -> Text "hej"
+ "md", fun meta args children -> RawHtml (mdToHtml (stringifyNodes children))
+ ]
+
+// ==========================================
+// 2. Mall och Evaluator
+// ==========================================
+//
+module File =
+ let readFile path =
+ match Path.Exists(path) with
+ | true -> File.ReadAllText(path)
+ | _ -> failwith $"{path} does not exist"
+
+let pageTemplate = File.readFile "_page-template"
+
+let sourceCode = File.readFile "document.fib"
+// ==========================================
+// 3. Huvudpipeline
+// ==========================================
+let processDocument (source: string) =
+ let evaluator = Evaluators.FsiEvaluator()
+
+ // Steg 1: Parsa koden
+ let metadata, rawBlocks = Parser.parse source
+
+
+ // Steg 2: Transformera och exekvera trädet
+ let evaluatedBlocks =
+ rawBlocks |> List.map (function
+ | Paragraph children ->
+ Paragraph (children
+ |> List.map (Execution.transform metadata myPrelude evaluator))
+ | Section(l, a, children) ->
+ Section(l, a, children
+ |> List.map (Execution.transform metadata myPrelude evaluator))
+ )
+
+ // Steg 3: Be printern skriva ut trädet till HTML
+ let bodyHtml = HtmlPrinter.render (metadata, evaluatedBlocks)
+
+ // Steg 4: Fyll i din HTML-mall
+ let mutable finalHtml = pageTemplate.Replace("{{body}}", bodyHtml)
+
+ finalHtml
+
+// Kör programmet
+let output = processDocument sourceCode
+printfn "%s" output
diff --git a/src/Bif/document.fib b/src/Bif/document.fib
new file mode 100644
index 0000000..923d706
--- /dev/null
+++ b/src/Bif/document.fib
@@ -0,0 +1,39 @@
+---
+author: bajs
+date: yesterday
+title: FSI Test
+---
+
+@section{Definitioner}
+Vi definierar en funktion och en variabel.
+@"""
+let globalCounter = ref 0
+
+let increment () =
+ globalCounter.Value <- globalCounter.Value + 1
+ sprintf "Räknaren är nu %d" globalCounter.Value
+"""
+@(1)
+
+@link[www.google.com]{hejsan hoppsan fallerallera}
+
+Detta är en paragraf som har lite text i sig och lite @md{inbäddad *markdown* som kanske} funkar. Det är bra så.
+
+@md{
+en tabell
+
+hej hopp
+--- ----
+abc defg
+bde dddd
+ueo eoau
+ueo aoeu
+}
+
+elleR?
+
+@section{Användning}
+Första anropet: @(increment())
+Andra anropet: @(increment())
+
+Test av utskrift: @value[date]