This guide walks you through setting up a password-protected private journal on Blot, using Obsidian for writing and Dropbox for secure storage.
β Key Features:
Blot treats files in different folders differently:
File | Purpose |
---|---|
/Users/Dropbox/MyBlog/_Journal/journal.md |
Main journal file (where you write entries). Blot will NOT upload this since _Journal starts with _ . |
/Users/Dropbox/MyBlog/Pages/NyJournal.md |
Public Blot page that runs JavaScript to fetch journal.md after password entry. Blot publishes this as a standalone page. |
Write your journal entries in Obsidian in:
/Users/Dropbox/MyBlog/_Journal/journal.md
Use Markdown as usual.
Add images using relative paths (e.g., if stored in _attachments
folder):

_attachments/
, but Obsidian can still reference them.Inside _Journal
, create a file:
/Users/Dropbox/MyBlog/_Journal/password.txt
Inside password.txt
, write only your password:
supersecret123
Get a direct link from Dropbox:
Right-click password.txt
β Copy Link.
Modify the link to use dl.dropboxusercontent.com
.
https://dl.dropboxusercontent.com/s/YOUR_FILE_ID/password.txt
NyJournal.md
in Obsidian# Welcome to Your Journal
This journal is **password-protected**. Please enter the password to unlock.
<div id="container" style="display: none;">
<div id="content"></div>
</div>
<script>
async function getStoredPassword() {
let passwordURL = "https://dl.dropboxusercontent.com/s/YOUR_FILE_ID/password.txt"; // Replace with your actual Dropbox link
try {
let response = await fetch(passwordURL);
if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`);
return (await response.text()).trim(); // Fetch password and remove spaces
} catch (error) {
console.error("Error fetching password:", error);
alert("Could not verify password. Try again later.");
return null;
}
}
async function checkPassword() {
let storedPassword = await getStoredPassword();
if (!storedPassword) return; // Stop if password fetch fails
let passcode = prompt("Enter PassCode");
if (passcode === storedPassword) {
alert("Access Granted!");
document.getElementById("container").style.display = "block";
fetchPrivateJournal();
} else {
alert("Incorrect Password");
checkPassword(); // Retry if wrong
}
}
async function fetchPrivateJournal() {
let privateJournalURL = "https://dl.dropboxusercontent.com/s/YOUR_FILE_ID/journal.md?dl=1"; // Force download
try {
let response = await fetch(privateJournalURL);
if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`);
let text = await response.text();
// Convert Markdown to HTML using marked.js
document.getElementById("content").innerHTML = marked.parse(text);
} catch (error) {
console.error("Error loading journal:", error);
document.getElementById("content").innerHTML = "<p>Error loading journal. Try again later.</p>";
}
}
checkPassword();
</script>
Blot will not automatically style the loaded Markdown. To improve formatting, you can add this CSS to NyJournal.md
:
<style>
body {
font-family: Arial, sans-serif;
max-width: 700px;
margin: auto;
padding: 20px;
}
#container {
background-color: #f9f9f9;
padding: 20px;
border-radius: 8px;
box-shadow: 2px 2px 10px rgba(0,0,0,0.1);
}
pre, code {
background: #eee;
padding: 5px;
border-radius: 4px;
}
</style>
yourblog.com/NyJournal
).password.txt
.Ensure images display correctly using relative paths like:

password.txt
in Dropbox.journal.md
in Obsidian._attachments/
and reference them with relative paths.π Now you have a private, password-protected journal using Obsidian, Dropbox, and Blot! π
β Password not working?
password.txt
is in _Journal/
and its Dropbox link uses dl.dropboxusercontent.com
.β Journal not loading?
journal.md
is accessible via dl.dropboxusercontent.com?dl=1
.β Images not showing?
_attachments/
and use relative paths.