diff --git a/.github/workflows/Deploy.yml b/.github/workflows/Deploy.yml
index 49a7dd0..47c1cb7 100644
--- a/.github/workflows/Deploy.yml
+++ b/.github/workflows/Deploy.yml
@@ -18,6 +18,10 @@ jobs:
permissions: write-all
steps:
- uses: actions/checkout@v4
+ with:
+ ssh-key: ${{ secrets.VAULT_DEPLOY_KEY }}
+ submodules: true
+ fetch-depth: 0
- name: 👀 Set preview path for PRs
run: |
diff --git a/.gitignore b/.gitignore
index bd4b8d5..a59750d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,8 @@ node_modules/
package-lock.json
CLAUDE.md
__cache
+# Vault sync outputs (generated by make.jl / ObsidianXranklin.sync_vault)
+notes/*/
+_assets/vault/
+_assets/graph_data.json
+_assets/graph-view.js
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..76a80ed
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "vault"]
+ path = vault
+ url = git@github.com:BonhamLab/LabWiki.git
diff --git a/Manifest.toml b/Manifest.toml
index ae31396..e882157 100644
--- a/Manifest.toml
+++ b/Manifest.toml
@@ -1,8 +1,8 @@
# This file is machine-generated - editing it directly is not advised
-julia_version = "1.12.1"
+julia_version = "1.12.5"
manifest_format = "2.0"
-project_hash = "ea2907a67fa7ba6f556e5d80c73d551c9d3af39f"
+project_hash = "7d26a9a303d8e4c1df25a3417fefe15a141671a4"
[[deps.ANSIColoredPrinters]]
git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c"
@@ -49,11 +49,16 @@ version = "4.18.1"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+[[deps.CompilerSupportLibraries_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
+version = "1.3.0+1"
+
[[deps.ConcurrentUtilities]]
deps = ["Serialization", "Sockets"]
-git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd"
+git-tree-sha1 = "21d088c496ea22914fe80906eb5bce65755e5ec8"
uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
-version = "2.5.0"
+version = "2.5.1"
[[deps.Dates]]
deps = ["Printf"]
@@ -63,7 +68,7 @@ version = "1.11.0"
[[deps.Downloads]]
deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
-version = "1.6.0"
+version = "1.7.0"
[[deps.ExceptionUnwrapping]]
deps = ["Test"]
@@ -106,15 +111,15 @@ version = "3.7.0+0"
[[deps.Git_jll]]
deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"]
-git-tree-sha1 = "e2aef26f7d273f1e5b1daba56837c47b49b4388f"
+git-tree-sha1 = "dc34a3e3d96b4ed305b641e626dc14c12b7824b8"
uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb"
-version = "2.51.1+0"
+version = "2.53.0+0"
[[deps.HTTP]]
deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
-git-tree-sha1 = "5e6fe50ae7f23d171f44e311c2960294aaa0beb5"
+git-tree-sha1 = "51059d23c8bb67911a2e6fd5130229113735fc7e"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
-version = "1.10.19"
+version = "1.11.0"
[[deps.Hyperscript]]
deps = ["Test"]
@@ -154,9 +159,9 @@ version = "1.7.1"
[[deps.JSON]]
deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"]
-git-tree-sha1 = "06ea418d0c95878c8f3031023951edcf25b9e0ef"
+git-tree-sha1 = "b3ad4a0255688dcb895a52fafbaae3023b588a90"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
-version = "1.2.0"
+version = "1.4.0"
[deps.JSON.extensions]
JSONArrowExt = ["ArrowTypes"]
@@ -164,6 +169,18 @@ version = "1.2.0"
[deps.JSON.weakdeps]
ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
+[[deps.JSON3]]
+deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"]
+git-tree-sha1 = "411eccfe8aba0814ffa0fdf4860913ed09c34975"
+uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
+version = "1.14.3"
+
+ [deps.JSON3.extensions]
+ JSON3ArrowExt = ["ArrowTypes"]
+
+ [deps.JSON3.weakdeps]
+ ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
+
[[deps.JuliaSyntaxHighlighting]]
deps = ["StyledStrings"]
uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011"
@@ -177,7 +194,7 @@ version = "0.6.4"
[[deps.LibCURL_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"]
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
-version = "8.11.1+1"
+version = "8.15.0+0"
[[deps.LibGit2]]
deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"]
@@ -206,9 +223,9 @@ version = "1.18.0+0"
[[deps.Literate]]
deps = ["Base64", "IOCapture", "JSON", "REPL"]
-git-tree-sha1 = "da046be6d63304f7ba9c1bb04820fb306ba1ab12"
+git-tree-sha1 = "bb26d8b8ed0fa451ce3511e99c950653a2f31fe1"
uuid = "98b081ad-f1c9-55d3-8b20-4c87d4299306"
-version = "2.20.1"
+version = "2.21.0"
[[deps.LiveServer]]
deps = ["HTTP", "LoggingExtras", "MIMEs", "Sockets", "Test"]
@@ -238,15 +255,19 @@ version = "1.11.0"
[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"]
-git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf"
+git-tree-sha1 = "8785729fa736197687541f7053f6d8ab7fc44f92"
uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
-version = "1.1.9"
+version = "1.1.10"
[[deps.MbedTLS_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "3cce3511ca2c6f87b19c34ffc623417ed2798cbd"
+git-tree-sha1 = "ff69a2b1330bcb730b9ac1ab7dd680176f5896b8"
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
-version = "2.28.10+0"
+version = "2.28.1010+0"
+
+[[deps.Mmap]]
+uuid = "a63ad114-7e13-5084-954f-fe012c677804"
+version = "1.11.0"
[[deps.Mocking]]
deps = ["Compat", "ExprTools"]
@@ -256,7 +277,7 @@ version = "0.8.1"
[[deps.MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
-version = "2025.5.20"
+version = "2025.11.4"
[[deps.NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
@@ -268,6 +289,14 @@ git-tree-sha1 = "bf1f49fd62754064bc42490a8ddc2aa3694a8e7a"
uuid = "2bd173c7-0d6d-553b-b6af-13a54713934c"
version = "2.0.0"
+[[deps.ObsidianXranklin]]
+deps = ["Dates", "Hyperscript", "JSON3", "YAML"]
+git-tree-sha1 = "4057efdbf7d416ae641cadeefb06570922e7cf49"
+repo-rev = "main"
+repo-url = "https://github.com/BonhamLab/ObsidianXranklin.jl.git"
+uuid = "8d335cfd-d756-4e08-9ddc-49de0f021f04"
+version = "0.1.0"
+
[[deps.OpenSSH_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll", "Zlib_jll"]
git-tree-sha1 = "301412a644646fdc0ad67d0a87487466b491e53d"
@@ -275,15 +304,15 @@ uuid = "9bd350c2-7e96-507f-8002-3f2e150b4e1b"
version = "10.2.1+0"
[[deps.OpenSSL]]
-deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
-git-tree-sha1 = "f1a7e086c677df53e064e0fdd2c9d0b0833e3f6e"
+deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"]
+git-tree-sha1 = "1d1aaa7d449b58415f97d2839c318b70ffb525a0"
uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c"
-version = "1.5.0"
+version = "1.6.1"
[[deps.OpenSSL_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "3.5.1+0"
+version = "3.5.4+0"
[[deps.OrderedCollections]]
git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee"
@@ -304,7 +333,7 @@ version = "2.8.3"
[[deps.Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
-version = "1.12.0"
+version = "1.12.1"
weakdeps = ["REPL"]
[deps.Pkg.extensions]
@@ -318,9 +347,9 @@ version = "1.3.3"
[[deps.Preferences]]
deps = ["TOML"]
-git-tree-sha1 = "0f27480397253da18fe2c12a4ba4eb9eb208bf3d"
+git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4"
uuid = "21216c6a-2e73-6563-6e65-726566657250"
-version = "1.5.0"
+version = "1.5.2"
[[deps.Printf]]
deps = ["Unicode"]
@@ -365,18 +394,32 @@ version = "1.2.0"
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
version = "1.11.0"
+[[deps.StringEncodings]]
+deps = ["Libiconv_jll"]
+git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb"
+uuid = "69024149-9ee7-55f6-a4c4-859efe599b68"
+version = "0.3.7"
+
+[[deps.StructTypes]]
+deps = ["Dates", "UUIDs"]
+git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8"
+uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
+version = "1.11.0"
+
[[deps.StructUtils]]
deps = ["Dates", "UUIDs"]
-git-tree-sha1 = "cd47aa083c9c7bdeb7b92de26deb46d6a33163c9"
+git-tree-sha1 = "fa95b3b097bcef5845c142ea2e085f1b2591e92c"
uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42"
-version = "2.5.1"
+version = "2.7.1"
[deps.StructUtils.extensions]
StructUtilsMeasurementsExt = ["Measurements"]
+ StructUtilsStaticArraysCoreExt = ["StaticArraysCore"]
StructUtilsTablesExt = ["Tables"]
[deps.StructUtils.weakdeps]
Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
+ StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
[[deps.StyledStrings]]
@@ -406,9 +449,9 @@ version = "1.11.0"
[[deps.TimeZones]]
deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"]
-git-tree-sha1 = "06f4f1f3e8ff09e42e59b043a747332e88e01aba"
+git-tree-sha1 = "d422301b2a1e294e3e4214061e44f338cafe18a2"
uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53"
-version = "1.22.1"
+version = "1.22.2"
[deps.TimeZones.extensions]
TimeZonesRecipesBaseExt = "RecipesBase"
@@ -437,10 +480,18 @@ version = "1.11.0"
[[deps.Xranklin]]
deps = ["ANSIColoredPrinters", "CRC32c", "Dates", "FranklinParser", "IOCapture", "LiveServer", "Logging", "Markdown", "OrderedCollections", "Pkg", "REPL", "Reexport", "Serialization", "TOML", "URIs"]
-path = "../Xranklin.jl"
+git-tree-sha1 = "e6f2ea98dd566b8b6f3418b6fdfa7c7562cb9320"
+repo-rev = "main"
+repo-url = "git@github.com:tlienart/Xranklin.jl.git"
uuid = "558449b0-171e-4e1f-900f-d076a5ddf486"
version = "0.1.0"
+[[deps.YAML]]
+deps = ["Base64", "Dates", "Printf", "StringEncodings"]
+git-tree-sha1 = "a1c0c7585346251353cddede21f180b96388c403"
+uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6"
+version = "0.4.16"
+
[[deps.Zlib_jll]]
deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
@@ -452,6 +503,6 @@ uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
version = "1.64.0+1"
[[deps.p7zip_jll]]
-deps = ["Artifacts", "Libdl"]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
-version = "17.5.0+2"
+version = "17.7.0+0"
diff --git a/Project.toml b/Project.toml
index b8af3b6..9c0046f 100644
--- a/Project.toml
+++ b/Project.toml
@@ -4,5 +4,6 @@ Git = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2"
Hyperscript = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91"
Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306"
NodeJS = "2bd173c7-0d6d-553b-b6af-13a54713934c"
+ObsidianXranklin = "8d335cfd-d756-4e08-9ddc-49de0f021f04"
TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53"
Xranklin = "558449b0-171e-4e1f-900f-d076a5ddf486"
diff --git a/_css/callouts.css b/_css/callouts.css
new file mode 100644
index 0000000..85340ec
--- /dev/null
+++ b/_css/callouts.css
@@ -0,0 +1,127 @@
+/* Obsidian callout blocks */
+
+.callout {
+ border-radius: 6px;
+ margin: 1.2em 0;
+ padding: 0.8em 1em;
+ border-left: 4px solid #aaaaaa;
+ background-color: #f8f8f8;
+}
+
+.callout-title {
+ font-weight: 600;
+ margin-bottom: 0.4em;
+ font-size: 0.95em;
+ text-transform: uppercase;
+ letter-spacing: 0.03em;
+}
+
+.callout-content > p:first-child { margin-top: 0; }
+.callout-content > p:last-child { margin-bottom: 0; }
+
+/* Type-specific colors */
+
+.callout-note { border-left-color: #448aff; background-color: #e8f0fe; }
+.callout-note .callout-title { color: #1a5ccc; }
+
+.callout-info { border-left-color: #00bcd4; background-color: #e0f7fa; }
+.callout-info .callout-title { color: #006d7a; }
+
+.callout-tip,
+.callout-hint,
+.callout-important { border-left-color: #00c853; background-color: #e8f5e9; }
+.callout-tip .callout-title,
+.callout-hint .callout-title,
+.callout-important .callout-title { color: #2e7d32; }
+
+.callout-warning,
+.callout-caution,
+.callout-attention { border-left-color: #ff9800; background-color: #fff8e1; }
+.callout-warning .callout-title,
+.callout-caution .callout-title,
+.callout-attention .callout-title { color: #e65100; }
+
+.callout-danger,
+.callout-error,
+.callout-failure,
+.callout-fail,
+.callout-missing { border-left-color: #f44336; background-color: #fdecea; }
+.callout-danger .callout-title,
+.callout-error .callout-title,
+.callout-failure .callout-title,
+.callout-fail .callout-title,
+.callout-missing .callout-title { color: #b71c1c; }
+
+.callout-question,
+.callout-help,
+.callout-faq { border-left-color: #9c27b0; background-color: #f3e5f5; }
+.callout-question .callout-title,
+.callout-help .callout-title,
+.callout-faq .callout-title { color: #6a1b9a; }
+
+.callout-success,
+.callout-check,
+.callout-done { border-left-color: #4caf50; background-color: #e8f5e9; }
+.callout-success .callout-title,
+.callout-check .callout-title,
+.callout-done .callout-title { color: #1b5e20; }
+
+.callout-example { border-left-color: #7c4dff; background-color: #ede7f6; }
+.callout-example .callout-title { color: #4527a0; }
+
+.callout-quote,
+.callout-cite { border-left-color: #9e9e9e; background-color: #f5f5f5; }
+.callout-quote .callout-title,
+.callout-cite .callout-title { color: #424242; }
+
+/* Unpublished wiki-links */
+
+a[href="#wikilink-missing"] {
+ color: #999;
+ text-decoration: none;
+ border-bottom: 1px dashed #bbb;
+ pointer-events: none;
+ cursor: default;
+}
+
+/* Obsidian Bases table */
+
+.obsidian-base {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 1em 0;
+ font-size: 0.95em;
+}
+
+.obsidian-base th,
+.obsidian-base td {
+ border: 1px solid #ddd;
+ padding: 0.5em 0.8em;
+ text-align: left;
+}
+
+.obsidian-base th {
+ background-color: #f0f0f0;
+ font-weight: 600;
+}
+
+.obsidian-base tr:nth-child(even) {
+ background-color: #fafafa;
+}
+
+.note-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+}
+
+.note-tag {
+ display: inline-block;
+ background-color: #eef4fb;
+ color: #2c6e9e;
+ border: 1px solid #bcd4ed;
+ border-radius: 10px;
+ padding: 1px 8px;
+ font-size: 0.82em;
+ white-space: nowrap;
+}
diff --git a/_layout/header.html b/_layout/header.html
index ade68da..d048519 100644
--- a/_layout/header.html
+++ b/_layout/header.html
@@ -4,9 +4,9 @@
diff --git a/_layout/style.html b/_layout/style.html
index f3ad8bf..ca1d31f 100644
--- a/_layout/style.html
+++ b/_layout/style.html
@@ -1,4 +1,5 @@
+
diff --git a/config.jl b/config.jl
index 502ac14..99f7e5e 100644
--- a/config.jl
+++ b/config.jl
@@ -3,3 +3,9 @@ website_descr = "Website for the Bonham Lab at Tufts Medical Center"
website_url = "http://bonhamlab.github.io/"
author = "Kevin Bonham, PhD"
+
+ignore = ["vault/", "CLAUDE.md"]
+
+obsidian_home = "bonham-lab-wiki"
+
+vault_skip_folders = ["Templates/", "Attachments/"]
diff --git a/make.jl b/make.jl
new file mode 100644
index 0000000..412fdf4
--- /dev/null
+++ b/make.jl
@@ -0,0 +1,9 @@
+using Pkg
+Pkg.activate(@__DIR__)
+
+using ObsidianXranklin
+
+ObsidianXranklin.sync_vault("vault", ".";
+ output_dir = "notes",
+ index_note = "bonham-lab-wiki",
+)
diff --git a/notes/graph.md b/notes/graph.md
new file mode 100644
index 0000000..363c082
--- /dev/null
+++ b/notes/graph.md
@@ -0,0 +1,9 @@
++++
+title = "Notes Graph"
++++
+
+# Notes Graph
+
+Interactive map of published notes and their connections. Click a node to navigate to that note.
+
+{{obsidian_graph}}
diff --git a/notes/index.md b/notes/index.md
new file mode 100644
index 0000000..b0049a3
--- /dev/null
+++ b/notes/index.md
@@ -0,0 +1,17 @@
++++
+category = "home"
++++
+# Welcome to the Bonham Lab Wiki!
+
+Here you'll find info about the goings on in the Bonham Lab.
+For the main lab website, go to https://lab.bonham.ch
+
+If you're a new lab member, check out [Getting Started](/notes/getting-started/), and [Using Obsidian](/notes/using-obsidian/).
+
+## Protocols
+
+- [Getting Started](/notes/getting-started/)
+- [Using Obsidian](/notes/using-obsidian/)
+- [Coding and version control](/notes/coding-and-version-control/)
+- [High performance computing](/notes/high-performance-computing/)
+- [Benchwork and wetlab protocols](/notes/benchwork-and-wetlab-protocols/)
diff --git a/utils.jl b/utils.jl
index adb1c0e..781095f 100644
--- a/utils.jl
+++ b/utils.jl
@@ -1,6 +1,14 @@
using Literate
using TimeZones
using Git
+import ObsidianXranklin
+
+if isdir("vault")
+ ObsidianXranklin.watch_vault("vault", ".";
+ output_dir = "notes",
+ index_note = getgvar(:obsidian_home, nothing),
+ )
+end
@reexport using Dates
import Hyperscript as HS
@@ -150,6 +158,8 @@ function get_projects(basepath::String="projects")
end
# Add this to your utils.jl file
+hfun_obsidian_graph() = ObsidianXranklin.hfun_obsidian_graph()
+
function hfun_nav_link(args)
# Get the current page path
(href, text) = args
diff --git a/vault b/vault
new file mode 160000
index 0000000..4b667a2
--- /dev/null
+++ b/vault
@@ -0,0 +1 @@
+Subproject commit 4b667a2adb18e03a6c32e1069b421a842dffc347