diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index 9e26dfe..bd31ae0 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "theme": "obsidian", + "cssTheme": "Tokyo Night" +} \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json new file mode 100644 index 0000000..7264d29 --- /dev/null +++ b/.obsidian/community-plugins.json @@ -0,0 +1,3 @@ +[ + "hoarder-sync" +] \ No newline at end of file diff --git a/.obsidian/plugins/hoarder-sync/data.json b/.obsidian/plugins/hoarder-sync/data.json new file mode 100644 index 0000000..e33a883 --- /dev/null +++ b/.obsidian/plugins/hoarder-sync/data.json @@ -0,0 +1,26 @@ +{ + "apiKey": "ak2_930f821671cbe46c8d7e_0df2443dba6dd9fe1dc8ebf52d6ac96e", + "apiEndpoint": "https://kara.werats.gay/api/v1", + "syncFolder": "KaraKeep", + "attachmentsFolder": "KaraKeep/attachments", + "syncIntervalMinutes": 60, + "lastSyncTimestamp": 1775965826232, + "updateExistingFiles": false, + "excludeArchived": true, + "onlyFavorites": false, + "syncNotesToHoarder": true, + "syncHighlights": true, + "onlyBookmarksWithHighlights": false, + "excludedTags": [], + "includedTags": [], + "downloadAssets": true, + "syncDeletions": false, + "deletionAction": "delete", + "deletionTag": "deleted", + "archiveFolder": "Hoarder/deleted", + "handleArchivedBookmarks": false, + "archivedBookmarkAction": "delete", + "archivedBookmarkTag": "archived", + "archivedBookmarkFolder": "Hoarder/archived", + "useObsidianRequest": false +} \ No newline at end of file diff --git a/.obsidian/plugins/hoarder-sync/main.js b/.obsidian/plugins/hoarder-sync/main.js new file mode 100644 index 0000000..9b977f1 --- /dev/null +++ b/.obsidian/plugins/hoarder-sync/main.js @@ -0,0 +1,1507 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => HoarderPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian3 = require("obsidian"); + +// src/asset-handler.ts +function getAssetUrl(assetId, client, settings) { + if (client) { + return client.getAssetUrl(assetId); + } + const baseUrl = settings.apiEndpoint.replace(/\/v1\/?$/, ""); + return `${baseUrl}/assets/${assetId}`; +} +function sanitizeAssetFileName(title) { + let sanitizedTitle = title.replace(/[\\/:*?"<>|]/g, "-").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, ""); + const maxTitleLength = 30; + if (sanitizedTitle.length > maxTitleLength) { + const truncated = sanitizedTitle.substring(0, maxTitleLength); + const lastDash = truncated.lastIndexOf("-"); + if (lastDash > maxTitleLength / 2) { + sanitizedTitle = truncated.substring(0, lastDash); + } else { + sanitizedTitle = truncated; + } + } + return sanitizedTitle; +} +async function downloadImage(app, url, assetId, title, client, settings) { + var _a; + try { + if (!await app.vault.adapter.exists(settings.attachmentsFolder)) { + await app.vault.createFolder(settings.attachmentsFolder); + } + const extension = ((_a = url.split(".").pop()) == null ? void 0 : _a.toLowerCase()) || "jpg"; + const safeExtension = ["jpg", "jpeg", "png", "gif", "webp"].includes(extension) ? extension : "jpg"; + const safeTitle = sanitizeAssetFileName(title); + const fileName = `${assetId}${safeTitle ? "-" + safeTitle : ""}.${safeExtension}`; + const filePath = `${settings.attachmentsFolder}/${fileName}`; + const files = await app.vault.adapter.list(settings.attachmentsFolder); + const existingFile = files.files.find( + (filePathItem) => filePathItem.startsWith(`${settings.attachmentsFolder}/${assetId}`) + ); + if (existingFile) { + return existingFile; + } + let buffer; + const apiDomain = new URL(settings.apiEndpoint).origin; + if (url.startsWith(apiDomain) && client) { + buffer = await client.downloadAsset(assetId); + } else { + const headers = {}; + if (url.startsWith(apiDomain)) { + headers["Authorization"] = `Bearer ${settings.apiKey}`; + } + const response = await fetch(url, { headers }); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); + buffer = await response.arrayBuffer(); + } + await app.vault.adapter.writeBinary(filePath, buffer); + return filePath; + } catch (error) { + console.error("Error downloading image:", url, error); + return null; + } +} +function escapeMarkdownPath(path) { + if (path.includes(" ") || /[<>\[\](){}]/.test(path)) { + return `<${path}>`; + } + return path; +} +var toWikilink = (path) => `"[[${path}]]"`; +async function processBookmarkAssets(app, bookmark, title, client, settings) { + let content = ""; + const fm = {}; + if (bookmark.content.type === "asset" && bookmark.content.assetType === "image") { + if (bookmark.content.assetId) { + const assetUrl = getAssetUrl(bookmark.content.assetId, client, settings); + let imagePath = null; + if (settings.downloadAssets) { + imagePath = await downloadImage( + app, + assetUrl, + bookmark.content.assetId, + title, + client, + settings + ); + } + if (imagePath) { + content += ` +![${title}](${escapeMarkdownPath(imagePath)}) +`; + fm.image = toWikilink(imagePath); + } else { + content += ` +![${title}](${escapeMarkdownPath(assetUrl)}) +`; + } + } else if (bookmark.content.sourceUrl) { + content += ` +![${title}](${escapeMarkdownPath(bookmark.content.sourceUrl)}) +`; + } + } else if (bookmark.content.type === "link") { + const assetIds = []; + const assetLabels = []; + if (bookmark.content.imageAssetId) { + assetIds.push(bookmark.content.imageAssetId); + assetLabels.push("Banner Image"); + } + if (bookmark.content.screenshotAssetId) { + assetIds.push(bookmark.content.screenshotAssetId); + assetLabels.push("Screenshot"); + } + if (bookmark.content.fullPageArchiveAssetId) { + assetIds.push(bookmark.content.fullPageArchiveAssetId); + assetLabels.push("Full Page Archive"); + } + if (bookmark.content.videoAssetId) { + assetIds.push(bookmark.content.videoAssetId); + assetLabels.push("Video"); + } + for (let i = 0; i < assetIds.length; i++) { + const assetId = assetIds[i]; + const label = assetLabels[i]; + const assetUrl = getAssetUrl(assetId, client, settings); + if (label === "Video") { + content += ` +[${title} - ${label}](${escapeMarkdownPath(assetUrl)}) +`; + } else { + let imagePath = null; + if (settings.downloadAssets) { + imagePath = await downloadImage( + app, + assetUrl, + assetId, + `${title}-${label}`, + client, + settings + ); + } + if (imagePath) { + content += ` +![${title} - ${label}](${escapeMarkdownPath(imagePath)}) +`; + if (label === "Banner Image") { + fm.banner = toWikilink(imagePath); + } else if (label === "Screenshot") { + fm.screenshot = toWikilink(imagePath); + } else if (label === "Full Page Archive") { + fm.full_page_archive = toWikilink(imagePath); + } + } else { + content += ` +![${title} - ${label}](${escapeMarkdownPath(assetUrl)}) +`; + } + } + } + if (assetIds.length === 0 && bookmark.content.imageUrl) { + content += ` +![${title}](${escapeMarkdownPath(bookmark.content.imageUrl)}) +`; + } + } + if (bookmark.assets && bookmark.assets.length > 0) { + const processedAssetIds = /* @__PURE__ */ new Set(); + if (bookmark.content.type === "asset" && bookmark.content.assetId) { + processedAssetIds.add(bookmark.content.assetId); + } + if (bookmark.content.type === "link") { + if (bookmark.content.imageAssetId) processedAssetIds.add(bookmark.content.imageAssetId); + if (bookmark.content.screenshotAssetId) + processedAssetIds.add(bookmark.content.screenshotAssetId); + if (bookmark.content.fullPageArchiveAssetId) + processedAssetIds.add(bookmark.content.fullPageArchiveAssetId); + if (bookmark.content.videoAssetId) processedAssetIds.add(bookmark.content.videoAssetId); + } + for (const asset of bookmark.assets) { + if (!processedAssetIds.has(asset.id)) { + const assetUrl = getAssetUrl(asset.id, client, settings); + const label = asset.assetType === "image" ? "Additional Image" : asset.assetType; + if (asset.assetType === "video") { + content += ` +[${title} - ${label}](${escapeMarkdownPath(assetUrl)}) +`; + } else { + let imagePath = null; + if (settings.downloadAssets) { + imagePath = await downloadImage( + app, + assetUrl, + asset.id, + `${title}-${label}`, + client, + settings + ); + } + if (imagePath) { + content += ` +![${title} - ${label}](${escapeMarkdownPath(imagePath)}) +`; + fm.additional = fm.additional || []; + fm.additional.push(toWikilink(imagePath)); + } else { + content += ` +![${title} - ${label}](${escapeMarkdownPath(assetUrl)}) +`; + } + } + } + } + } + return { content, frontmatter: Object.keys(fm).length > 0 ? fm : null }; +} + +// src/bookmark-utils.ts +function getBookmarkTitle(bookmark) { + if (bookmark.title) { + return bookmark.title; + } + if (bookmark.content.type === "link") { + if (bookmark.content.title) { + return bookmark.content.title; + } + if (bookmark.content.url) { + return extractTitleFromUrl(bookmark.content.url); + } + } else if (bookmark.content.type === "text") { + if (bookmark.content.text) { + return extractTitleFromText(bookmark.content.text); + } + } else if (bookmark.content.type === "asset") { + if (bookmark.content.fileName) { + return bookmark.content.fileName.replace(/\.[^/.]+$/, ""); + } + if (bookmark.content.sourceUrl) { + return extractTitleFromUrl(bookmark.content.sourceUrl); + } + } + return `Bookmark-${bookmark.id}-${new Date(bookmark.createdAt).toISOString().split("T")[0]}`; +} +function extractTitleFromUrl(url) { + var _a, _b; + try { + const parsedUrl = new URL(url); + const pathTitle = (_b = (_a = parsedUrl.pathname.split("/").pop()) == null ? void 0 : _a.replace(/\.[^/.]+$/, "")) == null ? void 0 : _b.replace(/-|_/g, " "); + if (pathTitle) { + return pathTitle; + } + return parsedUrl.hostname.replace(/^www\./, ""); + } catch (e) { + return url; + } +} +function extractTitleFromText(text) { + const firstLine = text.split("\n")[0]; + if (firstLine.length <= 100) { + return firstLine; + } + return firstLine.substring(0, 97) + "..."; +} + +// src/deletion-handler.ts +function determineDeletionActions(localBookmarkIds, activeBookmarkIds, archivedBookmarkIds, settings) { + const instructions = []; + if (!settings.syncDeletions && !settings.handleArchivedBookmarks) { + return instructions; + } + for (const bookmarkId of localBookmarkIds) { + const isActive = activeBookmarkIds.has(bookmarkId); + const isArchived = archivedBookmarkIds.has(bookmarkId); + if (!isActive && !isArchived) { + if (settings.syncDeletions && settings.deletionAction !== "ignore") { + instructions.push({ + bookmarkId, + action: settings.deletionAction, + reason: "deleted" + }); + } + } else if (!isActive && isArchived) { + if (settings.handleArchivedBookmarks && settings.archivedBookmarkAction !== "ignore") { + instructions.push({ + bookmarkId, + action: settings.archivedBookmarkAction, + reason: "archived" + }); + } + } + } + return instructions; +} +function countDeletionResults(instructions) { + const results = { + deleted: 0, + archived: 0, + tagged: 0, + archivedHandled: 0 + }; + for (const instruction of instructions) { + if (instruction.reason === "deleted") { + switch (instruction.action) { + case "delete": + results.deleted++; + break; + case "archive": + results.archived++; + break; + case "tag": + results.tagged++; + break; + } + } else if (instruction.reason === "archived") { + results.archivedHandled++; + } + } + return results; +} + +// src/filename-utils.ts +function sanitizeFileName(title, createdAt) { + const date = typeof createdAt === "string" ? new Date(createdAt) : createdAt; + const dateStr = date.toISOString().split("T")[0]; + let sanitizedTitle = title.replace(/[\\/:*?"<>|]/g, "-").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, ""); + const maxTitleLength = 36; + if (sanitizedTitle.length > maxTitleLength) { + const truncated = sanitizedTitle.substring(0, maxTitleLength); + const lastDash = truncated.lastIndexOf("-"); + if (lastDash > maxTitleLength / 2) { + sanitizedTitle = truncated.substring(0, lastDash); + } else { + sanitizedTitle = truncated; + } + } + return `${dateStr}-${sanitizedTitle}`; +} + +// src/filter-utils.ts +function shouldIncludeBookmark(bookmarkTags, includedTags, excludedTags, isFavorited) { + if (includedTags.length > 0) { + const hasIncludedTag = includedTags.some((includedTag) => bookmarkTags.includes(includedTag)); + if (!hasIncludedTag) { + return { include: false, reason: "missing_included_tag" }; + } + } + if (!isFavorited && excludedTags.length > 0) { + const hasExcludedTag = excludedTags.some((excludedTag) => bookmarkTags.includes(excludedTag)); + if (hasExcludedTag) { + return { include: false, reason: "excluded_tag" }; + } + } + return { include: true }; +} + +// src/formatting-utils.ts +function escapeYaml(str) { + if (!str) return ""; + if (str.includes("\n") || /[:#{}\[\],&*?|<>=!%@`]/.test(str)) { + return `| + ${str.replace(/\n/g, "\n ")}`; + } + if (str.includes('"')) { + return `'${str}'`; + } + if (str.includes("'") || /^[ \t]|[ \t]$/.test(str)) { + return `"${str.replace(/\"/g, '\\"')}"`; + } + return str; +} +function escapeMarkdownPath2(path) { + if (path.includes(" ") || /[<>[\](){}]/.test(path)) { + return `<${path}>`; + } + return path; +} + +// src/hoarder-client.ts +var import_obsidian = require("obsidian"); +var HoarderApiClient = class { + constructor(baseUrl, apiKey, useObsidianRequest = false) { + this.baseUrl = baseUrl.replace(/\/$/, ""); + this.apiKey = apiKey; + this.useObsidianRequest = useObsidianRequest; + } + async makeRequest(endpoint, method = "GET", body, params) { + const url = new URL(`${this.baseUrl}${endpoint}`); + if (params) { + Object.entries(params).forEach(([key, value]) => { + if (value !== void 0 && value !== null) { + url.searchParams.append(key, String(value)); + } + }); + } + const headers = { + "Content-Type": "application/json", + Authorization: `Bearer ${this.apiKey}` + }; + try { + if (this.useObsidianRequest) { + const response = await (0, import_obsidian.requestUrl)({ + url: url.toString(), + method, + headers, + body: body ? JSON.stringify(body) : void 0 + }); + if (response.status >= 400) { + throw new Error(`HTTP ${response.status}: ${response.text || "Unknown error"}`); + } + return response.json; + } else { + const response = await fetch(url.toString(), { + method, + headers, + body: body ? JSON.stringify(body) : void 0 + }); + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`HTTP ${response.status}: ${errorText || "Unknown error"}`); + } + return await response.json(); + } + } catch (error) { + console.error("API request failed:", url.toString(), error); + throw error; + } + } + async getBookmarks(params) { + return this.makeRequest("/bookmarks", "GET", void 0, params); + } + async updateBookmark(bookmarkId, data) { + return this.makeRequest(`/bookmarks/${bookmarkId}`, "PATCH", data); + } + async getBookmarkHighlights(bookmarkId) { + return this.makeRequest( + `/bookmarks/${bookmarkId}/highlights`, + "GET" + ); + } + async getHighlights(params) { + return this.makeRequest("/highlights", "GET", void 0, params); + } + async getAllHighlights() { + const allHighlights = []; + let cursor; + do { + const data = await this.getHighlights({ + limit: 100, + cursor: cursor || void 0 + }); + allHighlights.push(...data.highlights || []); + cursor = data.nextCursor || void 0; + } while (cursor); + return allHighlights; + } + async downloadAsset(assetId) { + const url = `${this.baseUrl}/assets/${assetId}`; + const headers = { + Authorization: `Bearer ${this.apiKey}` + }; + try { + if (this.useObsidianRequest) { + const response = await (0, import_obsidian.requestUrl)({ + url, + method: "GET", + headers + }); + if (response.status >= 400) { + throw new Error(`HTTP ${response.status}: ${response.text || "Unknown error"}`); + } + return response.arrayBuffer; + } else { + const response = await fetch(url, { + method: "GET", + headers + }); + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`HTTP ${response.status}: ${errorText || "Unknown error"}`); + } + return await response.arrayBuffer(); + } + } catch (error) { + console.error("Asset download failed:", url, error); + throw error; + } + } + getAssetUrl(assetId) { + const baseUrl = this.baseUrl.replace(/\/api\/v1\/?$/, ""); + return `${baseUrl}/assets/${assetId}`; + } +}; + +// src/markdown-utils.ts +function extractNotesSection(content) { + const notesMatch = content.match(/## Notes\n\n([\s\S]*?)(?=\n##|\n\[|$)/); + return notesMatch ? notesMatch[1].trim() : null; +} + +// src/message-utils.ts +function buildSyncMessage(stats) { + let message = `Successfully synced ${stats.totalBookmarks} bookmark${stats.totalBookmarks === 1 ? "" : "s"}`; + if (stats.skippedFiles > 0) { + message += ` (skipped ${stats.skippedFiles} existing file${stats.skippedFiles === 1 ? "" : "s"})`; + } + if (stats.updatedInHoarder > 0) { + message += ` and updated ${stats.updatedInHoarder} note${stats.updatedInHoarder === 1 ? "" : "s"} in Karakeep`; + } + if (stats.excludedByTags > 0) { + message += `, excluded ${stats.excludedByTags} bookmark${stats.excludedByTags === 1 ? "" : "s"} by tags`; + } + if (stats.includedByTags > 0 && stats.includedTagsEnabled) { + message += `, included ${stats.includedByTags} bookmark${stats.includedByTags === 1 ? "" : "s"} by tags`; + } + if (stats.skippedNoHighlights > 0) { + message += `, skipped ${stats.skippedNoHighlights} bookmark${stats.skippedNoHighlights === 1 ? "" : "s"} without highlights`; + } + const totalDeleted = stats.deletionResults.deleted + stats.deletionResults.archived + stats.deletionResults.tagged; + const totalArchived = stats.deletionResults.archivedHandled; + if (totalDeleted > 0 || totalArchived > 0) { + if (totalDeleted > 0) { + message += `, processed ${totalDeleted} deleted bookmark${totalDeleted === 1 ? "" : "s"}`; + if (stats.deletionResults.deleted > 0) { + message += ` (${stats.deletionResults.deleted} deleted)`; + } + if (stats.deletionResults.archived > 0) { + message += ` (${stats.deletionResults.archived} archived)`; + } + if (stats.deletionResults.tagged > 0) { + message += ` (${stats.deletionResults.tagged} tagged)`; + } + } + if (totalArchived > 0) { + message += `, handled ${totalArchived} archived bookmark${totalArchived === 1 ? "" : "s"}`; + } + } + return message; +} + +// src/settings.ts +var import_obsidian2 = require("obsidian"); +var DEFAULT_SETTINGS = { + apiKey: "", + apiEndpoint: "https://api.hoarder.app/api/v1", + syncFolder: "Hoarder", + attachmentsFolder: "Hoarder/attachments", + syncIntervalMinutes: 60, + lastSyncTimestamp: 0, + updateExistingFiles: false, + excludeArchived: true, + onlyFavorites: false, + syncNotesToHoarder: true, + syncHighlights: true, + onlyBookmarksWithHighlights: false, + excludedTags: [], + includedTags: [], + downloadAssets: true, + syncDeletions: false, + deletionAction: "delete", + deletionTag: "deleted", + archiveFolder: "Hoarder/deleted", + handleArchivedBookmarks: false, + archivedBookmarkAction: "delete", + archivedBookmarkTag: "archived", + archivedBookmarkFolder: "Hoarder/archived", + useObsidianRequest: false +}; +var FolderSuggest = class extends import_obsidian2.AbstractInputSuggest { + constructor(app, inputEl) { + super(app, inputEl); + this.folders = this.getFolders(); + this.inputEl = inputEl; + } + getSuggestions(inputStr) { + const lowerCaseInputStr = inputStr.toLowerCase(); + return this.folders.filter((folder) => folder.path.toLowerCase().contains(lowerCaseInputStr)); + } + renderSuggestion(folder, el) { + el.setText(folder.path); + } + selectSuggestion(folder) { + const value = folder.path; + this.inputEl.value = value; + this.inputEl.trigger("input"); + this.close(); + } + getFolders() { + const folders = []; + this.app.vault.getAllLoadedFiles().forEach((file) => { + if (file instanceof import_obsidian2.TFolder) { + folders.push(file); + } + }); + return folders.sort((a, b) => a.path.localeCompare(b.path)); + } +}; +var HoarderSettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.updateSyncButton = (isSyncing) => { + if (this.syncButton) { + this.syncButton.setButtonText(isSyncing ? "Syncing..." : "Sync Now"); + this.syncButton.setDisabled(isSyncing); + } + }; + this.plugin = plugin; + } + onunload() { + this.plugin.events.off("sync-state-change", this.updateSyncButton); + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h3", { text: "API Configuration" }); + containerEl.createEl("div", { + text: "Connection settings for your Karakeep instance", + cls: "setting-item-description" + }); + new import_obsidian2.Setting(containerEl).setName("Api key").setDesc("Your Hoarder API key").addText( + (text) => text.setPlaceholder("Enter your API key").setValue(this.plugin.settings.apiKey).onChange(async (value) => { + this.plugin.settings.apiKey = value; + await this.plugin.saveSettings(); + }).inputEl.addClass("hoarder-wide-input") + ); + new import_obsidian2.Setting(containerEl).setName("Api endpoint").setDesc("Hoarder API endpoint URL (default: https://api.karakeep.app/api/v1)").addText( + (text) => text.setPlaceholder("Enter API endpoint").setValue(this.plugin.settings.apiEndpoint).onChange(async (value) => { + this.plugin.settings.apiEndpoint = value; + await this.plugin.saveSettings(); + }).inputEl.addClass("hoarder-wide-input") + ); + new import_obsidian2.Setting(containerEl).setName("Bypass CORS").setDesc( + "Use Obsidian's internal request method to avoid CORS issues. Enable this if you're experiencing connection problems." + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.useObsidianRequest).onChange(async (value) => { + this.plugin.settings.useObsidianRequest = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h3", { text: "File Organization" }); + containerEl.createEl("div", { + text: "Configure where your bookmarks and assets are stored", + cls: "setting-item-description" + }); + new import_obsidian2.Setting(containerEl).setName("Sync folder").setDesc("Folder where bookmarks will be saved").addText((text) => { + text.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.syncFolder).onChange(async (value) => { + this.plugin.settings.syncFolder = value; + await this.plugin.saveSettings(); + }); + text.inputEl.addClass("hoarder-medium-input"); + new FolderSuggest(this.app, text.inputEl); + return text; + }); + new import_obsidian2.Setting(containerEl).setName("Attachments folder").setDesc("Folder where bookmark images will be saved").addText((text) => { + text.setPlaceholder("Example: folder1/attachments").setValue(this.plugin.settings.attachmentsFolder).onChange(async (value) => { + this.plugin.settings.attachmentsFolder = value; + await this.plugin.saveSettings(); + }); + text.inputEl.addClass("hoarder-medium-input"); + new FolderSuggest(this.app, text.inputEl); + return text; + }); + containerEl.createEl("h3", { text: "Sync Behavior" }); + containerEl.createEl("div", { + text: "Control how synchronization works", + cls: "setting-item-description" + }); + new import_obsidian2.Setting(containerEl).setName("Sync interval").setDesc("How often to sync (in minutes)").addText( + (text) => text.setPlaceholder("60").setValue(String(this.plugin.settings.syncIntervalMinutes)).onChange(async (value) => { + const numValue = parseInt(value); + if (!isNaN(numValue) && numValue > 0) { + this.plugin.settings.syncIntervalMinutes = numValue; + await this.plugin.saveSettings(); + this.plugin.startPeriodicSync(); + } + }).inputEl.addClass("hoarder-small-input") + ); + new import_obsidian2.Setting(containerEl).setName("Update existing files").setDesc( + "Whether to update existing bookmark files when remote data changes. When disabled, only new bookmarks will be created." + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.updateExistingFiles).onChange(async (value) => { + this.plugin.settings.updateExistingFiles = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian2.Setting(containerEl).setName("Sync notes to Karakeep").setDesc("Whether to sync notes to Karakeep").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.syncNotesToHoarder).onChange(async (value) => { + this.plugin.settings.syncNotesToHoarder = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian2.Setting(containerEl).setName("Sync highlights").setDesc("Whether to sync highlights from Karakeep into bookmark files").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.syncHighlights).onChange(async (value) => { + this.plugin.settings.syncHighlights = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian2.Setting(containerEl).setName("Download assets").setDesc( + "Download images and other assets locally (if disabled, assets will be embedded using their source URLs)" + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.downloadAssets).onChange(async (value) => { + this.plugin.settings.downloadAssets = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h3", { text: "Sync Filtering" }); + containerEl.createEl("div", { + text: "Control which bookmarks are synchronized", + cls: "setting-item-description" + }); + new import_obsidian2.Setting(containerEl).setName("Exclude archived").setDesc("Exclude archived bookmarks from sync").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.excludeArchived).onChange(async (value) => { + this.plugin.settings.excludeArchived = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian2.Setting(containerEl).setName("Only favorites").setDesc("Only sync favorited bookmarks").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.onlyFavorites).onChange(async (value) => { + this.plugin.settings.onlyFavorites = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian2.Setting(containerEl).setName("Only bookmarks with highlights").setDesc( + "Only sync bookmarks that have highlights (requires 'Sync highlights' to be enabled)" + ).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.onlyBookmarksWithHighlights).onChange(async (value) => { + this.plugin.settings.onlyBookmarksWithHighlights = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian2.Setting(containerEl).setName("Excluded tags").setDesc("Bookmarks with these tags will not be synced (comma-separated), unless favorited").addText( + (text) => text.setPlaceholder("private, secret, draft").setValue(this.plugin.settings.excludedTags.join(", ")).onChange(async (value) => { + this.plugin.settings.excludedTags = value.split(",").map((tag) => tag.trim()).filter((tag) => tag.length > 0); + await this.plugin.saveSettings(); + }).inputEl.addClass("hoarder-wide-input") + ); + new import_obsidian2.Setting(containerEl).setName("Included tags").setDesc("Bookmarks with these tags will be synced (comma-separated)").addText( + (text) => text.setPlaceholder("public, shared").setValue(this.plugin.settings.includedTags.join(", ")).onChange(async (value) => { + this.plugin.settings.includedTags = value.split(",").map((tag) => tag.trim()).filter((tag) => tag.length > 0); + await this.plugin.saveSettings(); + }).inputEl.addClass("hoarder-wide-input") + ); + containerEl.createEl("h3", { text: "Deletion Handling" }); + containerEl.createEl("div", { + text: "Configure what happens when bookmarks are deleted in Karakeep", + cls: "setting-item-description" + }); + const syncDeletionsToggle = new import_obsidian2.Setting(containerEl).setName("Sync deletions").setDesc("Automatically handle bookmarks that are deleted in Karakeep").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.syncDeletions).onChange(async (value) => { + this.plugin.settings.syncDeletions = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); + if (this.plugin.settings.syncDeletions) { + const deletionActionSetting = new import_obsidian2.Setting(containerEl).setName("Deletion action").setDesc("What to do with local files when bookmarks are deleted in Karakeep").addDropdown( + (dropdown) => dropdown.addOption("delete", "Delete file").addOption("archive", "Move to archive folder").addOption("tag", "Add deletion tag").setValue(this.plugin.settings.deletionAction).onChange(async (value) => { + this.plugin.settings.deletionAction = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); + if (this.plugin.settings.deletionAction === "archive") { + new import_obsidian2.Setting(containerEl).setName("Archive folder").setDesc("Folder to move deleted bookmarks to").addText((text) => { + text.setPlaceholder("Example: Hoarder/deleted").setValue(this.plugin.settings.archiveFolder).onChange(async (value) => { + this.plugin.settings.archiveFolder = value; + await this.plugin.saveSettings(); + }); + text.inputEl.addClass("hoarder-medium-input"); + new FolderSuggest(this.app, text.inputEl); + return text; + }); + } + if (this.plugin.settings.deletionAction === "tag") { + new import_obsidian2.Setting(containerEl).setName("Deletion tag").setDesc("Tag to add to files when bookmarks are deleted").addText( + (text) => text.setPlaceholder("deleted").setValue(this.plugin.settings.deletionTag).onChange(async (value) => { + this.plugin.settings.deletionTag = value; + await this.plugin.saveSettings(); + }).inputEl.addClass("hoarder-medium-input") + ); + } + } + containerEl.createEl("h3", { text: "Archive Handling" }); + containerEl.createEl("div", { + text: "Configure what happens when bookmarks are archived in Karakeep", + cls: "setting-item-description" + }); + const handleArchivedToggle = new import_obsidian2.Setting(containerEl).setName("Handle archived bookmarks").setDesc("Separately handle bookmarks that are archived (not deleted) in Karakeep").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.handleArchivedBookmarks).onChange(async (value) => { + this.plugin.settings.handleArchivedBookmarks = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); + if (this.plugin.settings.handleArchivedBookmarks) { + const archivedActionSetting = new import_obsidian2.Setting(containerEl).setName("Archived bookmark action").setDesc("What to do with local files when bookmarks are archived in Karakeep").addDropdown( + (dropdown) => dropdown.addOption("ignore", "Do nothing").addOption("delete", "Delete file").addOption("archive", "Move to archive folder").addOption("tag", "Add archived tag").setValue(this.plugin.settings.archivedBookmarkAction).onChange(async (value) => { + this.plugin.settings.archivedBookmarkAction = value; + await this.plugin.saveSettings(); + this.display(); + }) + ); + if (this.plugin.settings.archivedBookmarkAction === "archive") { + new import_obsidian2.Setting(containerEl).setName("Archived bookmark folder").setDesc("Folder to move archived bookmarks to").addText((text) => { + text.setPlaceholder("Example: Hoarder/archived").setValue(this.plugin.settings.archivedBookmarkFolder).onChange(async (value) => { + this.plugin.settings.archivedBookmarkFolder = value; + await this.plugin.saveSettings(); + }); + text.inputEl.addClass("hoarder-medium-input"); + new FolderSuggest(this.app, text.inputEl); + return text; + }); + } + if (this.plugin.settings.archivedBookmarkAction === "tag") { + new import_obsidian2.Setting(containerEl).setName("Archived bookmark tag").setDesc("Tag to add to files when bookmarks are archived").addText( + (text) => text.setPlaceholder("archived").setValue(this.plugin.settings.archivedBookmarkTag).onChange(async (value) => { + this.plugin.settings.archivedBookmarkTag = value; + await this.plugin.saveSettings(); + }).inputEl.addClass("hoarder-medium-input") + ); + } + } + containerEl.createEl("h3", { text: "Manual Actions & Status" }); + containerEl.createEl("div", { + text: "Manual sync controls and synchronization status", + cls: "setting-item-description" + }); + new import_obsidian2.Setting(containerEl).setName("Manual sync").setDesc("Sync bookmarks now").addButton((button) => { + this.syncButton = button.setButtonText(this.plugin.isSyncing ? "Syncing..." : "Sync Now").setDisabled(this.plugin.isSyncing).onClick(async () => { + const result = await this.plugin.syncBookmarks(); + new import_obsidian2.Notice(result.message); + }); + this.plugin.events.on("sync-state-change", this.updateSyncButton); + return button; + }); + if (this.plugin.settings.lastSyncTimestamp > 0) { + containerEl.createEl("div", { + text: `Last synced: ${new Date(this.plugin.settings.lastSyncTimestamp).toLocaleString()}`, + cls: "setting-item-description" + }); + } + } +}; + +// src/tag-utils.ts +function sanitizeTag(tag) { + let sanitized = tag.trim(); + if (!sanitized) return null; + sanitized = sanitized.replace(/\s+/g, "-"); + sanitized = sanitized.replace(/[^a-zA-Z0-9_\-/]/g, ""); + if (!sanitized) return null; + if (/^\d+$/.test(sanitized)) { + sanitized = "tag-" + sanitized; + } + if (/^[\d\/\-_]+$/.test(sanitized)) { + sanitized = "tag-" + sanitized; + } + return sanitized; +} +function sanitizeTags(tags) { + return tags.map(sanitizeTag).filter((tag) => tag !== null); +} + +// src/main.ts +var HoarderPlugin = class extends import_obsidian3.Plugin { + constructor() { + super(...arguments); + this.isSyncing = false; + this.skippedFiles = 0; + this.events = new import_obsidian3.Events(); + this.modificationTimeout = null; + this.lastSyncedNotes = null; + this.client = null; + } + async onload() { + await this.loadSettings(); + this.initializeClient(); + this.addSettingTab(new HoarderSettingTab(this.app, this)); + this.addCommand({ + id: "trigger-hoarder-sync", + name: "Sync Bookmarks", + callback: async () => { + const result = await this.syncBookmarks(); + new import_obsidian3.Notice(result.message); + } + }); + this.registerEvent( + this.app.vault.on("modify", async (file) => { + if (this.settings.syncNotesToHoarder && file.path.startsWith(this.settings.syncFolder) && file.path.endsWith(".md") && file instanceof import_obsidian3.TFile) { + if (this.modificationTimeout) { + window.clearTimeout(this.modificationTimeout); + } + this.modificationTimeout = window.setTimeout(async () => { + await this.handleFileModification(file); + }, 2e3); + } + }) + ); + this.startPeriodicSync(); + } + onunload() { + if (this.syncIntervalId) { + window.clearInterval(this.syncIntervalId); + } + if (this.modificationTimeout) { + window.clearTimeout(this.modificationTimeout); + } + } + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + async saveSettings() { + await this.saveData(this.settings); + this.initializeClient(); + } + startPeriodicSync() { + if (this.syncIntervalId) { + window.clearInterval(this.syncIntervalId); + } + const interval = this.settings.syncIntervalMinutes * 60 * 1e3; + this.syncBookmarks(); + this.syncIntervalId = window.setInterval(() => { + this.syncBookmarks(); + }, interval); + } + async fetchBookmarks(cursor, limit = 100) { + if (!this.client) { + throw new Error("Client not initialized"); + } + return await this.client.getBookmarks({ + limit, + cursor: cursor || void 0, + archived: this.settings.excludeArchived ? false : void 0, + favourited: this.settings.onlyFavorites ? true : void 0 + }); + } + async fetchAllBookmarks(includeArchived = false) { + if (!this.client) { + throw new Error("Client not initialized"); + } + const allBookmarks = []; + let cursor; + do { + const data = await this.client.getBookmarks({ + limit: 100, + cursor: cursor || void 0, + archived: includeArchived ? void 0 : false, + favourited: this.settings.onlyFavorites ? true : void 0 + }); + allBookmarks.push(...data.bookmarks || []); + cursor = data.nextCursor || void 0; + } while (cursor); + return allBookmarks; + } + async extractNotesFromFile(filePath) { + var _a, _b; + try { + const file = this.app.vault.getAbstractFileByPath(filePath); + if (!(file instanceof import_obsidian3.TFile)) { + return { currentNotes: null, originalNotes: null }; + } + const content = await this.app.vault.adapter.read(filePath); + const currentNotes = extractNotesSection(content); + const metadata = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter; + const originalNotes = (_b = metadata == null ? void 0 : metadata.original_note) != null ? _b : null; + return { currentNotes, originalNotes }; + } catch (error) { + console.error("Error reading file:", error); + return { currentNotes: null, originalNotes: null }; + } + } + async updateBookmarkInHoarder(bookmarkId, note) { + try { + if (!this.client) { + throw new Error("Client not initialized"); + } + await this.client.updateBookmark(bookmarkId, { note }); + return true; + } catch (error) { + console.error("Error updating bookmark in Hoarder:", error); + return false; + } + } + setSyncing(value) { + this.isSyncing = value; + this.events.trigger("sync-state-change", value); + } + async getLocalBookmarkFiles() { + var _a; + const bookmarkFiles = /* @__PURE__ */ new Map(); + const folderPath = this.settings.syncFolder; + if (!await this.app.vault.adapter.exists(folderPath)) { + return bookmarkFiles; + } + const files = this.app.vault.getMarkdownFiles(); + for (const file of files) { + if (file.path.startsWith(folderPath) && file.path.endsWith(".md")) { + const metadata = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter; + const bookmarkId = metadata == null ? void 0 : metadata.bookmark_id; + if (bookmarkId) { + bookmarkFiles.set(bookmarkId, file.path); + } + } + } + return bookmarkFiles; + } + async handleDeletedAndArchivedBookmarks(localBookmarkFiles, activeBookmarkIds, archivedBookmarkIds) { + const deletionSettings = { + syncDeletions: this.settings.syncDeletions, + deletionAction: this.settings.deletionAction, + handleArchivedBookmarks: this.settings.handleArchivedBookmarks, + archivedBookmarkAction: this.settings.archivedBookmarkAction + }; + const localBookmarkIds = Array.from(localBookmarkFiles.keys()); + const instructions = determineDeletionActions( + localBookmarkIds, + activeBookmarkIds, + archivedBookmarkIds, + deletionSettings + ); + for (const instruction of instructions) { + const filePath = localBookmarkFiles.get(instruction.bookmarkId); + if (!filePath) continue; + const file = this.app.vault.getAbstractFileByPath(filePath); + if (!(file instanceof import_obsidian3.TFile)) continue; + try { + switch (instruction.action) { + case "delete": + await this.app.vault.delete(file); + break; + case "archive": + const archiveFolder = instruction.reason === "deleted" ? this.settings.archiveFolder : this.settings.archivedBookmarkFolder; + await this.moveToArchiveFolder(file, archiveFolder); + break; + case "tag": + const tag = instruction.reason === "deleted" ? this.settings.deletionTag : this.settings.archivedBookmarkTag; + await this.addDeletionTag(file, tag); + break; + } + } catch (error) { + console.error(`Error handling bookmark ${instruction.bookmarkId}:`, error); + } + } + return countDeletionResults(instructions); + } + async moveToArchiveFolder(file, archiveFolder) { + if (!archiveFolder) { + throw new Error("Archive folder not configured"); + } + if (!await this.app.vault.adapter.exists(archiveFolder)) { + await this.app.vault.createFolder(archiveFolder); + } + const fileName = file.name; + const newPath = `${archiveFolder}/${fileName}`; + let finalPath = newPath; + let counter = 1; + while (await this.app.vault.adapter.exists(finalPath)) { + const nameWithoutExt = fileName.replace(/\.md$/, ""); + finalPath = `${archiveFolder}/${nameWithoutExt}-${counter}.md`; + counter++; + } + await this.app.fileManager.renameFile(file, finalPath); + } + async addDeletionTag(file, tag) { + if (!tag) { + throw new Error("Tag not configured"); + } + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + if (!frontmatter.tags) { + frontmatter.tags = []; + } + if (typeof frontmatter.tags === "string") { + frontmatter.tags = [frontmatter.tags]; + } + if (!frontmatter.tags.includes(tag)) { + frontmatter.tags.push(tag); + } + }); + } + async syncBookmarks() { + var _a; + if (this.isSyncing) { + console.error("[Hoarder] Sync already in progress"); + return { success: false, message: "Sync already in progress" }; + } + if (!this.settings.apiKey) { + console.log("[Hoarder] API key not configured"); + return { success: false, message: "Hoarder API key not configured" }; + } + console.log("[Hoarder] Starting sync..."); + console.log( + `[Hoarder] Settings: syncNotesToHoarder=${this.settings.syncNotesToHoarder}, updateExistingFiles=${this.settings.updateExistingFiles}` + ); + this.setSyncing(true); + let totalBookmarks = 0; + this.skippedFiles = 0; + let updatedInHoarder = 0; + let excludedByTags = 0; + let includedByTags = 0; + let totalBookmarksProcessed = 0; + let skippedNoHighlights = 0; + try { + const folderPath = this.settings.syncFolder; + if (!await this.app.vault.adapter.exists(folderPath)) { + await this.app.vault.createFolder(folderPath); + } + const localBookmarkFiles = await this.getLocalBookmarkFiles(); + const activeBookmarks = await this.fetchAllBookmarks(false); + const allBookmarks = await this.fetchAllBookmarks(true); + const activeBookmarkIds = new Set(activeBookmarks.map((b) => b.id)); + const allBookmarkIds = new Set(allBookmarks.map((b) => b.id)); + const archivedBookmarkIds = new Set( + allBookmarks.filter((b) => b.archived && !activeBookmarkIds.has(b.id)).map((b) => b.id) + ); + let highlightsByBookmarkId = /* @__PURE__ */ new Map(); + let bookmarkIdsWithHighlights = /* @__PURE__ */ new Set(); + if ((this.settings.syncHighlights || this.settings.onlyBookmarksWithHighlights) && this.client) { + try { + const allHighlights = await this.client.getAllHighlights(); + for (const highlight of allHighlights) { + if (!highlightsByBookmarkId.has(highlight.bookmarkId)) { + highlightsByBookmarkId.set(highlight.bookmarkId, []); + } + highlightsByBookmarkId.get(highlight.bookmarkId).push(highlight); + bookmarkIdsWithHighlights.add(highlight.bookmarkId); + } + } catch (error) { + console.error("Error fetching highlights in bulk:", error); + } + } + let cursor; + do { + const result = await this.fetchBookmarks(cursor); + const bookmarks = result.bookmarks || []; + cursor = result.nextCursor || void 0; + totalBookmarksProcessed += bookmarks.length; + for (const bookmark of bookmarks) { + if (this.settings.onlyBookmarksWithHighlights && !bookmarkIdsWithHighlights.has(bookmark.id)) { + skippedNoHighlights++; + continue; + } + const bookmarkTags = bookmark.tags.map((tag) => tag.name.toLowerCase()); + const filterResult = shouldIncludeBookmark( + bookmarkTags, + this.settings.includedTags.map((t) => t.toLowerCase()), + this.settings.excludedTags.map((t) => t.toLowerCase()), + bookmark.favourited + ); + if (!filterResult.include) { + excludedByTags++; + continue; + } + if (this.settings.includedTags.length > 0) { + includedByTags++; + } + const title = getBookmarkTitle(bookmark); + const fileName = `${folderPath}/${sanitizeFileName(title, bookmark.createdAt)}.md`; + const highlights = highlightsByBookmarkId.get(bookmark.id) || []; + const fileExists = await this.app.vault.adapter.exists(fileName); + if (fileExists) { + const file = this.app.vault.getAbstractFileByPath(fileName); + if (file instanceof import_obsidian3.TFile) { + const metadata = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter; + const storedModifiedTime = (metadata == null ? void 0 : metadata.modified) ? new Date(metadata.modified).getTime() : 0; + const bookmarkModifiedTime = bookmark.modifiedAt ? new Date(bookmark.modifiedAt).getTime() : new Date(bookmark.createdAt).getTime(); + let hasNewHighlights = false; + if (this.settings.syncHighlights && highlights.length > 0) { + const newestHighlightTime = Math.max( + ...highlights.map((h) => new Date(h.createdAt).getTime()) + ); + hasNewHighlights = !storedModifiedTime || newestHighlightTime > storedModifiedTime; + } + if (!this.settings.updateExistingFiles) { + this.skippedFiles++; + continue; + } + if (this.settings.syncNotesToHoarder) { + const { currentNotes, originalNotes } = await this.extractNotesFromFile(fileName); + const remoteNotes = bookmark.note || ""; + if (originalNotes === null && currentNotes !== null) { + console.debug(`[Hoarder] original_note missing for ${fileName}`); + if (currentNotes !== remoteNotes) { + console.log(`[Hoarder] Local notes differ from remote, syncing to Hoarder`); + const updated = await this.updateBookmarkInHoarder(bookmark.id, currentNotes); + if (updated) { + updatedInHoarder++; + bookmark.note = currentNotes; + this.lastSyncedNotes = currentNotes; + console.debug( + `[Hoarder] Initializing original_note to synced value for ${fileName}` + ); + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + frontmatter["original_note"] = currentNotes; + }); + } + } else { + console.debug( + `[Hoarder] Notes match remote, skipping original_note initialization to preserve mtime` + ); + } + } else if (currentNotes !== null && originalNotes !== null && currentNotes !== originalNotes && currentNotes !== remoteNotes) { + console.log(`[Hoarder] Local notes changed for ${fileName}, syncing to Hoarder`); + const updated = await this.updateBookmarkInHoarder(bookmark.id, currentNotes); + if (updated) { + updatedInHoarder++; + bookmark.note = currentNotes; + this.lastSyncedNotes = currentNotes; + } + } + } + const newContent = await this.formatBookmarkAsMarkdown(bookmark, title, highlights); + const existingContent = await this.app.vault.adapter.read(fileName); + if (existingContent !== newContent) { + await this.app.vault.adapter.write(fileName, newContent); + totalBookmarks++; + } else { + this.skippedFiles++; + } + } + } else { + const content = await this.formatBookmarkAsMarkdown(bookmark, title, highlights); + await this.app.vault.create(fileName, content); + totalBookmarks++; + } + } + } while (cursor); + const deletionResults = await this.handleDeletedAndArchivedBookmarks( + localBookmarkFiles, + activeBookmarkIds, + archivedBookmarkIds + ); + this.settings.lastSyncTimestamp = Date.now(); + await this.saveSettings(); + const stats = { + totalBookmarks, + skippedFiles: this.skippedFiles, + updatedInHoarder, + excludedByTags, + includedByTags, + includedTagsEnabled: this.settings.includedTags.length > 0, + skippedNoHighlights, + deletionResults + }; + const message = buildSyncMessage(stats); + return { + success: true, + message + }; + } catch (error) { + console.error("Error syncing bookmarks:", error); + return { + success: false, + message: `Error syncing: ${error.message}` + }; + } finally { + this.setSyncing(false); + this.skippedFiles = 0; + } + } + async formatBookmarkAsMarkdown(bookmark, title, highlights) { + const url = bookmark.content.type === "link" ? bookmark.content.url : bookmark.content.sourceUrl; + const description = bookmark.content.type === "link" ? bookmark.content.description : bookmark.content.text; + const rawTags = bookmark.tags.map((tag) => tag.name); + const tags = sanitizeTags(rawTags); + const { content: assetContent, frontmatter: assetsFm } = await processBookmarkAssets( + this.app, + bookmark, + title, + this.client, + this.settings + ); + let assetsYaml = ""; + if (assetsFm) { + const lines = []; + if (assetsFm.image) lines.push(`image: ${assetsFm.image}`); + if (assetsFm.banner) lines.push(`banner: ${assetsFm.banner}`); + if (assetsFm.screenshot) lines.push(`screenshot: ${assetsFm.screenshot}`); + if (assetsFm.full_page_archive) + lines.push(`full_page_archive: ${assetsFm.full_page_archive}`); + if (assetsFm.video) lines.push(`video: ${assetsFm.video}`); + if (assetsFm.additional && assetsFm.additional.length > 0) { + lines.push("additional:"); + for (const link of assetsFm.additional) { + lines.push(` - ${link}`); + } + } + assetsYaml = lines.join("\n") + "\n"; + } + const tagsYaml = tags.length > 0 ? `tags: + - ${tags.join("\n - ")} +` : ""; + let content = `--- +bookmark_id: "${bookmark.id}" +url: ${escapeYaml(url)} +title: ${escapeYaml(title)} +date: ${new Date(bookmark.createdAt).toISOString()} +${bookmark.modifiedAt ? `modified: ${new Date(bookmark.modifiedAt).toISOString()} +` : ""}${tagsYaml}note: ${escapeYaml(bookmark.note)} +original_note: ${escapeYaml(bookmark.note)} +summary: ${escapeYaml(bookmark.summary)} +${assetsYaml} +--- + +# ${title} +`; + content += assetContent; + if (bookmark.summary) { + content += ` +## Summary + +${bookmark.summary} +`; + } + if (description) { + content += ` +## Description + +${description} +`; + } + if (highlights && highlights.length > 0 && this.settings.syncHighlights) { + content += ` +## Highlights + +`; + const sortedHighlights = highlights.sort((a, b) => a.startOffset - b.startOffset); + for (const highlight of sortedHighlights) { + const date = new Date(highlight.createdAt).toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric" + }); + content += `> [!karakeep-${highlight.color}] ${date} +`; + const highlightLines = highlight.text.split("\n"); + for (const line of highlightLines) { + content += `> ${line} +`; + } + if (highlight.note && highlight.note.trim()) { + content += `> +`; + const noteLines = highlight.note.split("\n"); + for (let i = 0; i < noteLines.length; i++) { + if (i === 0) { + content += `> *Note: ${noteLines[i]}* +`; + } else { + content += `> *${noteLines[i]}* +`; + } + } + } + content += ` +`; + } + } + content += ` +## Notes + +${bookmark.note || ""} +`; + if (url && bookmark.content.type !== "asset") { + content += ` +[Visit Link](${escapeMarkdownPath2(url)}) +`; + } + const hoarderUrl = `${this.settings.apiEndpoint.replace("/api/v1", "/dashboard/preview")}/${bookmark.id}`; + content += ` +[View in Hoarder](${escapeMarkdownPath2(hoarderUrl)})`; + return content; + } + async handleFileModification(file) { + var _a; + try { + console.debug(`[Hoarder] File modified: ${file.path}`); + const { currentNotes, originalNotes } = await this.extractNotesFromFile(file.path); + const currentNotesStr = currentNotes || ""; + const originalNotesStr = originalNotes || ""; + console.log( + `[Hoarder] Current notes length: ${currentNotesStr.length}, Original notes length: ${originalNotesStr.length}` + ); + if (currentNotesStr === this.lastSyncedNotes) { + console.log("[Hoarder] Skipping - notes match last synced version"); + return; + } + const metadata = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter; + const bookmarkId = metadata == null ? void 0 : metadata.bookmark_id; + if (!bookmarkId) { + console.log("[Hoarder] No bookmark_id found in frontmatter"); + return; + } + console.log(`[Hoarder] Bookmark ID: ${bookmarkId}`); + if (originalNotes === null) { + const frontmatterNote = (metadata == null ? void 0 : metadata.note) || ""; + console.log(`[Hoarder] original_note is null for ${file.path}`); + if (currentNotesStr !== frontmatterNote) { + console.log("[Hoarder] Notes have changed from frontmatter note"); + const success = await this.updateBookmarkInHoarder(bookmarkId, currentNotesStr); + if (success) { + this.lastSyncedNotes = currentNotesStr; + setTimeout(async () => { + try { + const { currentNotes: latestNotes, originalNotes: currentOriginalNotes } = await this.extractNotesFromFile(file.path); + if (latestNotes === currentNotesStr && currentOriginalNotes !== currentNotesStr) { + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + frontmatter["original_note"] = currentNotesStr; + }); + console.debug("[Hoarder] Initialized and updated original_note in frontmatter"); + } else if (currentOriginalNotes === currentNotesStr) { + console.debug( + "[Hoarder] original_note already initialized, skipping frontmatter update" + ); + } + } catch (error) { + console.error("[Hoarder] Error updating frontmatter:", error); + } + }, 5e3); + new import_obsidian3.Notice("Notes synced to Hoarder"); + } else { + console.error("[Hoarder] Failed to update bookmark in Hoarder"); + } + } else { + console.debug( + "[Hoarder] Notes match frontmatter, skipping original_note initialization to preserve mtime" + ); + } + return; + } + if (currentNotesStr !== originalNotesStr) { + console.log("[Hoarder] Notes have changed, syncing to Hoarder"); + const updated = await this.updateBookmarkInHoarder(bookmarkId, currentNotesStr); + if (updated) { + this.lastSyncedNotes = currentNotesStr; + console.log("[Hoarder] Successfully synced notes to Hoarder"); + setTimeout(async () => { + try { + const { currentNotes: latestNotes, originalNotes: currentOriginalNotes } = await this.extractNotesFromFile(file.path); + if (latestNotes === currentNotesStr && currentOriginalNotes !== currentNotesStr) { + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + frontmatter["original_note"] = currentNotesStr; + }); + console.debug("[Hoarder] Updated original_note in frontmatter"); + } else if (latestNotes !== currentNotesStr) { + console.debug("[Hoarder] Notes changed again, skipping frontmatter update"); + } else { + console.debug( + "[Hoarder] original_note already up to date, skipping frontmatter update" + ); + } + } catch (error) { + console.error("[Hoarder] Error updating frontmatter:", error); + } + }, 5e3); + new import_obsidian3.Notice("Notes synced to Hoarder"); + } else { + console.error("[Hoarder] Failed to update bookmark in Hoarder"); + new import_obsidian3.Notice("Failed to sync notes to Hoarder"); + } + } else { + console.log("[Hoarder] Notes unchanged, no sync needed"); + } + } catch (error) { + console.error("[Hoarder] Error handling file modification:", error); + new import_obsidian3.Notice("Failed to sync notes to Hoarder"); + } + } + initializeClient() { + if (!this.settings.apiKey || !this.settings.apiEndpoint) { + this.client = null; + } else { + this.client = new HoarderApiClient( + this.settings.apiEndpoint, + this.settings.apiKey, + this.settings.useObsidianRequest + ); + } + } +}; + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/hoarder-sync/manifest.json b/.obsidian/plugins/hoarder-sync/manifest.json new file mode 100644 index 0000000..b2e5272 --- /dev/null +++ b/.obsidian/plugins/hoarder-sync/manifest.json @@ -0,0 +1,9 @@ +{ + "id": "hoarder-sync", + "name": "Hoarder Sync", + "version": "1.12.0", + "minAppVersion": "1.7.0", + "description": "Sync your Hoarder bookmarks", + "author": "Jordan Hofker", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/hoarder-sync/styles.css b/.obsidian/plugins/hoarder-sync/styles.css new file mode 100644 index 0000000..3decc39 --- /dev/null +++ b/.obsidian/plugins/hoarder-sync/styles.css @@ -0,0 +1,74 @@ +.hoarder-wide-input { + width: var(--size-4-100); +} + +.hoarder-medium-input { + width: var(--size-4-75); +} + +.hoarder-small-input { + width: var(--size-4-50); +} + +.hoarder-suggestion-dropdown { + background: var(--background-primary); + border: 1px solid var(--background-modifier-border); + border-radius: var(--size-4-1); + box-shadow: 0 var(--size-2-1) var(--size-4-2) rgba(0, 0, 0, 0.1); + max-height: var(--size-4-50); + overflow-y: auto; + width: var(--size-4-50); + position: absolute; + z-index: 1000; + display: block; + opacity: 1; + transition: opacity 150ms ease-in-out; +} + +.hoarder-suggestion-dropdown-hidden { + display: none; + opacity: 0; +} + +.hoarder-suggestion-item { + padding: var(--size-4-2) var(--size-4-3); + cursor: var(--cursor); + transition: background-color 100ms ease-in-out; +} + +.hoarder-suggestion-item:hover { + background: var(--background-modifier-hover); +} + +.setting-item-description { + margin-bottom: var(--size-4-4); +} + +/* Karakeep Highlight Callouts */ +.callout[data-callout="karakeep-yellow"] { + --callout-color: 254, 240, 138; + --callout-icon: lucide-highlighter; +} + +.callout[data-callout="karakeep-red"] { + --callout-color: 254, 202, 202; + --callout-icon: lucide-highlighter; +} + +.callout[data-callout="karakeep-green"] { + --callout-color: 187, 247, 208; + --callout-icon: lucide-highlighter; +} + +.callout[data-callout="karakeep-blue"] { + --callout-color: 191, 219, 254; + --callout-icon: lucide-highlighter; +} + +.callout[data-callout^="karakeep-"] { + margin: var(--size-4-2) 0; +} + +.callout[data-callout^="karakeep-"] .callout-content { + padding: var(--size-4-2) var(--size-4-3); +} diff --git a/.obsidian/themes/Tokyo Night/manifest.json b/.obsidian/themes/Tokyo Night/manifest.json new file mode 100644 index 0000000..a39d266 --- /dev/null +++ b/.obsidian/themes/Tokyo Night/manifest.json @@ -0,0 +1,6 @@ +{ + "name": "Tokyo Night", + "version": "1.1.6", + "minAppVersion": "0.0.1", + "author": "tcmmichaelb139" +} diff --git a/.obsidian/themes/Tokyo Night/theme.css b/.obsidian/themes/Tokyo Night/theme.css new file mode 100644 index 0000000..d57dc8f --- /dev/null +++ b/.obsidian/themes/Tokyo Night/theme.css @@ -0,0 +1,2129 @@ +/*Fonts*/ +:root { + --default-font: '"JetBrains Mono", monospace, "Inter", sans-serif'; + --font-monospace: '"JetBrains Mono", monospace, "Source Code Pro", monospace'; +} + +.theme-dark { + color-scheme: dark; + /* --accent-h: 261; /* magenta */ + /* --accent-s: 85%; */ + /* --accent-l: 79%; */ + /* cyan */ + --accent-h: 202; + --accent-s: 100%; + --accent-l: 75%; + + --bg_dark2_x: 18, 18, 24; + --bg_dark2: rgb(var(--bg_dark2_x)); + --bg_dark_x: 22, 22, 30; + --bg_dark: rgb(var(--bg_dark_x)); + --bg_x: 26, 27, 38; + --bg: rgb(var(--bg_x)); + --bg_highlight_x: 41, 46, 66; + --bg_highlight: rgb(var(--bg_highlight_x)); + --bg_highlight_dark_x: 36, 40, 59; + --bg_highlight_dark: rgb(var(--bg_highlight_dark_x)); + --terminal_black_x: 65, 72, 104; + --terminal_black: rgb(var(--terminal_black_x)); + --fg_x: 192, 202, 245; + --fg: rgb(var(--fg_x)); + --fg_dark_x: 169, 177, 214; + --fg_dark: rgb(var(--fg_dark_x)); + --comment_x: 86, 95, 137; + --comment: rgb(var(--comment_x)); + --blue0_x: 61, 89, 161; + --blue0: rgb(var(--blue0_x)); + --blue_x: 122, 162, 247; + --blue: rgb(var(--blue_x)); + --cyan_hsl: 202 100% 75%; + --cyan_x: 125, 207, 255; + --cyan: rgb(var(--cyan_x)); + --magent_hsl: 261 85% 79%; + --magenta_x: 187, 154, 247; + --magenta: rgb(var(--magenta_x)); + --pink_hsl: 331 100% 43%; + --pink_x: 217, 0, 105; + --pink: rgb(var(--pink_x)); + --orange_x: 255, 158, 100; + --orange: rgb(var(--orange_x)); + --yellow_x: 224, 175, 104; + --yellow: rgb(var(--yellow_x)); + --green_x: 158, 206, 106; + --green: rgb(var(--green_x)); + --teal_x: 26, 188, 156; + --teal: rgb(var(--teal_x)); + --red_x: 255, 117, 127; + --red: rgb(var(--red_x)); + --red1_x: 219, 75, 75; + --red1: rgb(var(--red1_x)); + --unknown: #ffffff; + + --link-external-filter: invert(35%) sepia(28%) saturate(681%) hue-rotate(192deg) brightness(94%) contrast(85%); +} + +.theme-light { + /* --accent-h: 261; /* magenta */ + /* --accent-s: 24%; */ + /* --accent-l: 38%; */ + /* cyan */ + --accent-h: 202; + --accent-s: 86%; + --accent-l: 43%; + + --bg_dark2_x: 188, 189, 194; + --bg_dark2: rgb(var(--bg_dark2_x)); + --bg_dark_x: 203, 204, 209; + --bg_dark: rgb(var(--bg_dark_x)); + --bg_x: 213, 214, 219; + --bg: rgb(var(--bg_x)); + --bg_highlight_x: 220, 222, 226; + --bg_highlight: rgb(var(--bg_highlight_x)); + --bg_highlight_dark_x: 195, 197, 201; + --bg_highlight_dark: rgb(var(--bg_highlight_dark_x)); + --terminal_black_x: 15, 15, 20; + --terminal_black: rgb(var(--terminal_black_x)); + --fg_x: 52, 59, 88; + --fg: rgb(var(--fg_x)); + --fg_dark_x: 39, 46, 75; + --fg_dark: rgb(var(--fg_dark_x)); + --comment_x: 150, 153, 163; + --comment: rgb(var(--comment_x)); + --blue0_x: 39, 71, 125; + --blue0: rgb(var(--blue0_x)); + --blue_x: 52, 84, 138; + --blue: rgb(var(--blue_x)); + --cyan_x: 15, 75, 110; + --cyan: rgb(var(--cyan_x)); + --magent_hsl: 261 24% 38%; + --magenta_x: 90, 74, 120; + --magenta: rgb(var(--magenta_x)); + --pink_hsl: 286 24% 38%; + --pink_x: 109, 74, 120; + --pink: rgb(var(--pink_x)); + --orange_x: 150, 80, 39; + --orange: rgb(var(--orange_x)); + --yellow_x: 143, 94, 21; + --yellow: rgb(var(--yellow_x)); + --green_x: 51, 99, 92; + --green: rgb(var(--green_x)); + --teal_x: 22, 103, 117; + --teal: rgb(var(--teal_x)); + --red_x: 140, 67, 81; + --red: rgb(var(--red_x)); + --red1_x: 115, 42, 56; + --red1: rgb(var(--red1_x)); + --unknown: #000000; + + --link-external-filter: invert(62%) sepia(9%) saturate(266%) hue-rotate(189deg) brightness(97%) contrast(88%); +} + +.theme-dark, +.theme-light { + --color_red_rgb: var(--red_x); + --color-red: var(--red); + --color_purple_rgb: var(--magenta_x); + --color-purple: var(--magenta); + --color_green_rgb: var(--green_x); + --color-green: var(--green); + --color_cyan_rgb: var(--cyan_x); + --color-cyan: var(--cyan); + --color_blue_rgb: var(--blue_x); + --color-blue: var(--blue); + --color_yellow_rgb: var(--yellow_x); + --color-yellow: var(--yellow); + --color_orange_rgb: var(--orange_x); + --color-orange: var(--orange); + --color_pink_rgb: var(--magenta_x); + --color-pink: var(--magenta); + + --background-primary: var(--bg); + --background-primary-alt: var(--bg); + --background-secondary: var(--bg_dark); + --background-secondary-alt: var(--bg_dark); + + --background-modifier-border: var(--bg_highlight); + --background-modifier-border-focus: var(--bg_highlight); + --background-modifier-border-hover: var(--bg_highlight); + --background-modifier-form-field: var(--bg_dark); + --background-modifier-form-field-highlighted: var(--bg_dark); + --background-modifier-box-shadow: rgba(0, 0, 0, 0.3); + --background-modifier-success: var(--green); + --background-modifier-error: var(--red1); + --background-modifier-error-hover: var(--red); + --background-modifier-cover: rgba(var(--bg_dark_x), 0.8); + --background-modifier-hover: var(--bg_highlight); + --background-modifier-message: rgba(var(--bg_highlight_x), 0.9); + --background-modifier-active-hover: var(--bg_highlight); + + --text-normal: var(--fg); + --text-faint: var(--comment); + --text-muted: var(--fg_dark); + --text-error: var(--red); + --text-accent: var(--magenta); + --text-accent-hover: var(--cyan); + --text-error: var(--red1); + --text-error-hover: var(--red); + --text-selection: var(--unknown); + --text-on-accent: var(--bg); + --text-highlight-bg: rgba(var(--orange_x), 0.25); + --text-selection: rgba(var(--blue0_x), 0.6); + --bold-color: var(--cyan); + --italic-color: var(--cyan); + + --interactive-normal: var(--bg_dark); + --interactive-hover: var(--bg); + --interactive-success: var(--green); + --interactive-accent: hsl(var(--accent-h), var(--accent-s), var(--accent-l)); + --interactive-accent-hover: var(--blue); + + --scrollbar-bg: var(--bg_dark2); + --scrollbar-thumb-bg: var(--comment); + --scrollbar-active-thumb-bg: var(--comment); + --scrollbar-width: 7px; + + --h1-color: var(--red); + --h2-color: var(--yellow); + --h3-color: var(--green); + --h4-color: var(--cyan); + --h5-color: var(--blue); + --h6-color: var(--magenta); + + --border-width: 2px; + + --tag-color: var(--magenta); + --tag-background: rgba(var(--magenta_x), 0.15); + --tag-color-hover: var(--cyan); + --tag-background-hover: rgba(var(--cyan_x), 0.15); + + --link-color: var(--magenta); + --link-color-hover: var(--cyan); + --link-external-color: var(--magenta); + --link-external-color-hover: var(--cyan); + + --checkbox-radius: var(--radius-l); + --checkbox-color: var(--green); + --checkbox-color-hover: var(--green); + --checkbox-marker-color: var(--bg); + --checkbox-border-color: var(--comment); + --checkbox-border-color-hover: var(--comment); + + --table-header-background: var(--bg_dark2); + --table-header-background-hover: var(--bg_dark2); + + --flashing-background: rgba(var(--blue0_x), 0.3); + + --code-normal: var(--fg); + --code-background: var(--bg_highlight_dark); + + --mermaid-note: var(--blue0); + --mermaid-actor: var(--fg_dark); + --mermaid-loopline: var(--blue); + + --blockquote-background-color: var(--bg_dark); + --callout-default: var(--blue_x); + --callout-info: var(--blue_x); + --callout-summary: var(--cyan_x); + --callout-tip: var(--cyan_x); + --callout-todo: var(--cyan_x); + --callout-bug: var(--red_x); + --callout-error: var(--red1_x); + --callout-fail: var(--red1_x); + --callout-example: var(--magenta_x); + --callout-important: var(--green_x); + --callout-success: var(--teal_x); + --callout-question: var(--yellow_x); + --callout-warning: var(--orange_x); + --callout-quote: var(--fg_dark_x); + + --icon-color-hover: var(--blue); + --icon-color-focused: var(--magenta); + --icon-color-active: var(--magenta); + + --nav-item-color-hover: var(--fg); + --nav-item-background-hover: var(--bg_highlight); + --nav-item-color-active: var(--red); + --nav-item-background-active: var(--bg_highlight); + --nav-file-tag: rgba(var(--yellow_x), 0.9); + --nav-indentation-guide-color: var(--bg_highlight); + + --indentation-guide-color: var(--comment); + --indentation-guide-color-active: var(--comment); + + --graph-line: var(--comment); + --graph-node: var(--fg); + --graph-node-tag: var(--orange); + --graph-node-attachment: var(--blue); + + --tab-text-color-focused-active: rgba(var(--red_x), 0.8); + --tab-text-color-focused-active-current: var(--red); + + --modal-border-color: var(--bg_highlight); + --prompt-border-color: var(--bg_highlight); + --slider-track-background: var(--bg_highlight); + + --embed-background: var(--bg_dark); + --embed-padding: 1.5rem 1.5rem 0.5rem; + + --canvas-color: var(--bg_highlight_x); + + --toggle-thumb-color: var(--bg); + + --image-radius: 0px; + + --date-color: var(--blue); + --date-background-color: var(--bg_highlight); +} + + +/* Headings (credit: https://github.com/Akifyss/obsidian-border)*/ + +body:not(.heading-indicator-off) .markdown-rendered>:is(h1, h2, h3, h4, h5, h6), +body:not(.heading-indicator-off) .markdown-preview-sizer>div>:is(h1, h2, h3, h4, h5, h6) { + position: relative; +} + +body.h1-divider-on :is(.markdown-preview-sizer>div>h1, .markdown-rendered>h1, .HyperMD-header-1)::after { + content: ""; + position: absolute; + height: 2px; + width: 100%; + right: 0px; + opacity: 0.5; + bottom: 0; + background-image: linear-gradient(to left, var(--h1-color) 30%, transparent 70%); +} + +body.h2-divider-on :is(.markdown-preview-sizer>div>h2, .markdown-rendered>h2, .HyperMD-header-2)::after { + content: ""; + position: absolute; + height: 2px; + width: 100%; + right: 0px; + opacity: 0.5; + bottom: 0; + background-image: linear-gradient(to left, var(--h2-color) 30%, transparent 70%); +} + +body.h3-divider-on :is(.markdown-preview-sizer>div>h3, .markdown-rendered>h3, .HyperMD-header-3)::after { + content: ""; + position: absolute; + height: 2px; + width: 100%; + right: 0px; + opacity: 0.5; + bottom: 0; + background-image: linear-gradient(to left, var(--h3-color) 30%, transparent 70%); +} + +body.h4-divider-on :is(.markdown-preview-sizer>div>h4, .markdown-rendered>h4, .HyperMD-header-4)::after { + content: ""; + position: absolute; + height: 2px; + width: 100%; + right: 0px; + opacity: 0.5; + bottom: 0; + background-image: linear-gradient(to left, var(--h4-color) 30%, transparent 70%); +} + +body.h5-divider-on :is(.markdown-preview-sizer>div>h5, .markdown-rendered>h5, .HyperMD-header-5)::after { + content: ""; + position: absolute; + height: 2px; + width: 100%; + right: 0px; + opacity: 0.5; + bottom: 0; + background-image: linear-gradient(to left, var(--h5-color) 30%, transparent 70%); +} + +body.h6-divider-on :is(.markdown-preview-sizer>div>h6, .markdown-rendered>h6, .HyperMD-header-6)::after { + content: ""; + position: absolute; + height: 2px; + width: 100%; + right: 0px; + opacity: 0.5; + bottom: 0; + background-image: linear-gradient(to left, var(--h6-color) 30%, transparent 70%); +} + +/* mobile */ +.is-mobile .suggestion-item.is-selected { + background-color: var(--bg_highlight); +} + +/* scrollbars */ +::-webkit-scrollbar { + width: var(--scrollbar-width); + background-color: transparent !important; +} + +:hover::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-thumb-bg) !important; +} + +::-webkit-scrollbar-thumb:hover, +::-webkit-scrollbar-thumb:active { + background-color: var(--scrollbar-active-thumb-bg) !important; +} + + +::-webkit-scrollbar:horizontal { + height: 0; + background-color: transparent !important; +} + +/* tooltip */ +.tooltip { + color: var(--fg); +} + +/* links */ + +.cm-url { + filter: none !important; +} + +.cm-string.cm-url.external-link { + filter: var(--link-external-filter) !important; +} + +a.external-link { + filter: none; + background-image: unset; + padding-right: 0; +} + +a.external-link::after { + content: url(public/images/874d8b8e340f75575caa.svg); + filter: var(--link-external-filter); + padding-left: 2.5px; + bottom: -1px; + position: relative; +} + +/* Images */ + +.image-embed { + border-radius: var(--image-radius); +} + +/* tables credit: Akifyss/border */ +body { + --table-width: 88cqw; +} + +.theme-dark, +.theme-light .markdown-rendered thead tr { + background: var(--table-header-background); +} + +body:not(.table-width-obsidian-default) .markdown-source-view.mod-cm6 .cm-table-widget .table-wrapper, +body:not(.table-width-obsidian-default) :is(.markdown-rendered, .markdown-source-view.mod-cm6.is-live-preview) table { + width: 100% !important; +} + +.table-width-customized .markdown-source-view.mod-cm6.is-live-preview .cm-content>.cm-table-widget, +.table-width-customized .markdown-rendered .markdown-preview-sizer>div:has(>table) { + overflow: auto; + width: var(--table-width) !important; + margin-left: calc((var(--table-width) - 100%) / -2) !important; +} + +/* notice */ +.notice { + background-color: var(--bg_dark); + border: 2px solid var(--bg_highlight); +} + +/* callouts */ +.callout[data-callout="quote"] { + background-color: rgba(var(--bg_highlight_dark_x), 0.5); +} + + +.callout[data-callout="cite"] { + --callout-color: var(--pink_x); + background-color: rgba(var(--pink_x), 0.15); +} + +/* the following callouts are from Border (https://github.com/Akifyss/obsidian-border/blob/18607ee208d56e1d4faff7419efb9cf7c9cc726e/theme.css#L7710C1-L7799C2) */ + +.callout-style-1.theme-light { + --callout-border-width: 1px; + --callout-border-opacity: 0.25; + --callout-padding: 0; + --callout-radius: var(--radius-s); + --callout-title-color: inherit; + --callout-title-padding: 8px 16px; + --callout-title-size: inherit; + --callout-content-padding: 0px 16px; + --callout-content-background: #FFFFFFBF; + --callout-content-radius: 0px; +} + +.callout-style-1.theme-dark { + --callout-border-width: 1px; + --callout-border-opacity: 0.25; + --callout-padding: 0; + --callout-radius: var(--radius-s); + --callout-title-color: inherit; + --callout-title-padding: 8px 16px; + --callout-title-size: inherit; + --callout-content-padding: 0px 16px; + --callout-content-background: #00000040; + --callout-content-radius: 0px; +} + +.callout-style-2.theme-light { + --callout-border-width: 1px; + --callout-border-opacity: 0.25; + --callout-padding: 0 6px 6px; + --callout-radius: var(--radius-s); + --callout-title-color: inherit; + --callout-title-padding: 8px 16px; + --callout-title-size: inherit; + --callout-content-padding: 0px 16px; + --callout-content-background: #FFFFFFBF; + --callout-content-radius: 4px; +} + +.callout-style-2.theme-dark { + --callout-border-width: 1px; + --callout-border-opacity: 0.25; + --callout-padding: 0 6px 6px; + --callout-radius: var(--radius-s); + --callout-title-color: inherit; + --callout-title-padding: 8px 16px; + --callout-title-size: inherit; + --callout-content-padding: 0px 16px; + --callout-content-background: #00000040; + --callout-content-radius: 4px; +} + +.callout-style-3:is(.theme-light, .theme-dark) { + --callout-border-width: 0 0 0 4px; + --callout-border-opacity: 1; + --callout-padding: var(--size-4-3) var(--size-4-3) var(--size-4-3) var(--size-4-6); + --callout-radius: var(--radius-s); + --callout-title-color: inherit; + --callout-title-padding: 0; + --callout-title-size: inherit; + --callout-content-padding: 0; + --callout-content-background: transparent; + --callout-content-radius: 0px; +} + +.callout-style-4.theme-light { + --callout-border-width: 0 0 0 4px; + --callout-border-opacity: 1; + --callout-padding: 0; + --callout-radius: var(--radius-s); + --callout-title-color: inherit; + --callout-title-padding: 8px 16px; + --callout-title-size: inherit; + --callout-content-padding: 0px 16px; + --callout-content-background: #FFFFFFBF; + --callout-content-radius: 0px; +} + +.callout-style-4.theme-dark { + --callout-border-width: 0 0 0 4px; + --callout-border-opacity: 1; + --callout-padding: 0; + --callout-radius: var(--radius-s); + --callout-title-color: inherit; + --callout-title-padding: 8px 16px; + --callout-title-size: inherit; + --callout-content-padding: 0px 16px; + --callout-content-background: #00000040; + --callout-content-radius: 0px; +} + +/* for vim */ +.ͼ2 .cm-panels-bottom { + border-top: var(--border-width) solid var(--bg_highlight); +} + +.cm-vim-message { + color: var(--red); +} + +/* kanban */ +.kanban-plugin__lane-action-add { + color: var(--fg); +} + +.kanban-plugin__lane-action-add:hover { + color: var(--bg); +} + +.kanban-plugin__autocomplete-item:hover, +.kanban-plugin__autocomplete-item-active { + color: hsl(var(--accent-h), var(--accent-s), var(--accent-l)); + background-color: var(--bg_highlight); +} + +/* various-complement */ +.various-complements__suggestion-item::before { + filter: var(--link-external-filter); +} + +.various-complements__footer::before { + filter: var(--link-external-filter); +} + +/* Math Jax */ +mjx-math { + font-size: 110% !important; +} + +/* metadata */ +.cm-atom { + color: var(--blue); +} + +span.cm-hmd-frontmatter.cm-meta { + color: rgba(var(--blue0_x), 0.9); +} + +/* checkboxes (credit: border) */ + +body:not(.disable-alternative-checkboxes) input[data-task="<"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="<"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="<"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task=">"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task=">"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task=">"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="d"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="d"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="d"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="u"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="u"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="u"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="S"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="S"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="S"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="“"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="“"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="“"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="\""]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="\""]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="\""]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="c"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="c"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="c"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="p"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="p"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="p"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="n"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="n"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="n"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="b"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="b"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="b"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="-"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="-"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="-"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="l"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="l"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="l"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="I"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="I"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="I"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="/"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="/"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="/"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="i"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="i"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="i"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="*"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="*"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="*"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="?"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="?"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="?"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="!"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="!"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="!"]>p>input:checked { + --checkbox-marker-color: transparent; + border: none; + border-radius: 0; + background-image: none; + background-color: currentColor; + -webkit-mask-size: var(--checkbox-icon); + -webkit-mask-position: 50% 50% +} + + +body:not(.disable-alternative-checkboxes) input[data-task="!"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="!"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="!"]>p>input:checked { + --checkbox-color-hover: var(--color-orange); + color: var(--color-orange); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="?"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="?"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="?"]>p>input:checked { + --checkbox-color-hover: var(--color-pink); + color: var(--color-pink); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="*"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="*"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="*"]>p>input:checked { + --checkbox-color-hover: var(--color-yellow); + color: var(--color-yellow); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="i"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="i"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="i"]>p>input:checked { + --checkbox-color-hover: var(--color-cyan); + color: var(--color-cyan); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="/"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="/"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="/"]>p>input:checked { + --checkbox-color-hover: var(--color-yellow); + color: var(--color-yellow); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="I"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="I"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="I"]>p>input:checked { + --checkbox-color-hover: var(--color-orange); + color: var(--color-orange); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="l"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="l"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="l"]>p>input:checked { + --checkbox-color-hover: var(--color-red); + color: var(--color-red); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="-"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="-"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="-"]>p>input:checked { + --checkbox-color-hover: var(--text-faint); + color: var(--text-faint); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) body:not(.tasks) .markdown-preview-view ul li[data-task="x"].task-list-item.is-checked, +body:not(.disable-alternative-checkboxes) body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task="x"]), +body:not(.disable-alternative-checkboxes) body:not(.tasks) li[data-task="x"].task-list-item.is-checked, +body:not(.disable-alternative-checkboxes) body:not(.tasks) .markdown-preview-view ul li[data-task="-"].task-list-item.is-checked, +body:not(.disable-alternative-checkboxes) body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task="-"]), +body:not(.disable-alternative-checkboxes) body:not(.tasks) li[data-task="-"].task-list-item.is-checked { + color: var(--text-faint); + text-decoration: line-through solid var(--text-faint) 1px +} + + +body:not(.disable-alternative-checkboxes) input[data-task="b"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="b"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="b"]>p>input:checked { + --checkbox-color-hover: var(--color-blue); + color: var(--color-blue); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="n"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="n"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="n"]>p>input:checked { + --checkbox-color-hover: var(--color-cyan); + color: var(--color-cyan); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="p"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="p"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="p"]>p>input:checked { + --checkbox-color-hover: var(--color-green); + color: var(--color-green); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="c"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="c"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="c"]>p>input:checked { + --checkbox-color-hover: var(--color-red); + color: var(--color-red); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="“"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="“"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="“"]>p>input:checked, +body:not(.disable-alternative-checkboxes) input[data-task="\""]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="\""]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="\""]>p>input:checked { + --checkbox-color-hover: var(--color-purple); + color: var(--color-purple); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="S"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="S"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="S"]>p>input:checked { + --checkbox-color-hover: var(--color-green); + color: var(--color-green); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="u"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="u"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="u"]>p>input:checked { + --checkbox-color-hover: var(--color-green); + color: var(--color-green); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="d"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="d"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="d"]>p>input:checked { + --checkbox-color-hover: var(--color-red); + color: var(--color-red); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task=">"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task=">"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task=">"]>p>input:checked { + --checkbox-color-hover: var(--color-pink); + color: var(--color-pink); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + +body:not(.disable-alternative-checkboxes) input[data-task="<"]:checked, +body:not(.disable-alternative-checkboxes) li[data-task="<"]>input:checked, +body:not(.disable-alternative-checkboxes) li[data-task="<"]>p>input:checked { + --checkbox-color-hover: var(--color-blue); + color: var(--color-blue); + -webkit-mask-image: url('data:image/svg+xml;utf8,'); +} + + +/* style settings */ + +.style-settings-container .themed-color-wrapper { + display: flex; + gap: var(--size-4-2); +} + +.style-settings-container .themed-color-wrapper>div+div { + margin-top: 0; +} + +.style-settings-container { + margin-left: var(--size-4-1); + padding-left: var(--size-4-8); + border-left: 1px solid var(--divider-color); +} + +/* printing */ + +@media print { + .theme-light { + --blockquote-background-color: rgba(var(--bg_dark_x), 0.25); + --code-background: rgba(var(--bg_highlight_dark_x), 0.25); + --table-header-background: rgba(var(--bg_dark2_x), 0.25); + } +} + + +/* @settings + +name: Appearance +id: Appearance +settings: + - + id: colors + title: Colors + type: heading + level: 1 + collapsed: true + - + id: accent + title: Accent Color + type: variable-themed-color + format: hsl-split + opacity: false + default-light: '#0F87CC' + default-dark: '#80D0FF' + - + id: Extended-colors + title: Extended Colors + type: heading + level: 2 + collapsed: true + - + id: red + title: Red + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(115, 42, 56)' + default-dark: 'rgb(219, 75, 75)' + - + id: red1 + title: Red1 + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(140, 67, 81)' + default-dark: 'rgb(255, 117, 127)' + - + id: green + title: Green + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(51, 99, 92)' + default-dark: 'rgb(158, 206, 106)' + - + id: cyan + title: Cyan + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(15, 75, 110)' + default-dark: 'rgb(125, 207, 255)' + - + id: blue + title: Blue + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(52, 84, 138)' + default-dark: 'rgb(122, 162, 247)' + - + id: yellow + title: Yellow + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(143, 94, 21)' + default-dark: 'rgb(224, 175, 104)' + - + id: orange + title: Orange + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(150, 80, 39)' + default-dark: 'rgb(255, 158, 100)' + - + id: magenta + title: Magenta + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(90, 74, 120)' + default-dark: 'rgb(187, 154, 247)' + - + id: pink + title: Pink + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(109, 74, 120)' + default-dark: 'rgb(217, 0, 105)' + - + id: Background-colors + title: Background Colors + type: heading + level: 1 + collapsed: true + - + id: bg + title: Background Primary + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(213, 214, 219)' + default-dark: 'rgb(26, 27, 38)' + - + id: bg_dark + title: Background Dark + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(203, 204, 209)' + default-dark: 'rgb(22, 22, 30)' + - + id: bg_highlight + title: Background Highlight + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(220, 222, 226)' + default-dark: 'rgb(41, 46, 66)' + - + id: bg_highlight_dark + title: Background Highlight Dark + description: 'Used for code bg' + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(195, 197, 201)' + default-dark: 'rgb(36, 40, 59)' + - + id: bg_dark2 + title: Background Dark2 + type: variable-themed-color + format: rgb + opacity: false + default-light: 'rgb(188, 189, 194)' + default-dark: 'rgb(15, 15, 20)' + - + id: foreground-header + title: Foreground + type: heading + level: 2 + collapsed: true + - + id: text-color-heading + title: Text / Icon Color + type: heading + level: 3 + collapsed: true + - + id: text-normal + title: Text Normal + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-muted + title: Text Muted + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-faint + title: Text Faint + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-accent + title: Text Accent + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-accent-hover + title: Text Accent Hover + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-on-accent + title: Text on Accent + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-on-accent-inverted + title: Text on Accent Inverted + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-error + title: Text Error + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-warning + title: Text Warning + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-success + title: Text Success + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: interactive-heading + title: Interactive color + type: heading + level: 3 + collapsed: true + - + id: interactive-normal + title: Interactive Normal + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: interactive-hover + title: Interactive Hover + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: interactive-accent + title: Interactive Accent + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: interactive-accent-hover + title: Interactive Accent Hover + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: interactive-accent-hsl + title: Interactive Accent HSL + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - +*/ + +/* @settings + +name: Editor +id: Editor +settings: + - + id: headings + title: Tabs + type: heading + level: 1 + collapsed: true + - + id: tab-text-color-focused-active + title: Tab Focus Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: tab-text-color-focused-active-current + title: Current Tab Focus Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: headings + title: Headings + type: heading + level: 1 + collapsed: true + - + id: level-1-heading + title: Level 1 + type: heading + level: 2 + collapsed: true + - + id: h1-divider-on + title: disable H1 divider + type: class-toggle + default: false + - + id: h1-font + title: H1 Font + type: variable-text + default: '' + - + id: h1-size + title: H1 Font Size + description: Any CSS font-size value + type: variable-text + default: '' + - + id: h1-weight + title: H1 Font Weight + description: Value from 100 - 900 + type: variable-text + default: 700 + - + id: h1-color + title: H1 Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: level-2-heading + title: Level 2 + type: heading + level: 2 + collapsed: true + - + id: h2-divider-on + title: disable H2 divider + type: class-toggle + default: false + - + id: h2-font + title: H2 Font + type: variable-text + default: '' + - + id: h2-size + title: H2 Font Size + description: Any CSS font-size value + type: variable-text + default: '' + - + id: h2-weight + title: H2 Font Weight + description: Value from 100 - 900 + type: variable-text + default: 600 + - + id: h2-color + title: H2 Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: level-3-heading + title: Level 3 + type: heading + level: 2 + collapsed: true + - + id: h3-divider-on + title: disable H3 divider + type: class-toggle + default: false + - + id: h3-font + title: H3 Font + type: variable-text + default: '' + - + id: h3-size + title: H3 Font Size + description: Any CSS font-size value + type: variable-text + default: '' + - + id: h3-weight + title: H3 Font Weight + description: Value from 100 - 900 + type: variable-text + default: 600 + - + id: h3-color + title: H3 Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: level-4-heading + title: Level 4 + type: heading + level: 2 + collapsed: true + - + id: h4-divider-on + title: disable H4 divider + type: class-toggle + default: false + - + id: h4-font + title: H4 Font + type: variable-text + default: '' + - + id: h4-size + title: H4 Font Size + description: Any CSS font-size value + type: variable-text + default: '' + - + id: h4-weight + title: H4 Font Weight + description: Value from 100 - 900 + type: variable-text + default: 600 + - + id: h4-color + title: H4 Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: level-5-heading + title: Level 5 + type: heading + level: 2 + collapsed: true + - + id: h5-divider-on + title: disable H5 divider + type: class-toggle + default: false + - + id: h5-font + title: H5 Font + type: variable-text + default: '' + - + id: h5-size + title: H5 Font Size + description: Any CSS font-size value + type: variable-text + default: '' + - + id: h5-weight + title: H5 Font Weight + description: Value from 100 - 900 + type: variable-text + default: 600 + - + id: h5-color + title: H5 Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: level-6-heading + title: Level 6 + type: heading + level: 2 + collapsed: true + - + id: h6-divider-on + title: disable H6 divider + type: class-toggle + default: false + - + id: h6-font + title: H6 Font + type: variable-text + default: '' + - + id: h6-size + title: H6 Font Size + description: Any CSS font-size value + type: variable-text + default: '' + - + id: h6-weight + title: H6 Font Weight + description: Value from 100 - 900 + type: variable-text + default: 600 + - + id: h6-color + title: H6 Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: text-heading + title: Text + type: heading + level: 1 + collapsed: true + - + id: bold-color + title: Bold Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: italic-color + title: Italic Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: link-heading + title: Links + type: heading + level: 1 + collapsed: true + - + id: link-color + title: Link Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: link-color-hover + title: Link Hover Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: link-decoration + title: Link decoration + description: Any CSS text-decoration-line value + type: variable-text + default: underline + - + id: link-decoration-hover + title: Link Hover decoration + description: Any CSS text-decoration-line value + type: variable-text + default: underline + - + id: link-decoration-thickness + title: Link decoration thickness + description: Any CSS text-decoration-thickness value + type: variable-text + default: auto + - + id: external-link-heading + title: External Link + type: heading + level: 3 + collapsed: true + - + id: link-external-color + title: External Link Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: link-external-color-hover + title: External Link Hover Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: link-external-decoration + title: External Link decoration + description: Any CSS text-decoration-line value + type: variable-text + default: underline + - + id: link-external-decoration-hover + title: External Link Hover decoration + description: Any CSS text-decoration-line value + type: variable-text + default: underline + - + id: link-external-filter + title: External Link Filter + description: Any CSS filter value + type: variable-text + default: invert(35%) sepia(28%) saturate(681%) hue-rotate(192deg) brightness(94%) contrast(85%) + - + id: unresolved-link-heading + title: Unresolved Link + type: heading + level: 3 + collapsed: true + - + id: link-unresolved-color + title: Unresolved Link Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: link-unresolved-opacity + title: Unresolved link opacity + type: variable-number-slider + default: 0.7 + min: 0.25 + max: 1 + step: 0.05 + - + id: link-unresolved-filter + title: Unresolved Link Filter + description: Any CSS filter value + type: variable-text + default: none + - + id: link-unresolved-decoration + title: Unresolved Link decoration + description: Any CSS text-decoration-line value + type: variable-text + default: solid + - + id: link-unresolved-decoration-color + title: Unresolved Link decoration Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: lists-heading + title: Lists + type: heading + level: 2 + collapsed: true + - + id: list-indent + title: List Indent + type: variable-text + default: 2.25em + - + id: list-spacing + title: list spacing + type: variable-text + default: 0.075em + - + id: list-bullet-size + title: list marker size + type: variable-text + default: 0.3em + - + id: list-marker-color + title: list marker color + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: list-marker-color-hover + title: list marker color (hover) + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: list-marker-color-collapsed + title: list marker color (collapsed) + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: Tags + title: Tags + type: heading + collapsed: true + level: 2 + - + id: tag-color + title: Tag text color + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: tag-background + title: Tag background color + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: tag-background-hover + title: Tag background color (hover) + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: Dates + title: Dates + type: heading + collapsed: true + level: 2 + - + id: date-color + title: Tag text color + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: date-background-color + title: Date background color + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: table-heading + title: Tables + type: heading + level: 2 + collapsed: true + - + id: table-border-width + title: Table Border Width + type: variable-number-slider + default: 1 + min: 0 + max: 20 + step: 1 + format: px + - + id: table-border-color + title: Table Border Color + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: code-headigeng + title: Code + type: heading + level: 2 + collapsed: true + - + id: code-background + title: Code Background + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-normal + title: Code Normal + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-comment + title: Code Comment + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-function + title: Code Function + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-important + title: Code Important + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-keyword + title: Code Keyword + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-operator + title: Code Operator + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-property + title: Code Property + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-punctuation + title: Code Punctuation + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-string + title: Code String + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-tag + title: Code Tag + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: code-value + title: Code Value + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: blockquote-heading + title: Blockquote + type: heading + level: 2 + collapsed: true + - + id: blockquote-border-thickness + title: Blockquote Border Thickness + type: variable-number-slider + default: 3 + min: 0 + max: 20 + step: 1 + format: px + - + id: blockquote-border-color + title: Blockquote Border Color + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: blockquote-color + title: Blockquote Color + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: blockquote-background-color + title: Blockquote Background Color + type: variable-themed-color + format: hex + default-light: '#' + default-dark: '#' + - + id: checkbox-heading + title: Checkboxes + type: heading + level: 2 + collapsed: true + - + id: disable-alternative-checkboxes + title: Disable Alternative Checkboxes + description: Enable this if you are using your own implementation via a CSS Snippet. + default: false + type: class-toggle + - + id: checkbox-radius + title: Checkbox Radius + description: Any CSS border-radius value + type: variable-text + default: '' + - + id: checkbox-color + title: Checkbox Color + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: checkbox-color-hover + title: Checkbox Hover Color + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: checkbox-marker-color + title: Checkbox Marker Color + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: checkbox-border-color + title: Checkbox Border Color + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: checkbox-border-color-hover + title: Checkbox Border Hover Color + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-heading + title: Callouts + type: heading + level: 2 + collapsed: true + - + id: callout-style-select + title: Callout Style + type: class-select + allowEmpty: false + default: callout-style-customize + options: + - label: Customize + value: callout-style-customize + - label: style 1 + value: callout-style-1 + - label: style 2 + value: callout-style-2 + - label: style 3 + value: callout-style-3 + - label: style 4 + value: callout-style-4 + - + id: callout-border-width + title: Callout Border Width + type: variable-text + description: Any CSS border-width value + default: 0px + - + id: callout-border-opacity + title: Callout Border Opacity + type: variable-number-slider + default: 0.25 + min: 0 + max: 1 + step: 0.05 + - + id: callout-padding + title: Callout Padding + description: Accepts any CSS padding value + type: variable-text + default: '' + - + id: callout-radius + title: Callout Radius + description: Input your border-radius value here + type: variable-text + default: '' + - + id: callout-title-color + title: Callout Title Color + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: callout-title-padding + title: Callout Title Padding + description: Any CSS font-size value + type: variable-text + default: '' + - + id: callout-title-size + title: Callout Title Size + description: Any CSS font-size value + type: variable-text + default: '' + - + id: callout-content-padding + title: Callout Content Padding + description: Any CSS font-size value + type: variable-text + default: '' + - + id: callout-content-background + title: Callout Content Background + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: callout-content-radius + title: Callout Content Radius + description: Input your border-radius value here + type: variable-text + default: '' + - + id: callout-color-heading + title: Callout Colors + type: heading + level: 3 + collapsed: true + - + id: callout-default + title: Default Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-info + title: Info Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-summary + title: Summary Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-tip + title: Tip Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-todo + title: Todo Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-bug + title: Bug Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-error + title: Error Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-fail + title: Fail Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-example + title: Example Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-important + title: Important Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-success + title: Success Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-question + title: Question Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-warning + title: Warning Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: callout-quote + title: Quote Callout + type: variable-themed-color + format: hex + opacity: false + default-light: '#' + default-dark: '#' + - + id: embed-heading + title: Embeds + type: heading + level: 2 + collapsed: true + - + id: embed-background + title: Embed Background + type: variable-themed-color + opacity: true + format: hex + default-light: '#' + default-dark: '#' + - + id: embed-padding + title: Embed Padding + description: Any CSS padding value + type: variable-text + default: '' + - + id: embed-border-radius + title: Embed Border Radius + description: Any CSS border-radius value + type: variable-text + default: '' + - + id: embed-font-style + title: Embed Font Style + description: Any CSS font-style value + type: variable-text + default: '' + - + id: image-heading + title: Images + type: heading + level: 2 + collapsed: true + - + id: image-radius + title: Image Radius + description: Any CSS border-radius value + type: variable-text + default: '' + - + id: scrollbar-heading + title: Scrollbar + type: heading + level: 2 + collapsed: true + - + id: scrollbar-bg + title: Scrollbar Background + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: scrollbar-thumb-bg + title: Scrollbar Thumb Background + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: scrollbar-active-thumb-bg + title: Scrollbar Active Thumb Background + type: variable-themed-color + format: rgb + opacity: false + default-light: '#' + default-dark: '#' + - + id: scrollbar-width + title: Scrollbar Width + type: variable-number-slider + default: 7 + min: 0 + max: 20 + step: 1 + format: px + - +*/ diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 603394d..0d393a4 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,12 +13,12 @@ "state": { "type": "markdown", "state": { - "file": "index.md", + "file": "KaraKeep/2026-04-11-MISAMARU-on-X-”アメスリ着物が新登場!.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "index" + "title": "2026-04-11-MISAMARU-on-X-”アメスリ着物が新登場!" } } ] @@ -183,9 +183,46 @@ "bases:Create new base": false } }, - "active": "ce0058b798b778c7", + "active": "fb3397b33e4538d8", "lastOpenFiles": [ - "version.txt", - "index.md" + "index.md", + "KaraKeep/2026-03-31-Make-This-Lumber-Farm-in-Pokopia.md", + "KaraKeep/attachments/3bfdf769-818a-4c83-b602-a6f5ea3d522f-Make-This-Lumber-Farm-in.jpg", + "KaraKeep/attachments/ea5bdc41-7565-4839-9b85-64266555d7cd-Make-This-Lumber-Farm-in.jpg", + "KaraKeep/2026-03-31-paint-recipes.md", + "KaraKeep/attachments/67e88391-3daf-4a68-8574-14349790a5c2-paint-recipes.jpg", + "KaraKeep/2026-03-31-シア口ア-on-X-”これが速いのか分からないままブランチマイニングして.md", + "KaraKeep/attachments/413c02a0-da78-4819-b2e0-1663c00b2258-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg", + "KaraKeep/attachments/2afc00ea-3eb0-4b30-9926-9e9be37a0492-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg", + "KaraKeep/attachments/137010df-57bf-43b4-a5e3-acfc3ca97c19-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg", + "KaraKeep/2026-03-31-Poke-Dolls-Guide.md", + "KaraKeep/attachments/c3afda7a-3966-4fe8-9ac0-d526aefee8fb-Poke-Dolls-Guide.jpg", + "KaraKeep/2026-03-31-Stamp-Values.md", + "KaraKeep/attachments/e3288a47-b14b-479a-8728-648abafacba4-Stamp-Values.jpg", + "KaraKeep/2026-03-31-Ingredient-Flavors.md", + "KaraKeep/attachments/2e3a5c92-e8e3-40e3-9469-09f5abaf2b8c-Ingredient-Flavors.jpg", + "KaraKeep/2026-03-31-Reblog-by-@thevisualvamp-·-1-image.md", + "KaraKeep/attachments/534d005f-c408-40d6-839c-d71374da5f74-Reblog-by-@thevisualvamp-·-1.jpg", + "KaraKeep/2026-03-31-Post-by-@catchymemes-·-1-video.md", + "KaraKeep/2026-03-31-Lake-Como,-Italy.md", + "KaraKeep/2026-03-31-Pig-Tail-Bridge-№54,-Huddersfield.md", + "KaraKeep/2026-03-31-Brutalism-The-University-of.md", + "KaraKeep/2026-03-31-the-happy-smiler.md", + "KaraKeep/2026-03-31-pinko🐬👽-on-X-”@145k4-a-lot-of.md", + "KaraKeep/2026-03-31-alaska-on-X-“once-you-realize-that.md", + "KaraKeep/2026-03-31-@i-on-X.md", + "KaraKeep/2026-03-31-Unique-Guns-in-Anime-–-GRAVITON.md", + "KaraKeep/2026-03-31-Unique-Guns-in-Anime-The-Caster-Gun.md", + "KaraKeep/2026-04-01-Shota-Ashida-on-Instagram.md", + "KaraKeep/2026-04-01-Manifold-Catalytic-Converter-674.md", + "KaraKeep/2026-04-01-Catalytic-Converter-for-Hyundai.md", + "KaraKeep/2026-04-01-Dr.-Ahmad-Al-Khatib,-MD,.md", + "KaraKeep/2026-04-01-Bookmark-r52rx1vz27hvtt3e2capnr09.md", + "KaraKeep/2026-04-01-Daily-Planner.md", + "KaraKeep/2026-04-02-image.md", + "KaraKeep/2026-04-03-IPv6-Network-(Auto)-Configuration.md", + "KaraKeep/attachments", + "KaraKeep", + "version.txt" ] } \ No newline at end of file diff --git a/KaraKeep/2026-03-31-@i-on-X.md b/KaraKeep/2026-03-31-@i-on-X.md new file mode 100644 index 0000000..d603377 --- /dev/null +++ b/KaraKeep/2026-03-31-@i-on-X.md @@ -0,0 +1,31 @@ +--- +bookmark_id: "ukujhdtcwozw4wyxh8zpmxol" +url: | + https://vxtwitter.com/CH4R10T_TV/status/1991751083115581932 +title: | + @i on X +date: 2026-03-31T07:27:58.000Z +modified: 2026-04-06T02:48:18.000Z +tags: + - xcom + - privacy-extensions + - troubleshooting + - website-issues +note: +original_note: +summary: +screenshot: "[[KaraKeep/attachments/815aa7c2-efa8-4167-b129-5d5c9349f78a-@i-on-X-Screenshot.jpg]]" + +--- + +# @i on X + +![@i on X - Screenshot](KaraKeep/attachments/815aa7c2-efa8-4167-b129-5d5c9349f78a-@i-on-X-Screenshot.jpg) + +## Notes + + + +[Visit Link](https://vxtwitter.com/CH4R10T_TV/status/1991751083115581932) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/ukujhdtcwozw4wyxh8zpmxol) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Brutalism-The-University-of.md b/KaraKeep/2026-03-31-Brutalism-The-University-of.md new file mode 100644 index 0000000..3f1daab --- /dev/null +++ b/KaraKeep/2026-03-31-Brutalism-The-University-of.md @@ -0,0 +1,35 @@ +--- +bookmark_id: "pkpg95z0qkhqcb4aids4mjs4" +url: | + https://www.reddit.com/r/ArchitecturePorn/comments/sq4tox/brutalism_the_university_of_missouris_school_of/ +title: | + Brutalism: The University of Missouri's School of Music, constructed in 2020 +date: 2026-03-31T06:16:14.000Z +modified: 2026-04-06T02:45:58.000Z +tags: + - aesthetics + - architecture + - brutalism + - university-buildings + - missouri-school-of-music +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/d4ae7d43-46d3-4c73-99d0-9277ad8e4dc4-Brutalism-The-University-of.jpg]]" +screenshot: "[[KaraKeep/attachments/716a074c-458e-4920-a52a-76a968311924-Brutalism-The-University-of.jpg]]" + +--- + +# Brutalism: The University of Missouri's School of Music, constructed in 2020 + +![Brutalism: The University of Missouri's School of Music, constructed in 2020 - Banner Image](KaraKeep/attachments/d4ae7d43-46d3-4c73-99d0-9277ad8e4dc4-Brutalism-The-University-of.jpg) + +![Brutalism: The University of Missouri's School of Music, constructed in 2020 - Screenshot](KaraKeep/attachments/716a074c-458e-4920-a52a-76a968311924-Brutalism-The-University-of.jpg) + +## Notes + + + +[Visit Link](https://www.reddit.com/r/ArchitecturePorn/comments/sq4tox/brutalism_the_university_of_missouris_school_of/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/pkpg95z0qkhqcb4aids4mjs4) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Ingredient-Flavors.md b/KaraKeep/2026-03-31-Ingredient-Flavors.md new file mode 100644 index 0000000..5abecbc --- /dev/null +++ b/KaraKeep/2026-03-31-Ingredient-Flavors.md @@ -0,0 +1,33 @@ +--- +bookmark_id: "ato3ru1vioz0cuqhc9mhhtwj" +url: +title: Ingredient Flavors +date: 2026-03-31T05:32:49.000Z +modified: 2026-04-06T02:40:58.000Z +tags: + - pokopia + - Know-Your-Food + - Pokopia-Flavour-Guide + - Peppas-Adventures + - Food-and-Spice + - Colorful-Characters-with-Fruit-and-Vegetable-Bodies + - Bright-Colors-for-a-Young-Audience + - Spicy-to-Sweet-Sensations + - Sugar-Free-Options + - Fun-Names-for-Food-and-Drinks +note: +original_note: +summary: +image: "[[KaraKeep/attachments/2e3a5c92-e8e3-40e3-9469-09f5abaf2b8c-Ingredient-Flavors.jpg]]" + +--- + +# Ingredient Flavors + +![Ingredient Flavors](KaraKeep/attachments/2e3a5c92-e8e3-40e3-9469-09f5abaf2b8c-Ingredient-Flavors.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/ato3ru1vioz0cuqhc9mhhtwj) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Lake-Como,-Italy.md b/KaraKeep/2026-03-31-Lake-Como,-Italy.md new file mode 100644 index 0000000..feed995 --- /dev/null +++ b/KaraKeep/2026-03-31-Lake-Como,-Italy.md @@ -0,0 +1,36 @@ +--- +bookmark_id: "tyj6fz339r6g9bzani3av4rx" +url: | + https://www.reddit.com/r/ArchitecturalRevival/comments/1krthma/lake_como_italy/ +title: | + Lake Como, Italy +date: 2026-03-31T06:14:49.000Z +modified: 2026-04-06T02:45:44.000Z +tags: + - aesthetics + - italy + - lake-como + - architecture + - travel + - italian-lakes +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/1b12aab0-bae6-46c7-bd58-89e25e60eded-Lake-Como,-Italy-Banner-Image.jpg]]" +screenshot: "[[KaraKeep/attachments/ad9d6ba0-fa5a-4d74-b6b6-416477c85347-Lake-Como,-Italy-Screenshot.jpg]]" + +--- + +# Lake Como, Italy + +![Lake Como, Italy - Banner Image](KaraKeep/attachments/1b12aab0-bae6-46c7-bd58-89e25e60eded-Lake-Como,-Italy-Banner-Image.jpg) + +![Lake Como, Italy - Screenshot](KaraKeep/attachments/ad9d6ba0-fa5a-4d74-b6b6-416477c85347-Lake-Como,-Italy-Screenshot.jpg) + +## Notes + + + +[Visit Link](https://www.reddit.com/r/ArchitecturalRevival/comments/1krthma/lake_como_italy/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/tyj6fz339r6g9bzani3av4rx) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Make-This-Lumber-Farm-in-Pokopia.md b/KaraKeep/2026-03-31-Make-This-Lumber-Farm-in-Pokopia.md new file mode 100644 index 0000000..1b46d79 --- /dev/null +++ b/KaraKeep/2026-03-31-Make-This-Lumber-Farm-in-Pokopia.md @@ -0,0 +1,33 @@ +--- +bookmark_id: "evwe55xtsqmfla8blk0fnxlt" +url: | + https://www.youtube.com/watch?v=-53lXfWMoZg +title: Make This Lumber Farm in Pokopia +date: 2026-03-31T05:24:42.000Z +modified: 2026-04-06T02:24:03.000Z +tags: + - pokopia + - daily-mix + - lumber-farm + - youtube-videos +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/ea5bdc41-7565-4839-9b85-64266555d7cd-Make-This-Lumber-Farm-in.jpg]]" +screenshot: "[[KaraKeep/attachments/3bfdf769-818a-4c83-b602-a6f5ea3d522f-Make-This-Lumber-Farm-in.jpg]]" + +--- + +# Make This Lumber Farm in Pokopia + +![Make This Lumber Farm in Pokopia - Banner Image](KaraKeep/attachments/ea5bdc41-7565-4839-9b85-64266555d7cd-Make-This-Lumber-Farm-in.jpg) + +![Make This Lumber Farm in Pokopia - Screenshot](KaraKeep/attachments/3bfdf769-818a-4c83-b602-a6f5ea3d522f-Make-This-Lumber-Farm-in.jpg) + +## Notes + + + +[Visit Link](https://www.youtube.com/watch?v=-53lXfWMoZg) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/evwe55xtsqmfla8blk0fnxlt) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Pig-Tail-Bridge-№54,-Huddersfield.md b/KaraKeep/2026-03-31-Pig-Tail-Bridge-№54,-Huddersfield.md new file mode 100644 index 0000000..ed9b71a --- /dev/null +++ b/KaraKeep/2026-03-31-Pig-Tail-Bridge-№54,-Huddersfield.md @@ -0,0 +1,36 @@ +--- +bookmark_id: "xjkmqh2i559xy6qrjg2nrguh" +url: | + https://www.reddit.com/r/bridgeporn/comments/10a2y4k/pig_tail_bridge_54_huddersfield_narrow_canal/ +title: | + Pig Tail Bridge №54, Huddersfield Narrow Canal, Yorkshire, England [2048x1365] +date: 2026-03-31T06:15:37.000Z +modified: 2026-04-06T02:45:51.000Z +tags: + - aesthetics + - bridges + - canals + - yorkshire + - england + - photography +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/3fb22b0f-b6a2-4123-bec3-1206e3f0691d-Pig-Tail-Bridge-№54,.jpg]]" +screenshot: "[[KaraKeep/attachments/f65116b2-fa97-4d35-b514-fd80108ac35f-Pig-Tail-Bridge-№54,.jpg]]" + +--- + +# Pig Tail Bridge №54, Huddersfield Narrow Canal, Yorkshire, England [2048x1365] + +![Pig Tail Bridge №54, Huddersfield Narrow Canal, Yorkshire, England [2048x1365] - Banner Image](KaraKeep/attachments/3fb22b0f-b6a2-4123-bec3-1206e3f0691d-Pig-Tail-Bridge-№54,.jpg) + +![Pig Tail Bridge №54, Huddersfield Narrow Canal, Yorkshire, England [2048x1365] - Screenshot](KaraKeep/attachments/f65116b2-fa97-4d35-b514-fd80108ac35f-Pig-Tail-Bridge-№54,.jpg) + +## Notes + + + +[Visit Link](https://www.reddit.com/r/bridgeporn/comments/10a2y4k/pig_tail_bridge_54_huddersfield_narrow_canal/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/xjkmqh2i559xy6qrjg2nrguh) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Poke-Dolls-Guide.md b/KaraKeep/2026-03-31-Poke-Dolls-Guide.md new file mode 100644 index 0000000..9d053d5 --- /dev/null +++ b/KaraKeep/2026-03-31-Poke-Dolls-Guide.md @@ -0,0 +1,36 @@ +--- +bookmark_id: "z5q7xqn106n4rpzrc961rzha" +url: +title: Poke Dolls Guide +date: 2026-03-31T05:31:50.000Z +modified: 2026-04-06T04:34:44.000Z +tags: + - pokopia + - anime + - Yo-Kai-NAMCO + - Mobile-RPG + - Monster-Collection + - Bird-Character + - Fishing-Game + - Rainy-Day + - Pokemon-Go + - Mini-Game + - Smartphone-Game + - Free-to-Play-Game + - Japanese-Game +note: +original_note: +summary: +image: "[[KaraKeep/attachments/c3afda7a-3966-4fe8-9ac0-d526aefee8fb-Poke-Dolls-Guide.jpg]]" + +--- + +# Poke Dolls Guide + +![Poke Dolls Guide](KaraKeep/attachments/c3afda7a-3966-4fe8-9ac0-d526aefee8fb-Poke-Dolls-Guide.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/z5q7xqn106n4rpzrc961rzha) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Post-by-@catchymemes-·-1-video.md b/KaraKeep/2026-03-31-Post-by-@catchymemes-·-1-video.md new file mode 100644 index 0000000..1482678 --- /dev/null +++ b/KaraKeep/2026-03-31-Post-by-@catchymemes-·-1-video.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "ikl6bebyly5yvqdpvyt9r5xq" +url: | + https://www.tumblr.com/catchymemes/706396571603009536/the-image-captures-the-miraculous-moment-when-the +title: | + Post by @catchymemes · 1 video +date: 2026-03-31T06:14:04.000Z +modified: 2026-04-06T04:38:44.000Z +tags: + - aesthetics +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/5d323927-385d-4fee-a7b0-7db63a9587b6-Post-by-@catchymemes-·-1.jpg]]" +screenshot: "[[KaraKeep/attachments/49df76ff-0cd2-4f0a-afcb-5cd2f9143423-Post-by-@catchymemes-·-1.jpg]]" +additional: + - "[[KaraKeep/attachments/274b6b25-3992-4802-ad38-2a9b9c7d14b3-Post-by-@catchymemes-·-1.jpg]]" + +--- + +# Post by @catchymemes · 1 video + +![Post by @catchymemes · 1 video - Banner Image](KaraKeep/attachments/5d323927-385d-4fee-a7b0-7db63a9587b6-Post-by-@catchymemes-·-1.jpg) + +![Post by @catchymemes · 1 video - Screenshot](KaraKeep/attachments/49df76ff-0cd2-4f0a-afcb-5cd2f9143423-Post-by-@catchymemes-·-1.jpg) + +![Post by @catchymemes · 1 video - linkHtmlContent](KaraKeep/attachments/274b6b25-3992-4802-ad38-2a9b9c7d14b3-Post-by-@catchymemes-·-1.jpg) + +## Description + +💬 69 🔁 18555 ❤️ 24072 · The image captures the miraculous moment when the rays of sun hit a rare cloud called a pile cloud, and the angle and other subtle conditions are reflected in a divine rai… + +## Notes + + + +[Visit Link](https://www.tumblr.com/catchymemes/706396571603009536/the-image-captures-the-miraculous-moment-when-the) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/ikl6bebyly5yvqdpvyt9r5xq) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Reblog-by-@thevisualvamp-·-1-image.md b/KaraKeep/2026-03-31-Reblog-by-@thevisualvamp-·-1-image.md new file mode 100644 index 0000000..36b14f2 --- /dev/null +++ b/KaraKeep/2026-03-31-Reblog-by-@thevisualvamp-·-1-image.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "p5jtsv0rokiyze22mizex7b5" +url: | + https://www.tumblr.com/thevisualvamp/734440155670298624/architecture +title: | + Reblog by @thevisualvamp · 1 image +date: 2026-03-31T06:11:29.000Z +modified: 2026-04-06T04:36:44.000Z +tags: + - aesthetics +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/8cc40447-f750-4bf2-a935-69c7a35a2923-Reblog-by-@thevisualvamp-·-1.jpg]]" +screenshot: "[[KaraKeep/attachments/1e1ad172-26b3-4c81-884c-a51cee7bd6e1-Reblog-by-@thevisualvamp-·-1.jpg]]" +additional: + - "[[KaraKeep/attachments/534d005f-c408-40d6-839c-d71374da5f74-Reblog-by-@thevisualvamp-·-1.jpg]]" + +--- + +# Reblog by @thevisualvamp · 1 image + +![Reblog by @thevisualvamp · 1 image - Banner Image](KaraKeep/attachments/8cc40447-f750-4bf2-a935-69c7a35a2923-Reblog-by-@thevisualvamp-·-1.jpg) + +![Reblog by @thevisualvamp · 1 image - Screenshot](KaraKeep/attachments/1e1ad172-26b3-4c81-884c-a51cee7bd6e1-Reblog-by-@thevisualvamp-·-1.jpg) + +![Reblog by @thevisualvamp · 1 image - linkHtmlContent](KaraKeep/attachments/534d005f-c408-40d6-839c-d71374da5f74-Reblog-by-@thevisualvamp-·-1.jpg) + +## Description + +💬 0 🔁 22 ❤️ 55 · Architecture + +## Notes + + + +[Visit Link](https://www.tumblr.com/thevisualvamp/734440155670298624/architecture) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/p5jtsv0rokiyze22mizex7b5) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Stamp-Values.md b/KaraKeep/2026-03-31-Stamp-Values.md new file mode 100644 index 0000000..7bd2093 --- /dev/null +++ b/KaraKeep/2026-03-31-Stamp-Values.md @@ -0,0 +1,45 @@ +--- +bookmark_id: "swg831dryshnjg5mdccdd805" +url: +title: Stamp Values +date: 2026-03-31T05:32:14.000Z +modified: 2026-04-06T02:39:44.000Z +tags: + - pokopia + - Machine-Learning + - Artificial-Intelligence + - Pokemon + - Education + - Reading + - Research + - Bookmarking + - Web-Development + - Computer-Literacy + - Cryptocurrency + - Math + - Digital-Marketing + - Science--Technology + - Anime-and-Manga + - Information-Technology + - Health-and-Fitness + - Cybersecurity + - Writing + - Language-Learning + - Marketing-Strategy + - Fintech +note: +original_note: +summary: +image: "[[KaraKeep/attachments/e3288a47-b14b-479a-8728-648abafacba4-Stamp-Values.jpg]]" + +--- + +# Stamp Values + +![Stamp Values](KaraKeep/attachments/e3288a47-b14b-479a-8728-648abafacba4-Stamp-Values.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/swg831dryshnjg5mdccdd805) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Unique-Guns-in-Anime-The-Caster-Gun.md b/KaraKeep/2026-03-31-Unique-Guns-in-Anime-The-Caster-Gun.md new file mode 100644 index 0000000..57df6d9 --- /dev/null +++ b/KaraKeep/2026-03-31-Unique-Guns-in-Anime-The-Caster-Gun.md @@ -0,0 +1,38 @@ +--- +bookmark_id: "aeythd8rqa8bvs2ez996v6tf" +url: | + https://youtube.com/shorts/42dEPEp_L68?si=l33oAgTFdAa3AlRH +title: Unique Guns in Anime - The Caster Gun (Outlaw Star) +date: 2026-03-31T07:29:08.000Z +modified: 2026-04-06T02:48:57.000Z +tags: + - 90sanime + - retroanime + - anime-weapons + - outlaw-star + - sci-fi-anime +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/6d6e6e3a-387d-4286-8b6b-bb103288c1cc-Unique-Guns-in-Anime-The.jpg]]" +screenshot: "[[KaraKeep/attachments/34ad0016-d238-45ab-96ed-2b5e80dc7063-Unique-Guns-in-Anime-The.jpg]]" + +--- + +# Unique Guns in Anime - The Caster Gun (Outlaw Star) + +![Unique Guns in Anime - The Caster Gun (Outlaw Star) - Banner Image](KaraKeep/attachments/6d6e6e3a-387d-4286-8b6b-bb103288c1cc-Unique-Guns-in-Anime-The.jpg) + +![Unique Guns in Anime - The Caster Gun (Outlaw Star) - Screenshot](KaraKeep/attachments/34ad0016-d238-45ab-96ed-2b5e80dc7063-Unique-Guns-in-Anime-The.jpg) + +## Description + +The Caster Gun from Outlaw Star (1998) is one of the most unique weapons in anime history.Instead of firing bullets, it uses Caster Shells - spell cartridges… + +## Notes + + + +[Visit Link](https://youtube.com/shorts/42dEPEp_L68?si=l33oAgTFdAa3AlRH) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/aeythd8rqa8bvs2ez996v6tf) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-Unique-Guns-in-Anime-–-GRAVITON.md b/KaraKeep/2026-03-31-Unique-Guns-in-Anime-–-GRAVITON.md new file mode 100644 index 0000000..d4a5eb8 --- /dev/null +++ b/KaraKeep/2026-03-31-Unique-Guns-in-Anime-–-GRAVITON.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "qxy09to4zvdc97gkenjm3z0u" +url: | + https://youtube.com/shorts/Uz2zfstUt0o?si=ywuL07xWY_A9t1Em +title: | + Unique Guns in Anime – GRAVITON (Silent Möbius, 1991 - 1998) +date: 2026-03-31T07:28:46.000Z +modified: 2026-04-06T02:48:39.000Z +tags: + - anime-weapons + - cyberpunkanime + - 90sanime + - retroanime + - silent-mobius +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/79994532-0e74-4e46-9ab3-9768f611a314-Unique-Guns-in-Anime-–.jpg]]" +screenshot: "[[KaraKeep/attachments/35d79559-fd59-4ee6-baa8-05b5d5773860-Unique-Guns-in-Anime-–.jpg]]" + +--- + +# Unique Guns in Anime – GRAVITON (Silent Möbius, 1991 - 1998) + +![Unique Guns in Anime – GRAVITON (Silent Möbius, 1991 - 1998) - Banner Image](KaraKeep/attachments/79994532-0e74-4e46-9ab3-9768f611a314-Unique-Guns-in-Anime-–.jpg) + +![Unique Guns in Anime – GRAVITON (Silent Möbius, 1991 - 1998) - Screenshot](KaraKeep/attachments/35d79559-fd59-4ee6-baa8-05b5d5773860-Unique-Guns-in-Anime-–.jpg) + +## Description + +The Graviton is one of the most iconic weapons from the Silent Möbius universe.Powered by advanced science and supernatural energy, this gravity-based firear… + +## Notes + + + +[Visit Link](https://youtube.com/shorts/Uz2zfstUt0o?si=ywuL07xWY_A9t1Em) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/qxy09to4zvdc97gkenjm3z0u) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-alaska-on-X-“once-you-realize-that.md b/KaraKeep/2026-03-31-alaska-on-X-“once-you-realize-that.md new file mode 100644 index 0000000..a24d738 --- /dev/null +++ b/KaraKeep/2026-03-31-alaska-on-X-“once-you-realize-that.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "uv97p0js6v79x8i73r3i6zbi" +url: | + https://fxtwitter.com/i/status/1977782816445448439/ +title: | + alaska on X: “once you realize that u are inherently and inescapably evil it becomes a lot easier to be good” / X +date: 2026-03-31T07:27:37.000Z +modified: 2026-04-06T02:48:11.000Z +tags: + - social-media + - x-twitter + - trends + - online-conversations + - digital-content +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/4d928b50-cc22-447d-94f4-c46742e02691-alaska-on-X-“once-you-realize.jpg]]" +screenshot: "[[KaraKeep/attachments/4ef28cbc-4c2e-4264-ad78-9d74bd0b138b-alaska-on-X-“once-you-realize.jpg]]" +additional: + - "[[KaraKeep/attachments/35e7303a-292e-4fe6-b58e-66231b5f4c33-alaska-on-X-“once-you-realize.jpg]]" + +--- + +# alaska on X: “once you realize that u are inherently and inescapably evil it becomes a lot easier to be good” / X + +![alaska on X: “once you realize that u are inherently and inescapably evil it becomes a lot easier to be good” / X - Banner Image](KaraKeep/attachments/4d928b50-cc22-447d-94f4-c46742e02691-alaska-on-X-“once-you-realize.jpg) + +![alaska on X: “once you realize that u are inherently and inescapably evil it becomes a lot easier to be good” / X - Screenshot](KaraKeep/attachments/4ef28cbc-4c2e-4264-ad78-9d74bd0b138b-alaska-on-X-“once-you-realize.jpg) + +![alaska on X: “once you realize that u are inherently and inescapably evil it becomes a lot easier to be good” / X - linkHtmlContent](KaraKeep/attachments/35e7303a-292e-4fe6-b58e-66231b5f4c33-alaska-on-X-“once-you-realize.jpg) + +## Notes + + + +[Visit Link](https://fxtwitter.com/i/status/1977782816445448439/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/uv97p0js6v79x8i73r3i6zbi) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-paint-recipes.md b/KaraKeep/2026-03-31-paint-recipes.md new file mode 100644 index 0000000..7face54 --- /dev/null +++ b/KaraKeep/2026-03-31-paint-recipes.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "j29ikc9szen3xkt0rtayqk41" +url: +title: paint recipes +date: 2026-03-31T05:27:39.000Z +modified: 2026-04-06T04:31:16.000Z +tags: + - pokopia + - Bookmarking + - Pokemon + - Artificial-Intelligence + - Automatic-text-tagging + - Read-it-later-app + - paint + - brushstroke + - candypaintedberries + - crush + - graphicdesign + - pacman + - icon + - video-games + - sweet + - fruit +note: +original_note: +summary: +image: "[[KaraKeep/attachments/67e88391-3daf-4a68-8574-14349790a5c2-paint-recipes.jpg]]" + +--- + +# paint recipes + +![paint recipes](KaraKeep/attachments/67e88391-3daf-4a68-8574-14349790a5c2-paint-recipes.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/j29ikc9szen3xkt0rtayqk41) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-pinko🐬👽-on-X-”@145k4-a-lot-of.md b/KaraKeep/2026-03-31-pinko🐬👽-on-X-”@145k4-a-lot-of.md new file mode 100644 index 0000000..80d699a --- /dev/null +++ b/KaraKeep/2026-03-31-pinko🐬👽-on-X-”@145k4-a-lot-of.md @@ -0,0 +1,35 @@ +--- +bookmark_id: "fm14kr8n4jxrry191rzhqug9" +url: | + https://fxtwitter.com/i/status/1977862670436196776/ +title: | + pinko🐬👽 on X: ”@145k4 a lot of people’s ethics literally start with “I am incapable of evil, and everything I do has a justification and is therefore good” and they work backwards from there. A good test of this is whether or not they can admit that eating animals is clearly wrong, vegan or not.” / X +date: 2026-03-31T07:26:54.000Z +modified: 2026-04-06T02:47:42.000Z +tags: + - ethics + - moral-philosophy + - animal-rights + - veganism + - social-commentary +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/4f0fe47b-484e-4b8d-8634-3ff31573299a-pinko🐬👽-on-X-”@145k4-a-lot.jpg]]" +screenshot: "[[KaraKeep/attachments/79336178-5338-4e3c-b0f6-244fd2fd6a34-pinko🐬👽-on-X-”@145k4-a-lot.jpg]]" + +--- + +# pinko🐬👽 on X: ”@145k4 a lot of people’s ethics literally start with “I am incapable of evil, and everything I do has a justification and is therefore good” and they work backwards from there. A good test of this is whether or not they can admit that eating animals is clearly wrong, vegan or not.” / X + +![pinko🐬👽 on X: ”@145k4 a lot of people’s ethics literally start with “I am incapable of evil, and everything I do has a justification and is therefore good” and they work backwards from there. A good test of this is whether or not they can admit that eating animals is clearly wrong, vegan or not.” / X - Banner Image](KaraKeep/attachments/4f0fe47b-484e-4b8d-8634-3ff31573299a-pinko🐬👽-on-X-”@145k4-a-lot.jpg) + +![pinko🐬👽 on X: ”@145k4 a lot of people’s ethics literally start with “I am incapable of evil, and everything I do has a justification and is therefore good” and they work backwards from there. A good test of this is whether or not they can admit that eating animals is clearly wrong, vegan or not.” / X - Screenshot](KaraKeep/attachments/79336178-5338-4e3c-b0f6-244fd2fd6a34-pinko🐬👽-on-X-”@145k4-a-lot.jpg) + +## Notes + + + +[Visit Link](https://fxtwitter.com/i/status/1977862670436196776/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/fm14kr8n4jxrry191rzhqug9) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-the-happy-smiler.md b/KaraKeep/2026-03-31-the-happy-smiler.md new file mode 100644 index 0000000..d9e538d --- /dev/null +++ b/KaraKeep/2026-03-31-the-happy-smiler.md @@ -0,0 +1,33 @@ +--- +bookmark_id: "unhf2x5smpji8mpwueqso67u" +url: +title: the happy smiler +date: 2026-03-31T06:38:01.000Z +modified: 2026-04-06T02:47:27.000Z +tags: + - Emotional-support + - AI + - Text + - Chatbot + - Cream + - Smiley + - Hello-Kitty + - Nighttime + - Smilie-Face + - Social-Media-App +note: +original_note: +summary: +image: "[[KaraKeep/attachments/c78ddd37-e319-48e9-aa44-9d05e7ec5535-the-happy-smiler.jpg]]" + +--- + +# the happy smiler + +![the happy smiler](KaraKeep/attachments/c78ddd37-e319-48e9-aa44-9d05e7ec5535-the-happy-smiler.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/unhf2x5smpji8mpwueqso67u) \ No newline at end of file diff --git a/KaraKeep/2026-03-31-シア口ア-on-X-”これが速いのか分からないままブランチマイニングして.md b/KaraKeep/2026-03-31-シア口ア-on-X-”これが速いのか分からないままブランチマイニングして.md new file mode 100644 index 0000000..2d848e6 --- /dev/null +++ b/KaraKeep/2026-03-31-シア口ア-on-X-”これが速いのか分からないままブランチマイニングして.md @@ -0,0 +1,45 @@ +--- +bookmark_id: "s62h8blr4hayz8yqcjggpd6o" +url: | + https://fxtwitter.com/i/status/2035888580040790369/ +title: | + シア口ア on X: ”これが速いのか分からないままブランチマイニングしてる + Aボタン長押ししながら移動して壁越しで9マス分の鉱石がある場所を入れ替えをしている + 無駄な素材が増えないのは利点 #NintendoSwitch2 #ぽこポケ #ぽこあポケモン https://t.co/tejaa8Gmlc” / X +date: 2026-03-31T05:28:36.000Z +modified: 2026-04-06T04:33:16.000Z +tags: + - pokopia +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/137010df-57bf-43b4-a5e3-acfc3ca97c19-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg]]" +screenshot: "[[KaraKeep/attachments/2afc00ea-3eb0-4b30-9926-9e9be37a0492-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg]]" +additional: + - "[[KaraKeep/attachments/413c02a0-da78-4819-b2e0-1663c00b2258-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg]]" + +--- + +# シア口ア on X: ”これが速いのか分からないままブランチマイニングしてる +Aボタン長押ししながら移動して壁越しで9マス分の鉱石がある場所を入れ替えをしている +無駄な素材が増えないのは利点 #NintendoSwitch2 #ぽこポケ #ぽこあポケモン https://t.co/tejaa8Gmlc” / X + +![シア口ア on X: ”これが速いのか分からないままブランチマイニングしてる +Aボタン長押ししながら移動して壁越しで9マス分の鉱石がある場所を入れ替えをしている +無駄な素材が増えないのは利点 #NintendoSwitch2 #ぽこポケ #ぽこあポケモン https://t.co/tejaa8Gmlc” / X - Banner Image](KaraKeep/attachments/137010df-57bf-43b4-a5e3-acfc3ca97c19-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg) + +![シア口ア on X: ”これが速いのか分からないままブランチマイニングしてる +Aボタン長押ししながら移動して壁越しで9マス分の鉱石がある場所を入れ替えをしている +無駄な素材が増えないのは利点 #NintendoSwitch2 #ぽこポケ #ぽこあポケモン https://t.co/tejaa8Gmlc” / X - Screenshot](KaraKeep/attachments/2afc00ea-3eb0-4b30-9926-9e9be37a0492-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg) + +![シア口ア on X: ”これが速いのか分からないままブランチマイニングしてる +Aボタン長押ししながら移動して壁越しで9マス分の鉱石がある場所を入れ替えをしている +無駄な素材が増えないのは利点 #NintendoSwitch2 #ぽこポケ #ぽこあポケモン https://t.co/tejaa8Gmlc” / X - linkHtmlContent](KaraKeep/attachments/413c02a0-da78-4819-b2e0-1663c00b2258-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg) + +## Notes + + + +[Visit Link](https://fxtwitter.com/i/status/2035888580040790369/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/s62h8blr4hayz8yqcjggpd6o) \ No newline at end of file diff --git a/KaraKeep/2026-04-01-Bookmark-r52rx1vz27hvtt3e2capnr09.md b/KaraKeep/2026-04-01-Bookmark-r52rx1vz27hvtt3e2capnr09.md new file mode 100644 index 0000000..4dafe75 --- /dev/null +++ b/KaraKeep/2026-04-01-Bookmark-r52rx1vz27hvtt3e2capnr09.md @@ -0,0 +1,34 @@ +--- +bookmark_id: "r52rx1vz27hvtt3e2capnr09" +url: +title: Bookmark-r52rx1vz27hvtt3e2capnr09-2026-04-01 +date: 2026-04-01T19:21:55.000Z +modified: 2026-04-06T02:55:33.000Z +tags: + - anime + - Motivation + - Literature + - Humor + - Comic-illustrations + - Technology + - Digital-art + - Gaming-culture + - Pop-culture + - Webtoom + - Storytelling +note: +original_note: +summary: +image: "[[KaraKeep/attachments/a0a9d75a-abb2-4705-a850-ff88eb544645-Bookmark-r52rx1vz27hvtt3e2capn.jpg]]" + +--- + +# Bookmark-r52rx1vz27hvtt3e2capnr09-2026-04-01 + +![Bookmark-r52rx1vz27hvtt3e2capnr09-2026-04-01](KaraKeep/attachments/a0a9d75a-abb2-4705-a850-ff88eb544645-Bookmark-r52rx1vz27hvtt3e2capn.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/r52rx1vz27hvtt3e2capnr09) \ No newline at end of file diff --git a/KaraKeep/2026-04-01-Catalytic-Converter-for-Hyundai.md b/KaraKeep/2026-04-01-Catalytic-Converter-for-Hyundai.md new file mode 100644 index 0000000..fc8a692 --- /dev/null +++ b/KaraKeep/2026-04-01-Catalytic-Converter-for-Hyundai.md @@ -0,0 +1,33 @@ +--- +bookmark_id: "qgfxh11zyu7l693h4zuz8hg6" +url: | + https://www.ebay.com/itm/365355347481?mkcid=16&mkevt=1&mkrid=711-127632-2357-0&ssspo=ygqdzfrms-g&sssrc=4429486&ssuid=tkcw1yj4tec&stype=1&var=&widget_ver=artemis&media=SMS +title: | + Catalytic Converter for Hyundai Elantra Gt 2014-2017/Tucson 2014-2018 2.0L | eBay +date: 2026-04-01T16:59:13.000Z +modified: 2026-04-06T04:42:44.000Z +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/1c40397d-ae7d-4dd9-a50c-d35b8c581399-Catalytic-Converter-for.jpg]]" +screenshot: "[[KaraKeep/attachments/b15135b3-ba0e-4616-802f-86652a3b6494-Catalytic-Converter-for.jpg]]" + +--- + +# Catalytic Converter for Hyundai Elantra Gt 2014-2017/Tucson 2014-2018 2.0L | eBay + +![Catalytic Converter for Hyundai Elantra Gt 2014-2017/Tucson 2014-2018 2.0L | eBay - Banner Image](KaraKeep/attachments/1c40397d-ae7d-4dd9-a50c-d35b8c581399-Catalytic-Converter-for.jpg) + +![Catalytic Converter for Hyundai Elantra Gt 2014-2017/Tucson 2014-2018 2.0L | eBay - Screenshot](KaraKeep/attachments/b15135b3-ba0e-4616-802f-86652a3b6494-Catalytic-Converter-for.jpg) + +## Description + +Hyundai Elantra 2014-2017 2.0L. Hyundai Elantra Gt 2014-2017 2.0L. Hyundai Tucson 2014-2018 2.0L. Hyundai Santa Fe Sport 2013-2016 2.0L. Hyundai Sonata 2011-2013 2.0L. Important Information Our products are carefully colored in the pictures to highlight their details. + +## Notes + + + +[Visit Link](https://www.ebay.com/itm/365355347481?mkcid=16&mkevt=1&mkrid=711-127632-2357-0&ssspo=ygqdzfrms-g&sssrc=4429486&ssuid=tkcw1yj4tec&stype=1&var=&widget_ver=artemis&media=SMS) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/qgfxh11zyu7l693h4zuz8hg6) \ No newline at end of file diff --git a/KaraKeep/2026-04-01-Daily-Planner.md b/KaraKeep/2026-04-01-Daily-Planner.md new file mode 100644 index 0000000..8b988b9 --- /dev/null +++ b/KaraKeep/2026-04-01-Daily-Planner.md @@ -0,0 +1,27 @@ +--- +bookmark_id: "dze2dkzwmkuer489rjrhwnb8" +url: | + https://www.pokemon.com/static-assets/content-assets/cms2/pdf/video-game/pokemon-pokopia/daily-planner/daily-planner-en.pdf +title: Daily Planner +date: 2026-04-01T20:47:51.000Z +modified: 2026-04-06T02:22:04.000Z +tags: + - pokopia +note: +original_note: +summary: +screenshot: "[[KaraKeep/attachments/5dae84ab-e03b-4bb6-bb0f-2c22388015cb-Daily-Planner-Screenshot.jpg]]" + +--- + +# Daily Planner + +![Daily Planner - Screenshot](KaraKeep/attachments/5dae84ab-e03b-4bb6-bb0f-2c22388015cb-Daily-Planner-Screenshot.jpg) + +## Notes + + + +[Visit Link](https://www.pokemon.com/static-assets/content-assets/cms2/pdf/video-game/pokemon-pokopia/daily-planner/daily-planner-en.pdf) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/dze2dkzwmkuer489rjrhwnb8) \ No newline at end of file diff --git a/KaraKeep/2026-04-01-Dr.-Ahmad-Al-Khatib,-MD,.md b/KaraKeep/2026-04-01-Dr.-Ahmad-Al-Khatib,-MD,.md new file mode 100644 index 0000000..cac2235 --- /dev/null +++ b/KaraKeep/2026-04-01-Dr.-Ahmad-Al-Khatib,-MD,.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "lba3tlcjnndf4oky1p1xgnl2" +url: | + https://doctor.webmd.com/doctor/ahmad-al-khatib-f5ccabdf-01d0-423a-8485-4536f054c12e-overview +title: | + Dr. Ahmad Al Khatib, MD, Neurologist | Bentonville, AR | WebMD +date: 2026-04-01T18:33:38.000Z +modified: 2026-04-06T02:54:04.000Z +tags: + - neurology + - doctor-profiles + - medical-conditions + - arrhythmias + - myasthenia-gravis +note: "katrina's neurologist" +original_note: "katrina's neurologist" +summary: +banner: "[[KaraKeep/attachments/110ae728-0c19-4502-a2df-ee7c897fd657-Dr.-Ahmad-Al-Khatib,-MD,.jpg]]" +screenshot: "[[KaraKeep/attachments/4fe571f0-ed85-4933-aadf-f72891648d1f-Dr.-Ahmad-Al-Khatib,-MD,.jpg]]" + +--- + +# Dr. Ahmad Al Khatib, MD, Neurologist | Bentonville, AR | WebMD + +![Dr. Ahmad Al Khatib, MD, Neurologist | Bentonville, AR | WebMD - Banner Image](KaraKeep/attachments/110ae728-0c19-4502-a2df-ee7c897fd657-Dr.-Ahmad-Al-Khatib,-MD,.jpg) + +![Dr. Ahmad Al Khatib, MD, Neurologist | Bentonville, AR | WebMD - Screenshot](KaraKeep/attachments/4fe571f0-ed85-4933-aadf-f72891648d1f-Dr.-Ahmad-Al-Khatib,-MD,.jpg) + +## Description + +Dr. Ahmad Al Khatib, MD, is a Neurology specialist practicing in Bentonville, AR with 35 years of experience. including Medicare. New patients are welcome. Hospital affiliations include Northwest Medical Center Bentonville. + +## Notes + +katrina's neurologist + +[Visit Link](https://doctor.webmd.com/doctor/ahmad-al-khatib-f5ccabdf-01d0-423a-8485-4536f054c12e-overview) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/lba3tlcjnndf4oky1p1xgnl2) \ No newline at end of file diff --git a/KaraKeep/2026-04-01-Manifold-Catalytic-Converter-674.md b/KaraKeep/2026-04-01-Manifold-Catalytic-Converter-674.md new file mode 100644 index 0000000..ee3b7d5 --- /dev/null +++ b/KaraKeep/2026-04-01-Manifold-Catalytic-Converter-674.md @@ -0,0 +1,37 @@ +--- +bookmark_id: "j85iyripv07a4j5ab74v2s1h" +url: | + https://www.ebay.com/itm/196933283810?mkcid=16&mkevt=1&mkrid=711-127632-2357-0&ssspo=ZApSTwX1QEW&sssrc=4429486&ssuid=tkcw1yj4tec&stype=1&var=&widget_ver=artemis&media=SMS +title: | + Manifold Catalytic Converter 674-092 For HYUNDAI ELANTRA 2.0L 2017-2020 | eBay +date: 2026-04-01T16:59:01.000Z +modified: 2026-04-06T04:40:44.000Z +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/ecb5262d-3225-4cd3-a0fc-4cb6354c9a80-Manifold-Catalytic-Converter.jpg]]" +screenshot: "[[KaraKeep/attachments/ea288328-da05-4052-a325-d8c6b415e8df-Manifold-Catalytic-Converter.jpg]]" +additional: + - "[[KaraKeep/attachments/b567eb28-c60a-4986-9c52-48be624c59bd-Manifold-Catalytic-Converter.jpg]]" + +--- + +# Manifold Catalytic Converter 674-092 For HYUNDAI ELANTRA 2.0L 2017-2020 | eBay + +![Manifold Catalytic Converter 674-092 For HYUNDAI ELANTRA 2.0L 2017-2020 | eBay - Banner Image](KaraKeep/attachments/ecb5262d-3225-4cd3-a0fc-4cb6354c9a80-Manifold-Catalytic-Converter.jpg) + +![Manifold Catalytic Converter 674-092 For HYUNDAI ELANTRA 2.0L 2017-2020 | eBay - Screenshot](KaraKeep/attachments/ea288328-da05-4052-a325-d8c6b415e8df-Manifold-Catalytic-Converter.jpg) + +![Manifold Catalytic Converter 674-092 For HYUNDAI ELANTRA 2.0L 2017-2020 | eBay - linkHtmlContent](KaraKeep/attachments/b567eb28-c60a-4986-9c52-48be624c59bd-Manifold-Catalytic-Converter.jpg) + +## Description + +For HYUNDAI ELANTRA 2.0L 2017-2020. R est assured, our Manifold Catalytic Converter is engineered for a precise fit, making installation quick and hassle-free. D esigned with superior durability in mind, our Manifold Catalytic Converter is built to last, providing you with dependable and long-lasting performance. + +## Notes + + + +[Visit Link](https://www.ebay.com/itm/196933283810?mkcid=16&mkevt=1&mkrid=711-127632-2357-0&ssspo=ZApSTwX1QEW&sssrc=4429486&ssuid=tkcw1yj4tec&stype=1&var=&widget_ver=artemis&media=SMS) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/j85iyripv07a4j5ab74v2s1h) \ No newline at end of file diff --git a/KaraKeep/2026-04-01-Shota-Ashida-on-Instagram.md b/KaraKeep/2026-04-01-Shota-Ashida-on-Instagram.md new file mode 100644 index 0000000..dfaec1b --- /dev/null +++ b/KaraKeep/2026-04-01-Shota-Ashida-on-Instagram.md @@ -0,0 +1,49 @@ +--- +bookmark_id: "vtadg80hulyeb021jvv2ub9m" +url: | + https://www.instagram.com/p/DWbM4-Bk_Co/?img_index=3&igsh=MTJybW04MjlkMzVodA== +title: | + Shota Ashida on Instagram: ”春夏秋冬をアニメチックに + あなたはどの季節がお好きですか? Anime-style through all four seasons. + Which season do you like the most? #japan #日本の風景” +date: 2026-04-01T06:11:28.000Z +modified: 2026-04-06T02:49:07.000Z +tags: + - social-media + - instagram + - japan + - anime + - seasons +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/253497dc-0e09-43fc-ba19-35d6896403fd-Shota-Ashida-on-Instagram.jpg]]" +screenshot: "[[KaraKeep/attachments/59a504e6-be3d-4e20-8c6f-ceca79606e14-Shota-Ashida-on-Instagram.jpg]]" + +--- + +# Shota Ashida on Instagram: ”春夏秋冬をアニメチックに +あなたはどの季節がお好きですか? Anime-style through all four seasons. +Which season do you like the most? #japan #日本の風景” + +![Shota Ashida on Instagram: ”春夏秋冬をアニメチックに +あなたはどの季節がお好きですか? Anime-style through all four seasons. +Which season do you like the most? #japan #日本の風景” - Banner Image](KaraKeep/attachments/253497dc-0e09-43fc-ba19-35d6896403fd-Shota-Ashida-on-Instagram.jpg) + +![Shota Ashida on Instagram: ”春夏秋冬をアニメチックに +あなたはどの季節がお好きですか? Anime-style through all four seasons. +Which season do you like the most? #japan #日本の風景” - Screenshot](KaraKeep/attachments/59a504e6-be3d-4e20-8c6f-ceca79606e14-Shota-Ashida-on-Instagram.jpg) + +## Description + +11K likes, 30 comments - shota.mebakuro on March 28, 2026: ”春夏秋冬をアニメチックに +あなたはどの季節がお好きですか? Anime-style through all four seasons. +Which season do you like the most? #japan #日本の風景”. + +## Notes + + + +[Visit Link](https://www.instagram.com/p/DWbM4-Bk_Co/?img_index=3&igsh=MTJybW04MjlkMzVodA==) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/vtadg80hulyeb021jvv2ub9m) \ No newline at end of file diff --git a/KaraKeep/2026-04-02-image.md b/KaraKeep/2026-04-02-image.md new file mode 100644 index 0000000..bc2e4a6 --- /dev/null +++ b/KaraKeep/2026-04-02-image.md @@ -0,0 +1,27 @@ +--- +bookmark_id: "stbl4j4dq4zrwhy11c9jyo8g" +url: +title: image +date: 2026-04-02T22:45:45.000Z +modified: 2026-04-07T06:53:07.000Z +tags: + - menagerie + - Personal-Growth + - Mindfulness + - Intention-Setting +note: +original_note: +summary: +image: "[[KaraKeep/attachments/a8816528-6fb8-4100-b2be-ba42bedeafab-image.jpg]]" + +--- + +# image + +![image](KaraKeep/attachments/a8816528-6fb8-4100-b2be-ba42bedeafab-image.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/stbl4j4dq4zrwhy11c9jyo8g) \ No newline at end of file diff --git a/KaraKeep/2026-04-03-IPv6-Network-(Auto)-Configuration.md b/KaraKeep/2026-04-03-IPv6-Network-(Auto)-Configuration.md new file mode 100644 index 0000000..acbcb69 --- /dev/null +++ b/KaraKeep/2026-04-03-IPv6-Network-(Auto)-Configuration.md @@ -0,0 +1,30 @@ +--- +bookmark_id: "fuipdfi9brh5tbombsllongo" +url: | + https://egustafson.github.io/post/ipv6-dhcpv6/ +title: | + IPv6 Network (Auto) Configuration | Stuff I've Figured Out +date: 2026-04-03T02:33:31.000Z +modified: 2026-04-06T04:44:44.000Z +note: +original_note: +summary: +screenshot: "[[KaraKeep/attachments/b4b61eef-3ac2-411c-ad91-4d20a30d4fb5-IPv6-Network-(Auto).jpg]]" +additional: + - "[[KaraKeep/attachments/2e755ad8-ce5f-4fb7-a3fa-d2e1391a54b7-IPv6-Network-(Auto).jpg]]" + +--- + +# IPv6 Network (Auto) Configuration | Stuff I've Figured Out + +![IPv6 Network (Auto) Configuration | Stuff I've Figured Out - Screenshot]() + +![IPv6 Network (Auto) Configuration | Stuff I've Figured Out - linkHtmlContent]() + +## Notes + + + +[Visit Link](https://egustafson.github.io/post/ipv6-dhcpv6/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/fuipdfi9brh5tbombsllongo) \ No newline at end of file diff --git a/KaraKeep/2026-04-04-soup-soup-soup.md b/KaraKeep/2026-04-04-soup-soup-soup.md new file mode 100644 index 0000000..fb07903 --- /dev/null +++ b/KaraKeep/2026-04-04-soup-soup-soup.md @@ -0,0 +1,22 @@ +--- +bookmark_id: "rs8osbfs8q41jcukaqezz1u1" +url: +title: soup soup soup +date: 2026-04-04T23:53:33.000Z +modified: 2026-04-06T04:46:44.000Z +note: +original_note: +summary: +image: "[[KaraKeep/attachments/01c8ffb7-7143-4455-891e-1e88f1291d49-soup-soup-soup.jpg]]" + +--- + +# soup soup soup + +![soup soup soup](KaraKeep/attachments/01c8ffb7-7143-4455-891e-1e88f1291d49-soup-soup-soup.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/rs8osbfs8q41jcukaqezz1u1) \ No newline at end of file diff --git a/KaraKeep/2026-04-06-Moon-music-Here’s-a-Spotify.md b/KaraKeep/2026-04-06-Moon-music-Here’s-a-Spotify.md new file mode 100644 index 0000000..d769547 --- /dev/null +++ b/KaraKeep/2026-04-06-Moon-music-Here’s-a-Spotify.md @@ -0,0 +1,37 @@ +--- +bookmark_id: "e54j387lulsq3n9zmij2illm" +url: | + https://www.space.com/space-exploration/artemis/moon-music-heres-a-spotify-playlist-of-the-artemis-2-crews-wakeup-songs +title: | + Moon music: Here’s a Spotify playlist of the Artemis 2 crew’s wakeup songs +date: 2026-04-06T22:21:22.000Z +modified: 2026-04-06T22:25:06.000Z +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/7134b1d0-bdfd-40fe-a480-55afb8299509-Moon-music-Here’s-a-Spotify.jpg]]" +screenshot: "[[KaraKeep/attachments/3fe45c86-54f9-4ca6-a9de-6b097bbb9929-Moon-music-Here’s-a-Spotify.jpg]]" +additional: + - "[[KaraKeep/attachments/7c6a2c14-795c-4329-b047-dd39fdd2cdd4-Moon-music-Here’s-a-Spotify.jpg]]" + +--- + +# Moon music: Here’s a Spotify playlist of the Artemis 2 crew’s wakeup songs + +![Moon music: Here’s a Spotify playlist of the Artemis 2 crew’s wakeup songs - Banner Image](KaraKeep/attachments/7134b1d0-bdfd-40fe-a480-55afb8299509-Moon-music-Here’s-a-Spotify.jpg) + +![Moon music: Here’s a Spotify playlist of the Artemis 2 crew’s wakeup songs - Screenshot](KaraKeep/attachments/3fe45c86-54f9-4ca6-a9de-6b097bbb9929-Moon-music-Here’s-a-Spotify.jpg) + +![Moon music: Here’s a Spotify playlist of the Artemis 2 crew’s wakeup songs - linkHtmlContent](KaraKeep/attachments/7c6a2c14-795c-4329-b047-dd39fdd2cdd4-Moon-music-Here’s-a-Spotify.jpg) + +## Description + +So far, Mission Control has beamed up Chappell Roan and a cover of Passion Pit, among other songs. + +## Notes + + + +[Visit Link](https://www.space.com/space-exploration/artemis/moon-music-heres-a-spotify-playlist-of-the-artemis-2-crews-wakeup-songs) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/e54j387lulsq3n9zmij2illm) \ No newline at end of file diff --git a/KaraKeep/2026-04-06-Sorry-2026,-the-’90s-Did-Spring.md b/KaraKeep/2026-04-06-Sorry-2026,-the-’90s-Did-Spring.md new file mode 100644 index 0000000..4f83ca8 --- /dev/null +++ b/KaraKeep/2026-04-06-Sorry-2026,-the-’90s-Did-Spring.md @@ -0,0 +1,37 @@ +--- +bookmark_id: "wtyawzdfz8talj12ux50zvz7" +url: | + https://www.whowhatwear.com/fashion/outfit-ideas/best-celebrity-90s-looks-for-spring-2026 +title: | + Sorry 2026, the ’90s Did Spring Dressing Better—5 Celeb Looks I’m Recreating Now +date: 2026-04-06T22:20:55.000Z +modified: 2026-04-06T22:23:06.000Z +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/2d58a9f3-0a16-411b-95b1-4adcc8bc92ed-Sorry-2026,-the-’90s-Did.jpg]]" +screenshot: "[[KaraKeep/attachments/7d68f162-32b8-4e15-962a-942c666edca1-Sorry-2026,-the-’90s-Did.jpg]]" +additional: + - "[[KaraKeep/attachments/3f7f6332-d864-43c4-8321-a87028fd4c0f-Sorry-2026,-the-’90s-Did.jpg]]" + +--- + +# Sorry 2026, the ’90s Did Spring Dressing Better—5 Celeb Looks I’m Recreating Now + +![Sorry 2026, the ’90s Did Spring Dressing Better—5 Celeb Looks I’m Recreating Now - Banner Image](KaraKeep/attachments/2d58a9f3-0a16-411b-95b1-4adcc8bc92ed-Sorry-2026,-the-’90s-Did.jpg) + +![Sorry 2026, the ’90s Did Spring Dressing Better—5 Celeb Looks I’m Recreating Now - Screenshot](KaraKeep/attachments/7d68f162-32b8-4e15-962a-942c666edca1-Sorry-2026,-the-’90s-Did.jpg) + +![Sorry 2026, the ’90s Did Spring Dressing Better—5 Celeb Looks I’m Recreating Now - linkHtmlContent](KaraKeep/attachments/3f7f6332-d864-43c4-8321-a87028fd4c0f-Sorry-2026,-the-’90s-Did.jpg) + +## Description + +In need of some inspiration for your new season wardrobe? Look to the 90s for a lesson in timeless spring dressing. + +## Notes + + + +[Visit Link](https://www.whowhatwear.com/fashion/outfit-ideas/best-celebrity-90s-looks-for-spring-2026) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/wtyawzdfz8talj12ux50zvz7) \ No newline at end of file diff --git a/KaraKeep/2026-04-06-armv6k-nintendo-3ds-The-rustc-book.md b/KaraKeep/2026-04-06-armv6k-nintendo-3ds-The-rustc-book.md new file mode 100644 index 0000000..d2cc287 --- /dev/null +++ b/KaraKeep/2026-04-06-armv6k-nintendo-3ds-The-rustc-book.md @@ -0,0 +1,29 @@ +--- +bookmark_id: "jrhqiredjcmkjpzw44y0e6kd" +url: | + https://doc.rust-lang.org/rustc/platform-support/armv6k-nintendo-3ds.html +title: armv6k-nintendo-3ds - The rustc book +date: 2026-04-06T23:10:10.000Z +modified: 2026-04-06T23:12:16.000Z +note: +original_note: +summary: +screenshot: "[[KaraKeep/attachments/07d88e96-1c67-45a0-b42d-4c40ed8d2742-armv6k-nintendo-3ds-The-rustc.jpg]]" +additional: + - "[[KaraKeep/attachments/bcbfe09f-691f-4f9d-a343-ee531061a0c3-armv6k-nintendo-3ds-The-rustc.jpg]]" + +--- + +# armv6k-nintendo-3ds - The rustc book + +![armv6k-nintendo-3ds - The rustc book - Screenshot](KaraKeep/attachments/07d88e96-1c67-45a0-b42d-4c40ed8d2742-armv6k-nintendo-3ds-The-rustc.jpg) + +![armv6k-nintendo-3ds - The rustc book - linkHtmlContent](KaraKeep/attachments/bcbfe09f-691f-4f9d-a343-ee531061a0c3-armv6k-nintendo-3ds-The-rustc.jpg) + +## Notes + + + +[Visit Link](https://doc.rust-lang.org/rustc/platform-support/armv6k-nintendo-3ds.html) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/jrhqiredjcmkjpzw44y0e6kd) \ No newline at end of file diff --git a/KaraKeep/2026-04-06-image.md b/KaraKeep/2026-04-06-image.md new file mode 100644 index 0000000..dd31071 --- /dev/null +++ b/KaraKeep/2026-04-06-image.md @@ -0,0 +1,33 @@ +--- +bookmark_id: "jteb7d4l1jduj3tlpw2pe2im" +url: +title: image +date: 2026-04-06T19:41:29.000Z +modified: 2026-04-06T19:42:54.000Z +tags: + - politics + - campaigning + - presidential-race + - elections + - poliitics-campaign + - moral-values + - political-satire + - government-officials + - candidates + - american-politics +note: +original_note: +summary: +image: "[[KaraKeep/attachments/35bdf21d-0d00-43b0-a81c-04c4c79bf7c2-image.jpg]]" + +--- + +# image + +![image](KaraKeep/attachments/35bdf21d-0d00-43b0-a81c-04c4c79bf7c2-image.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/jteb7d4l1jduj3tlpw2pe2im) \ No newline at end of file diff --git a/KaraKeep/2026-04-06-shower-time.md b/KaraKeep/2026-04-06-shower-time.md new file mode 100644 index 0000000..fd52cf5 --- /dev/null +++ b/KaraKeep/2026-04-06-shower-time.md @@ -0,0 +1,22 @@ +--- +bookmark_id: "ohx64es2nfeyul689wwqy1kw" +url: | + https://images-ext-1.discordapp.net/external/KLXdYVrNHnVxVE2LsFrskRAiI07NOrFg2W6OGTtM39g/https/media.tenor.com/tKpAl23K2rMAAAPo/shower-time.mp4 +title: shower time +date: 2026-04-06T21:46:13.000Z +modified: 2026-04-06T21:46:16.000Z +note: +original_note: +summary: + +--- + +# shower time + +## Notes + + + +[Visit Link](https://images-ext-1.discordapp.net/external/KLXdYVrNHnVxVE2LsFrskRAiI07NOrFg2W6OGTtM39g/https/media.tenor.com/tKpAl23K2rMAAAPo/shower-time.mp4) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/ohx64es2nfeyul689wwqy1kw) \ No newline at end of file diff --git a/KaraKeep/2026-04-07-Anker-Desk-Clamp-USB-Power-Strip.md b/KaraKeep/2026-04-07-Anker-Desk-Clamp-USB-Power-Strip.md new file mode 100644 index 0000000..05d6e5e --- /dev/null +++ b/KaraKeep/2026-04-07-Anker-Desk-Clamp-USB-Power-Strip.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "zfu368art9hpucg4u24rsl07" +url: | + https://www.anker.com/products/a9196-70w-desk-clamp-usb-power-strip?variant=46320398303382 +title: | + Anker Desk Clamp USB Power Strip (70W) | Clutter-Free Desk - Anker US +date: 2026-04-07T07:06:53.000Z +modified: 2026-04-07T07:07:41.000Z +tags: + - power-strips + - usb-charging + - tech-accessories + - anker + - desk-organization +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/3a389673-3eb1-41e4-ade1-eef82e6c9b3d-Anker-Desk-Clamp-USB-Power.jpg]]" +screenshot: "[[KaraKeep/attachments/d8481403-ae53-4216-9acc-cbd0f58e5ccf-Anker-Desk-Clamp-USB-Power.jpg]]" + +--- + +# Anker Desk Clamp USB Power Strip (70W) | Clutter-Free Desk - Anker US + +![Anker Desk Clamp USB Power Strip (70W) | Clutter-Free Desk - Anker US - Banner Image](KaraKeep/attachments/3a389673-3eb1-41e4-ade1-eef82e6c9b3d-Anker-Desk-Clamp-USB-Power.jpg) + +![Anker Desk Clamp USB Power Strip (70W) | Clutter-Free Desk - Anker US - Screenshot](KaraKeep/attachments/d8481403-ae53-4216-9acc-cbd0f58e5ccf-Anker-Desk-Clamp-USB-Power.jpg) + +## Description + +Dual-Zone 10-Port Layout: Features 6 AC outlets, 2 USB-C, and 2 USB-A ports, split into top and bottom zones to reduce clutter and simplify charging. 70W U + +## Notes + + + +[Visit Link](https://www.anker.com/products/a9196-70w-desk-clamp-usb-power-strip?variant=46320398303382) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/zfu368art9hpucg4u24rsl07) \ No newline at end of file diff --git a/KaraKeep/2026-04-07-I-painted-a-Jirachi-Pokemon-card.md b/KaraKeep/2026-04-07-I-painted-a-Jirachi-Pokemon-card.md new file mode 100644 index 0000000..507b780 --- /dev/null +++ b/KaraKeep/2026-04-07-I-painted-a-Jirachi-Pokemon-card.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "y90g64dq8dt4gd17ulyxhu1f" +url: | + https://www.youtube.com/shorts/FRE7LrkZcig?feature=share +title: | + I painted a Jirachi Pokemon card inspired by Animal Crossing! #pokemon #pokemoncards #acnh +date: 2026-04-07T06:50:47.000Z +modified: 2026-04-07T06:51:19.000Z +tags: + - Pokemon + - Digital-art + - pokemon-cards + - animal-crossing + - youtube-shorts +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/dafa3407-18bd-41b4-a93c-5e8a95815438-I-painted-a-Jirachi-Pokemon.jpg]]" +screenshot: "[[KaraKeep/attachments/f378201a-fcdb-4c98-8b1f-049588cb2fe4-I-painted-a-Jirachi-Pokemon.jpg]]" + +--- + +# I painted a Jirachi Pokemon card inspired by Animal Crossing! #pokemon #pokemoncards #acnh + +![I painted a Jirachi Pokemon card inspired by Animal Crossing! #pokemon #pokemoncards #acnh - Banner Image](KaraKeep/attachments/dafa3407-18bd-41b4-a93c-5e8a95815438-I-painted-a-Jirachi-Pokemon.jpg) + +![I painted a Jirachi Pokemon card inspired by Animal Crossing! #pokemon #pokemoncards #acnh - Screenshot](KaraKeep/attachments/f378201a-fcdb-4c98-8b1f-049588cb2fe4-I-painted-a-Jirachi-Pokemon.jpg) + +## Description + +Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube. + +## Notes + + + +[Visit Link](https://www.youtube.com/shorts/FRE7LrkZcig?feature=share) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/y90g64dq8dt4gd17ulyxhu1f) \ No newline at end of file diff --git a/KaraKeep/2026-04-07-image.md b/KaraKeep/2026-04-07-image.md new file mode 100644 index 0000000..61b0ff4 --- /dev/null +++ b/KaraKeep/2026-04-07-image.md @@ -0,0 +1,31 @@ +--- +bookmark_id: "mkvs1ht9zar06iieui2h917m" +url: +title: image +date: 2026-04-07T17:24:34.000Z +modified: 2026-04-07T17:25:57.000Z +tags: + - Humor + - Finn--Jake + - Candy-Kingdom + - Adventure-Time + - Cartoon + - Comic + - Safety-first + - Text-bubble +note: +original_note: +summary: +image: "[[KaraKeep/attachments/ddca5d7b-0f28-4575-889f-92116e046cd0-image.jpg]]" + +--- + +# image + +![image](KaraKeep/attachments/ddca5d7b-0f28-4575-889f-92116e046cd0-image.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/mkvs1ht9zar06iieui2h917m) \ No newline at end of file diff --git a/KaraKeep/2026-04-09-image.md b/KaraKeep/2026-04-09-image.md new file mode 100644 index 0000000..5e13026 --- /dev/null +++ b/KaraKeep/2026-04-09-image.md @@ -0,0 +1,36 @@ +--- +bookmark_id: "vj9mh9ebcf2yul4zoc3i3cgy" +url: +title: image +date: 2026-04-09T15:28:12.000Z +modified: 2026-04-09T15:29:43.000Z +tags: + - Technology + - politics + - Satire + - social-media + - Twitter + - Artificial-Intelligence + - Climate-Change + - Social-Justice + - Family-Issues + - Personal-Life + - Privacy-Concerns + - News + - Online-Safety +note: +original_note: +summary: +image: "[[KaraKeep/attachments/38377923-8140-4eaf-a452-103a91990f26-image.jpg]]" + +--- + +# image + +![image](KaraKeep/attachments/38377923-8140-4eaf-a452-103a91990f26-image.jpg) + +## Notes + + + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/vj9mh9ebcf2yul4zoc3i3cgy) \ No newline at end of file diff --git a/KaraKeep/2026-04-09-pokopia-meals-spreadsheet.md b/KaraKeep/2026-04-09-pokopia-meals-spreadsheet.md new file mode 100644 index 0000000..0a342e6 --- /dev/null +++ b/KaraKeep/2026-04-09-pokopia-meals-spreadsheet.md @@ -0,0 +1,47 @@ +--- +bookmark_id: "tvl403fyhp06mr9md3kdvoh4" +url: +title: pokopia meals spreadsheet +date: 2026-04-09T06:20:01.000Z +modified: 2026-04-09T07:00:54.000Z +tags: + - pokopia +note: | + Vibrant Hamburger Steak will make rock smash stronger than the normal upgraded one + I included potato hamburger steak and mushroom hamburger steak as alternatives to crushed berry salad and fluffy bread since they require a partner pokemon, but serebii made no mention of whether those count as the best tier mosslax upgrade or just the standard tier. If someone finds information out about that, it would be welcome. + Presumably the meal rank also impacts how happy / full it makes the non-mosslax pokemon but that's an assumption + I think the key to making a "best" rank meal is that it includes another meal as an ingredient + + https://game8.co/games/Pokemon-Pokopia/archives/586136 + https://www.serebii.net/pokemonpokopia/mosslaxboosts.shtml + https://www.serebii.net/pokemonpokopia/cooking.shtml +original_note: | + Vibrant Hamburger Steak will make rock smash stronger than the normal upgraded one + I included potato hamburger steak and mushroom hamburger steak as alternatives to crushed berry salad and fluffy bread since they require a partner pokemon, but serebii made no mention of whether those count as the best tier mosslax upgrade or just the standard tier. If someone finds information out about that, it would be welcome. + Presumably the meal rank also impacts how happy / full it makes the non-mosslax pokemon but that's an assumption + I think the key to making a "best" rank meal is that it includes another meal as an ingredient + + https://game8.co/games/Pokemon-Pokopia/archives/586136 + https://www.serebii.net/pokemonpokopia/mosslaxboosts.shtml + https://www.serebii.net/pokemonpokopia/cooking.shtml +summary: +image: "[[KaraKeep/attachments/38245179-89e4-4b89-9b01-0f31a0577433-pokopia-meals-spreadsheet.jpg]]" + +--- + +# pokopia meals spreadsheet + +![pokopia meals spreadsheet](KaraKeep/attachments/38245179-89e4-4b89-9b01-0f31a0577433-pokopia-meals-spreadsheet.jpg) + +## Notes + +Vibrant Hamburger Steak will make rock smash stronger than the normal upgraded one +I included potato hamburger steak and mushroom hamburger steak as alternatives to crushed berry salad and fluffy bread since they require a partner pokemon, but serebii made no mention of whether those count as the best tier mosslax upgrade or just the standard tier. If someone finds information out about that, it would be welcome. +Presumably the meal rank also impacts how happy / full it makes the non-mosslax pokemon but that's an assumption +I think the key to making a "best" rank meal is that it includes another meal as an ingredient + +https://game8.co/games/Pokemon-Pokopia/archives/586136 +https://www.serebii.net/pokemonpokopia/mosslaxboosts.shtml +https://www.serebii.net/pokemonpokopia/cooking.shtml + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/tvl403fyhp06mr9md3kdvoh4) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12.md b/KaraKeep/2026-04-11-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12.md new file mode 100644 index 0000000..0c5d11f --- /dev/null +++ b/KaraKeep/2026-04-11-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12.md @@ -0,0 +1,39 @@ +--- +bookmark_id: "rcnl204q44seja2jqj6ffy4b" +url: | + https://www.youtube.com/watch?v=s-r9gSPGstc +title: | + (1) 【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12選 | ぽこあポケモン🌱 Pokopia 5×5 Build - YouTube +date: 2026-04-11T01:31:43.000Z +modified: 2026-04-11T01:33:57.000Z +tags: + - pokopia +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/5b39eaa9-68e6-45e0-86b6-85992eeefd0a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg]]" +screenshot: "[[KaraKeep/attachments/f084371d-f859-44b1-a0aa-e29f08919b2a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg]]" +additional: + - "[[KaraKeep/attachments/adc875e0-f5a9-4ad8-ae9e-787ed98fe852-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg]]" + +--- + +# (1) 【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12選 | ぽこあポケモン🌱 Pokopia 5×5 Build - YouTube + +![(1) 【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12選 | ぽこあポケモン🌱 Pokopia 5×5 Build - YouTube - Banner Image]() + +![(1) 【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12選 | ぽこあポケモン🌱 Pokopia 5×5 Build - YouTube - Screenshot]() + +![(1) 【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12選 | ぽこあポケモン🌱 Pokopia 5×5 Build - YouTube - linkHtmlContent]() + +## Description + +5×5のスペースで収まる小さなレイアウトを12個考えましたすべて生息地つきでデザインしています!街づくりをしているとエリアの間にちょっとした隙間が空いて困ることってありますよねそんな悩みを解決したい!という気持ちから生まれた動画ですみなさんの快適なぽこポケライフのヒントになればうれしいです🍃‥TimeStamp… + +## Notes + + + +[Visit Link](https://www.youtube.com/watch?v=s-r9gSPGstc) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/rcnl204q44seja2jqj6ffy4b) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-Docker-Support-Libation.md b/KaraKeep/2026-04-11-Docker-Support-Libation.md new file mode 100644 index 0000000..957dfc7 --- /dev/null +++ b/KaraKeep/2026-04-11-Docker-Support-Libation.md @@ -0,0 +1,34 @@ +--- +bookmark_id: "f4r38014bgntyjnb6c70a0fh" +url: | + https://getlibation.com/docs/installation/docker#configuration +title: | + Docker Support | Libation +date: 2026-04-11T04:26:34.000Z +modified: 2026-04-11T04:30:28.000Z +note: +original_note: +summary: +screenshot: "[[KaraKeep/attachments/72b0e584-0e3c-4cfc-a87a-baf08c234bfc-Docker-Support-Libation.jpg]]" +additional: + - "[[KaraKeep/attachments/40c1a048-1ee3-4e6b-a634-21dfefa2e23b-Docker-Support-Libation.jpg]]" + +--- + +# Docker Support | Libation + +![Docker Support | Libation - Screenshot](KaraKeep/attachments/72b0e584-0e3c-4cfc-a87a-baf08c234bfc-Docker-Support-Libation.jpg) + +![Docker Support | Libation - linkHtmlContent](KaraKeep/attachments/40c1a048-1ee3-4e6b-a634-21dfefa2e23b-Docker-Support-Libation.jpg) + +## Description + +Libation: Liberate your Library - A free application for downloading your Audible audiobooks + +## Notes + + + +[Visit Link](https://getlibation.com/docs/installation/docker#configuration) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/f4r38014bgntyjnb6c70a0fh) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-MISAMARU-on-X-”アメスリ着物が新登場!.md b/KaraKeep/2026-04-11-MISAMARU-on-X-”アメスリ着物が新登場!.md new file mode 100644 index 0000000..31a5b1c --- /dev/null +++ b/KaraKeep/2026-04-11-MISAMARU-on-X-”アメスリ着物が新登場!.md @@ -0,0 +1,52 @@ +--- +bookmark_id: "cfhgnem2glamjmr3ryjahx4g" +url: | + https://fxtwitter.com/i/status/2041841184675655975/ +title: | + MISAMARU on X: ”アメスリ着物が新登場! + ジレにもなる袖なしスタイルが涼しい✨ + 4月10日(金)21時より予約販売開始! ブラック + https://t.co/BlZlWs7V0Q ホワイト + https://t.co/S3FmeBHciE https://t.co/yZxt70OAll” / X +date: 2026-04-11T02:52:10.000Z +modified: 2026-04-11T04:20:01.000Z +tags: + - aesthetics + - Japanese-culture + - fashion + - celebrity-endorsements + - kimono + - misamaru_kimono +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/354ff041-f416-4257-bcb8-381ba3b329d2-MISAMARU-on-X-”アメスリ着物が新登場!.jpg]]" +screenshot: "[[KaraKeep/attachments/5d3201eb-6a52-4c4f-9a88-c59f54128e9e-MISAMARU-on-X-”アメスリ着物が新登場!.jpg]]" + +--- + +# MISAMARU on X: ”アメスリ着物が新登場! +ジレにもなる袖なしスタイルが涼しい✨ +4月10日(金)21時より予約販売開始! ブラック +https://t.co/BlZlWs7V0Q ホワイト +https://t.co/S3FmeBHciE https://t.co/yZxt70OAll” / X + +![MISAMARU on X: ”アメスリ着物が新登場! +ジレにもなる袖なしスタイルが涼しい✨ +4月10日(金)21時より予約販売開始! ブラック +https://t.co/BlZlWs7V0Q ホワイト +https://t.co/S3FmeBHciE https://t.co/yZxt70OAll” / X - Banner Image](KaraKeep/attachments/354ff041-f416-4257-bcb8-381ba3b329d2-MISAMARU-on-X-”アメスリ着物が新登場!.jpg) + +![MISAMARU on X: ”アメスリ着物が新登場! +ジレにもなる袖なしスタイルが涼しい✨ +4月10日(金)21時より予約販売開始! ブラック +https://t.co/BlZlWs7V0Q ホワイト +https://t.co/S3FmeBHciE https://t.co/yZxt70OAll” / X - Screenshot](KaraKeep/attachments/5d3201eb-6a52-4c4f-9a88-c59f54128e9e-MISAMARU-on-X-”アメスリ着物が新登場!.jpg) + +## Notes + + + +[Visit Link](https://fxtwitter.com/i/status/2041841184675655975/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/cfhgnem2glamjmr3ryjahx4g) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.md b/KaraKeep/2026-04-11-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.md new file mode 100644 index 0000000..cf27c0a --- /dev/null +++ b/KaraKeep/2026-04-11-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.md @@ -0,0 +1,47 @@ +--- +bookmark_id: "v446j5bjtso0k16hybkzqldz" +url: | + https://fxtwitter.com/i/status/2041489065024139600/ +title: | + MISAMARU on X: ”博物館行く日の和洋折衷コーデ。 + 深緑のショート丈羽織と袴スカートのセットアップ×編み上げブーツの組み合わせが大好き✨ https://t.co/87MgZcrwaB” / X +date: 2026-04-11T02:52:02.000Z +modified: 2026-04-11T04:19:53.000Z +tags: + - aesthetics + - trends + - social-media + - japan + - x + - fashion + - kimono + - outfit +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/25d4bf4a-920f-4dee-8c8f-99db98f7acb3-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg]]" +screenshot: "[[KaraKeep/attachments/26c6d686-3ea2-41e7-a6d4-0f5eb46f4a05-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg]]" +additional: + - "[[KaraKeep/attachments/0af8176f-9e8b-4622-bd0c-2cd32acc0ea2-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg]]" + +--- + +# MISAMARU on X: ”博物館行く日の和洋折衷コーデ。 +深緑のショート丈羽織と袴スカートのセットアップ×編み上げブーツの組み合わせが大好き✨ https://t.co/87MgZcrwaB” / X + +![MISAMARU on X: ”博物館行く日の和洋折衷コーデ。 +深緑のショート丈羽織と袴スカートのセットアップ×編み上げブーツの組み合わせが大好き✨ https://t.co/87MgZcrwaB” / X - Banner Image](KaraKeep/attachments/25d4bf4a-920f-4dee-8c8f-99db98f7acb3-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg) + +![MISAMARU on X: ”博物館行く日の和洋折衷コーデ。 +深緑のショート丈羽織と袴スカートのセットアップ×編み上げブーツの組み合わせが大好き✨ https://t.co/87MgZcrwaB” / X - Screenshot](KaraKeep/attachments/26c6d686-3ea2-41e7-a6d4-0f5eb46f4a05-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg) + +![MISAMARU on X: ”博物館行く日の和洋折衷コーデ。 +深緑のショート丈羽織と袴スカートのセットアップ×編み上げブーツの組み合わせが大好き✨ https://t.co/87MgZcrwaB” / X - linkHtmlContent](KaraKeep/attachments/0af8176f-9e8b-4622-bd0c-2cd32acc0ea2-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg) + +## Notes + + + +[Visit Link](https://fxtwitter.com/i/status/2041489065024139600/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/v446j5bjtso0k16hybkzqldz) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-NO.S-PROJECT-on-X-”【pick-up】おでかけパニエ.md b/KaraKeep/2026-04-11-NO.S-PROJECT-on-X-”【pick-up】おでかけパニエ.md new file mode 100644 index 0000000..6807a9a --- /dev/null +++ b/KaraKeep/2026-04-11-NO.S-PROJECT-on-X-”【pick-up】おでかけパニエ.md @@ -0,0 +1,41 @@ +--- +bookmark_id: "dsu1bp81hlwd85lt6avahler" +url: | + https://fxtwitter.com/i/status/2042558227284660595/ +title: | + NO.S PROJECT on X: ”【pick up】おでかけパニエ ブラック フリルのボリュームだけでふわっふわの、ミニ丈仕様のパニエ。お手元のミニワンピースを、お気軽にシルエットチェンジ!フリルをチラッとのぞかせても可愛いアイテムです。 https://t.co/K3THUfI9tx” / X +date: 2026-04-11T02:51:47.000Z +modified: 2026-04-11T04:19:35.000Z +tags: + - fashion + - aesthetics + - social-media + - x-platform + - fashion-trends + - online-shopping + - product-promotion +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/bcfcfd90-a1b3-417c-9f1f-534017c06505-NO.S-PROJECT-on-X-”【pick.jpg]]" +screenshot: "[[KaraKeep/attachments/22fbb69c-5a4d-4dc8-bfa8-00e477fa865a-NO.S-PROJECT-on-X-”【pick.jpg]]" +additional: + - "[[KaraKeep/attachments/ac0e47fd-e093-4338-9ed7-c30a5e36eb51-NO.S-PROJECT-on-X-”【pick.jpg]]" + +--- + +# NO.S PROJECT on X: ”【pick up】おでかけパニエ ブラック フリルのボリュームだけでふわっふわの、ミニ丈仕様のパニエ。お手元のミニワンピースを、お気軽にシルエットチェンジ!フリルをチラッとのぞかせても可愛いアイテムです。 https://t.co/K3THUfI9tx” / X + +![NO.S PROJECT on X: ”【pick up】おでかけパニエ ブラック フリルのボリュームだけでふわっふわの、ミニ丈仕様のパニエ。お手元のミニワンピースを、お気軽にシルエットチェンジ!フリルをチラッとのぞかせても可愛いアイテムです。 https://t.co/K3THUfI9tx” / X - Banner Image](KaraKeep/attachments/bcfcfd90-a1b3-417c-9f1f-534017c06505-NO.S-PROJECT-on-X-”【pick.jpg) + +![NO.S PROJECT on X: ”【pick up】おでかけパニエ ブラック フリルのボリュームだけでふわっふわの、ミニ丈仕様のパニエ。お手元のミニワンピースを、お気軽にシルエットチェンジ!フリルをチラッとのぞかせても可愛いアイテムです。 https://t.co/K3THUfI9tx” / X - Screenshot](KaraKeep/attachments/22fbb69c-5a4d-4dc8-bfa8-00e477fa865a-NO.S-PROJECT-on-X-”【pick.jpg) + +![NO.S PROJECT on X: ”【pick up】おでかけパニエ ブラック フリルのボリュームだけでふわっふわの、ミニ丈仕様のパニエ。お手元のミニワンピースを、お気軽にシルエットチェンジ!フリルをチラッとのぞかせても可愛いアイテムです。 https://t.co/K3THUfI9tx” / X - linkHtmlContent](KaraKeep/attachments/ac0e47fd-e093-4338-9ed7-c30a5e36eb51-NO.S-PROJECT-on-X-”【pick.jpg) + +## Notes + + + +[Visit Link](https://fxtwitter.com/i/status/2042558227284660595/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/dsu1bp81hlwd85lt6avahler) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-NO.S-PROJECT-on-X-”【pick.md b/KaraKeep/2026-04-11-NO.S-PROJECT-on-X-”【pick.md new file mode 100644 index 0000000..cd5bfae --- /dev/null +++ b/KaraKeep/2026-04-11-NO.S-PROJECT-on-X-”【pick.md @@ -0,0 +1,37 @@ +--- +bookmark_id: "o0ryd65fgdii0ai3bna5v5ie" +url: | + https://fxtwitter.com/i/status/2042588409466609742/ +title: | + NO.S PROJECT on X: ”【pick up】淑女が纏うはんなりジャケット カーキ 和と洋がひとつになったようなショートジャケット。特徴的な着物スリーブが動くたびに波のように揺れ、肩から腕へと描く優雅なライン。 https://t.co/iUbZzxpHxp https://t.co/DMxQulY5Un” / X +date: 2026-04-11T02:51:55.000Z +modified: 2026-04-11T04:19:44.000Z +tags: + - fashion + - aesthetics + - x-twitter + - japanese-fashion + - vintage-clothing + - influencer-marketing + - celebrity-endorsements +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/8c2d8550-eb5b-4445-8fbd-e2a3cec8afed-NO.S-PROJECT-on-X-”【pick.jpg]]" +screenshot: "[[KaraKeep/attachments/fd9e5ed2-90f1-4c34-91a0-26164abe8b4b-NO.S-PROJECT-on-X-”【pick.jpg]]" + +--- + +# NO.S PROJECT on X: ”【pick up】淑女が纏うはんなりジャケット カーキ 和と洋がひとつになったようなショートジャケット。特徴的な着物スリーブが動くたびに波のように揺れ、肩から腕へと描く優雅なライン。 https://t.co/iUbZzxpHxp https://t.co/DMxQulY5Un” / X + +![NO.S PROJECT on X: ”【pick up】淑女が纏うはんなりジャケット カーキ 和と洋がひとつになったようなショートジャケット。特徴的な着物スリーブが動くたびに波のように揺れ、肩から腕へと描く優雅なライン。 https://t.co/iUbZzxpHxp https://t.co/DMxQulY5Un” / X - Banner Image](KaraKeep/attachments/8c2d8550-eb5b-4445-8fbd-e2a3cec8afed-NO.S-PROJECT-on-X-”【pick.jpg) + +![NO.S PROJECT on X: ”【pick up】淑女が纏うはんなりジャケット カーキ 和と洋がひとつになったようなショートジャケット。特徴的な着物スリーブが動くたびに波のように揺れ、肩から腕へと描く優雅なライン。 https://t.co/iUbZzxpHxp https://t.co/DMxQulY5Un” / X - Screenshot](KaraKeep/attachments/fd9e5ed2-90f1-4c34-91a0-26164abe8b4b-NO.S-PROJECT-on-X-”【pick.jpg) + +## Notes + + + +[Visit Link](https://fxtwitter.com/i/status/2042588409466609742/) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/o0ryd65fgdii0ai3bna5v5ie) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-Tnewties-トゥエンティーズ-on-X.md b/KaraKeep/2026-04-11-Tnewties-トゥエンティーズ-on-X.md new file mode 100644 index 0000000..f2f2b1a --- /dev/null +++ b/KaraKeep/2026-04-11-Tnewties-トゥエンティーズ-on-X.md @@ -0,0 +1,37 @@ +--- +bookmark_id: "mk99h8bonx5i91iidel3jkwe" +url: | + https://x.com/20s_tnewties/status/2042528261004292562?s=12 +title: | + Tnewties トゥエンティーズ on X: ”🍨🪞🥣🌿💶🐋🛋️ #TNEWTIES #トゥエンティーズ https://t.co/2GtqH8J4dl” / X +date: 2026-04-11T02:51:31.000Z +modified: 2026-04-11T04:19:26.000Z +tags: + - fashion + - aesthetics + - celebrity-news + - japanese-pop + - social-media + - entertainment + - trending-topics +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/24e279da-7bff-4101-b7c9-d3f26521fff9-Tnewties-トゥエンティーズ-on-X.jpg]]" +screenshot: "[[KaraKeep/attachments/6130328a-70a3-4888-8f93-67032d1d0ed8-Tnewties-トゥエンティーズ-on-X.jpg]]" + +--- + +# Tnewties トゥエンティーズ on X: ”🍨🪞🥣🌿💶🐋🛋️ #TNEWTIES #トゥエンティーズ https://t.co/2GtqH8J4dl” / X + +![Tnewties トゥエンティーズ on X: ”🍨🪞🥣🌿💶🐋🛋️ #TNEWTIES #トゥエンティーズ https://t.co/2GtqH8J4dl” / X - Banner Image](KaraKeep/attachments/24e279da-7bff-4101-b7c9-d3f26521fff9-Tnewties-トゥエンティーズ-on-X.jpg) + +![Tnewties トゥエンティーズ on X: ”🍨🪞🥣🌿💶🐋🛋️ #TNEWTIES #トゥエンティーズ https://t.co/2GtqH8J4dl” / X - Screenshot](KaraKeep/attachments/6130328a-70a3-4888-8f93-67032d1d0ed8-Tnewties-トゥエンティーズ-on-X.jpg) + +## Notes + + + +[Visit Link](https://x.com/20s_tnewties/status/2042528261004292562?s=12) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/mk99h8bonx5i91iidel3jkwe) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-V1ck3s-octo-fiesta-at-selfh.st.md b/KaraKeep/2026-04-11-V1ck3s-octo-fiesta-at-selfh.st.md new file mode 100644 index 0000000..092eeab --- /dev/null +++ b/KaraKeep/2026-04-11-V1ck3s-octo-fiesta-at-selfh.st.md @@ -0,0 +1,36 @@ +--- +bookmark_id: "imziz5n6ynwkjlzh2qk7fwwa" +url: | + https://github.com/V1ck3s/octo-fiesta?ref=selfh.st +title: V1ck3s/octo-fiesta at selfh.st +date: 2026-04-11T04:26:52.000Z +modified: 2026-04-11T04:32:29.000Z +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/a17cb29b-b676-46af-a98a-0ccb748479a5-V1ck3s-octo-fiesta-at.jpg]]" +screenshot: "[[KaraKeep/attachments/2d86c844-80f4-429a-97b8-2c26314b8173-V1ck3s-octo-fiesta-at.jpg]]" +additional: + - "[[KaraKeep/attachments/a1bbbe44-8e87-4e0d-a350-8a664828bb76-V1ck3s-octo-fiesta-at.jpg]]" + +--- + +# V1ck3s/octo-fiesta at selfh.st + +![V1ck3s/octo-fiesta at selfh.st - Banner Image](KaraKeep/attachments/a17cb29b-b676-46af-a98a-0ccb748479a5-V1ck3s-octo-fiesta-at.jpg) + +![V1ck3s/octo-fiesta at selfh.st - Screenshot](KaraKeep/attachments/2d86c844-80f4-429a-97b8-2c26314b8173-V1ck3s-octo-fiesta-at.jpg) + +![V1ck3s/octo-fiesta at selfh.st - linkHtmlContent](KaraKeep/attachments/a1bbbe44-8e87-4e0d-a350-8a664828bb76-V1ck3s-octo-fiesta-at.jpg) + +## Description + +A Subsonic API proxy server that transparently integrates multiple music streaming providers as sources. - V1ck3s/octo-fiesta + +## Notes + + + +[Visit Link](https://github.com/V1ck3s/octo-fiesta?ref=selfh.st) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/imziz5n6ynwkjlzh2qk7fwwa) \ No newline at end of file diff --git a/KaraKeep/2026-04-11-hjdhjd-prismcast-Chrome-based.md b/KaraKeep/2026-04-11-hjdhjd-prismcast-Chrome-based.md new file mode 100644 index 0000000..8084b71 --- /dev/null +++ b/KaraKeep/2026-04-11-hjdhjd-prismcast-Chrome-based.md @@ -0,0 +1,37 @@ +--- +bookmark_id: "fpkf9300meq7gskqb7iibqyh" +url: | + https://github.com/hjdhjd/prismcast +title: | + hjdhjd/prismcast: Chrome-based streaming server for Channels DVR and Plex. +date: 2026-04-11T04:26:20.000Z +modified: 2026-04-11T04:28:28.000Z +note: +original_note: +summary: +banner: "[[KaraKeep/attachments/3bc47f18-90a6-464c-b555-5f76fea3e9e0-hjdhjd-prismcast-Chrome-based.jpg]]" +screenshot: "[[KaraKeep/attachments/061660d5-dd80-47f4-a542-99fa550f7f9a-hjdhjd-prismcast-Chrome-based.jpg]]" +additional: + - "[[KaraKeep/attachments/1c94c9f7-3851-4a1d-ba42-da21622bbd0e-hjdhjd-prismcast-Chrome-based.jpg]]" + +--- + +# hjdhjd/prismcast: Chrome-based streaming server for Channels DVR and Plex. + +![hjdhjd/prismcast: Chrome-based streaming server for Channels DVR and Plex. - Banner Image](KaraKeep/attachments/3bc47f18-90a6-464c-b555-5f76fea3e9e0-hjdhjd-prismcast-Chrome-based.jpg) + +![hjdhjd/prismcast: Chrome-based streaming server for Channels DVR and Plex. - Screenshot](KaraKeep/attachments/061660d5-dd80-47f4-a542-99fa550f7f9a-hjdhjd-prismcast-Chrome-based.jpg) + +![hjdhjd/prismcast: Chrome-based streaming server for Channels DVR and Plex. - linkHtmlContent](KaraKeep/attachments/1c94c9f7-3851-4a1d-ba42-da21622bbd0e-hjdhjd-prismcast-Chrome-based.jpg) + +## Description + +Chrome-based streaming server for Channels DVR and Plex. - hjdhjd/prismcast + +## Notes + + + +[Visit Link](https://github.com/hjdhjd/prismcast) + +[View in Hoarder](https://kara.werats.gay/dashboard/preview/fpkf9300meq7gskqb7iibqyh) \ No newline at end of file diff --git a/KaraKeep/attachments/01c8ffb7-7143-4455-891e-1e88f1291d49-soup-soup-soup.jpg b/KaraKeep/attachments/01c8ffb7-7143-4455-891e-1e88f1291d49-soup-soup-soup.jpg new file mode 100644 index 0000000..2c7a510 Binary files /dev/null and b/KaraKeep/attachments/01c8ffb7-7143-4455-891e-1e88f1291d49-soup-soup-soup.jpg differ diff --git a/KaraKeep/attachments/061660d5-dd80-47f4-a542-99fa550f7f9a-hjdhjd-prismcast-Chrome-based.jpg b/KaraKeep/attachments/061660d5-dd80-47f4-a542-99fa550f7f9a-hjdhjd-prismcast-Chrome-based.jpg new file mode 100644 index 0000000..622b75b Binary files /dev/null and b/KaraKeep/attachments/061660d5-dd80-47f4-a542-99fa550f7f9a-hjdhjd-prismcast-Chrome-based.jpg differ diff --git a/KaraKeep/attachments/07d88e96-1c67-45a0-b42d-4c40ed8d2742-armv6k-nintendo-3ds-The-rustc.jpg b/KaraKeep/attachments/07d88e96-1c67-45a0-b42d-4c40ed8d2742-armv6k-nintendo-3ds-The-rustc.jpg new file mode 100644 index 0000000..fc775a5 Binary files /dev/null and b/KaraKeep/attachments/07d88e96-1c67-45a0-b42d-4c40ed8d2742-armv6k-nintendo-3ds-The-rustc.jpg differ diff --git a/KaraKeep/attachments/0af8176f-9e8b-4622-bd0c-2cd32acc0ea2-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg b/KaraKeep/attachments/0af8176f-9e8b-4622-bd0c-2cd32acc0ea2-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg new file mode 100644 index 0000000..cdda130 --- /dev/null +++ b/KaraKeep/attachments/0af8176f-9e8b-4622-bd0c-2cd32acc0ea2-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg @@ -0,0 +1,2 @@ +

Don’t miss what’s happening

People on X are the first to know.

Post

Conversation

New to X?

Sign up now to get your own personalized timeline!

By signing up, you agree to the Terms of Service and Privacy Policy, including Cookie Use.

Trending now

What’s happening

Music · Trending

中島裕翔

Trending worldwide

裕翔結婚

Trending worldwide

結婚発表

Sports · Trending

マンシー

\ No newline at end of file diff --git a/KaraKeep/attachments/110ae728-0c19-4502-a2df-ee7c897fd657-Dr.-Ahmad-Al-Khatib,-MD,.jpg b/KaraKeep/attachments/110ae728-0c19-4502-a2df-ee7c897fd657-Dr.-Ahmad-Al-Khatib,-MD,.jpg new file mode 100644 index 0000000..6d37373 Binary files /dev/null and b/KaraKeep/attachments/110ae728-0c19-4502-a2df-ee7c897fd657-Dr.-Ahmad-Al-Khatib,-MD,.jpg differ diff --git a/KaraKeep/attachments/137010df-57bf-43b4-a5e3-acfc3ca97c19-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg b/KaraKeep/attachments/137010df-57bf-43b4-a5e3-acfc3ca97c19-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/137010df-57bf-43b4-a5e3-acfc3ca97c19-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg differ diff --git a/KaraKeep/attachments/1b12aab0-bae6-46c7-bd58-89e25e60eded-Lake-Como,-Italy-Banner-Image.jpg b/KaraKeep/attachments/1b12aab0-bae6-46c7-bd58-89e25e60eded-Lake-Como,-Italy-Banner-Image.jpg new file mode 100644 index 0000000..c72c6ed Binary files /dev/null and b/KaraKeep/attachments/1b12aab0-bae6-46c7-bd58-89e25e60eded-Lake-Como,-Italy-Banner-Image.jpg differ diff --git a/KaraKeep/attachments/1c40397d-ae7d-4dd9-a50c-d35b8c581399-Catalytic-Converter-for.jpg b/KaraKeep/attachments/1c40397d-ae7d-4dd9-a50c-d35b8c581399-Catalytic-Converter-for.jpg new file mode 100644 index 0000000..1985ffc Binary files /dev/null and b/KaraKeep/attachments/1c40397d-ae7d-4dd9-a50c-d35b8c581399-Catalytic-Converter-for.jpg differ diff --git a/KaraKeep/attachments/1c94c9f7-3851-4a1d-ba42-da21622bbd0e-hjdhjd-prismcast-Chrome-based.jpg b/KaraKeep/attachments/1c94c9f7-3851-4a1d-ba42-da21622bbd0e-hjdhjd-prismcast-Chrome-based.jpg new file mode 100644 index 0000000..1486a06 --- /dev/null +++ b/KaraKeep/attachments/1c94c9f7-3851-4a1d-ba42-da21622bbd0e-hjdhjd-prismcast-Chrome-based.jpg @@ -0,0 +1,427 @@ +
+ + +

PrismCast captures live video from web-based TV streaming sites and delivers it as HLS streams for Channels DVR and as MPEG-TS streams for Plex via builtin HDHomeRun emulation. It uses Google Chrome to navigate to streaming sites, captures the video output, and serves it on your network. Most channels require a cable or streaming TV subscription - log in once with your TV provider credentials and Chrome remembers your session for future use.

+

This project is inspired by and builds upon the excellent work of Chrome Capture for Channels by the Channels DVR team. I'm grateful to them for creating the original foundation that made PrismCast possible.

+

The name PrismCast reflects what the project does: like a prism transforming light into a spectrum of colors, PrismCast takes video from diverse streaming sources and refracts it into a unified HLS format for your DVR.

+

Features

+

Channels and Streaming

+
    +
  • 8 builtin providers - Hulu, YouTube TV, Sling TV, Fox, HBO Max, DirecTV Stream, Spectrum TV, and Xfinity Stream with hundreds of preconfigured channels ready to stream. Just authenticate with your TV provider and you're ready to go.
  • +
  • Native HLS streaming - For TV Everywhere sites that deliver non-DRMed streams, PrismCast automatically bypasses screen capture and consumes the stream directly — delivering full provider quality with significantly lower CPU usage. This is especially valuable for Hulu + Live TV subscribers who can use their TVE credentials to stream channels like A&E, Food Network, HGTV, History, Discovery, and many more at native quality through those networks' own sites. Also works with Fox One, Fox Sports, BET, C-SPAN, VH1, and others. DRM-protected providers automatically fall back to screen capture.
  • +
  • User-defined provider profiles - Add support for any streaming site without waiting for a builtin update. A step-by-step builder wizard guides you through profile creation, and shareable provider packs let you export and import complete provider setups.
  • +
  • Custom channel support - Easily add your own streaming sources through the web interface, from YouTube live streams to niche international channels. If a site plays video in Chrome, there's a good chance PrismCast can capture it.
  • +
  • Plex integration - Builtin HDHomeRun emulation lets Plex discover PrismCast as a network tuner. Add it as a DVR source in Plex for live TV and recording.
  • +
  • Multiple concurrent streams - Stream up to 10 channels simultaneously (configurable), perfect for recording multiple shows at once.
  • +
  • Session persistence - Log in to your TV provider once and Chrome remembers your session across restarts.
  • +
  • Quality presets - Choose from 480p to 1080p presets that set the Chrome viewport dimensions. These presets influence the resolution that providers deliver, though Chrome and the provider ultimately determine the actual stream quality.
  • +
+

Web Interface

+
    +
  • Real-time dashboard - Monitor all active streams with live health status, duration, memory usage, and (when recording via Channels DVR) the name of the show being recorded.
  • +
  • Channel health indicators - Green/red status dots and provider authentication badges show at-a-glance which channels are working and which providers are logged in.
  • +
  • Channel management - Add, edit, and delete custom channels directly in the browser. No config files to edit.
  • +
  • Live log viewer - Stream server logs in real-time with level filtering, perfect for troubleshooting.
  • +
  • Configuration UI - Adjust all settings through an intuitive web interface with instant validation.
  • +
  • Dark mode - Automatic dark theme based on your system preferences.
  • +
  • Backup and restore - Download your settings and channels for safekeeping, restore them anytime.
  • +
+

Reliability

+
    +
  • Intelligent playback recovery - Issue-aware recovery system that chooses the right fix for different problems. Buffering issues get different treatment than paused playback.
  • +
  • Resolution degradation detection - Monitors video quality and recovers automatically when the stream drops to a lower resolution than expected.
  • +
  • Predictive pretuning - Reads the Channels DVR programming schedule and pre-tunes upcoming channels before recordings start, reducing tune latency to near zero.
  • +
  • Circuit breaker protection - Streams that fail repeatedly are automatically terminated, preventing resource exhaustion.
  • +
  • Health monitoring - Builtin /health endpoint for integration with monitoring systems.
  • +
  • Graceful degradation - If your display can't support your chosen quality preset, PrismCast automatically uses the best available resolution.
  • +
+

Technical

+
    +
  • Native HLS segmentation - Builtin fMP4 segmenter with no external dependencies for segment generation.
  • +
  • FFmpeg capture - FFmpeg-based screen capture provides stable, reliable streaming for long recordings. Chrome also supports a native capture mode, but it is currently unavailable due to a long-standing Chrome bug that produces corrupt output after extended use.
  • +
  • Site profile system - Data-driven configuration for handling different streaming sites. Profiles define how to enter fullscreen, handle iframes, manage multi-channel players, and more. Adding support for a new site often requires just a few lines of configuration.
  • +
  • Gracenote integration - Channels can include station IDs for automatic guide data matching in Channels DVR.
  • +
  • MPEG-TS output - In addition to HLS, PrismCast serves MPEG-TS streams for HDHomeRun-compatible clients. FFmpeg remuxes fMP4 to MPEG-TS with codec copy (no transcoding).
  • +
  • Modern codebase - Clean TypeScript with ESM modules, full type safety, and comprehensive documentation.
  • +
+

Requirements

+
    +
  • macOS, Linux, or Windows - PrismCast is developed on macOS and also runs on Linux (natively or via Docker) and Windows.
  • +
  • Node.js 22 or later (not required for Docker deployment)
  • +
  • Google Chrome (PrismCast will try to find it automatically, or you can specify the path; included in the Docker image)
  • +
  • Channels DVR, Plex, or any client that can consume HLS or MPEG-TS streams
  • +
+

Installation

+

PrismCast can be installed via Homebrew on macOS, as a Node.js package on any platform, or deployed as a Docker container. For Docker, see Docker / Container Deployment below.

+

Homebrew (macOS)

+

The recommended way to install PrismCast on macOS:

+
brew install hjdhjd/prismcast/prismcast
+

To update to the latest version, use the builtin upgrade command or Homebrew directly:

+
prismcast upgrade
+# or: brew upgrade prismcast
+

npm (All Platforms)

+

PrismCast can also be installed globally as a Node.js package:

+
npm install -g prismcast
+

To upgrade to the latest version, use the builtin upgrade command or npm directly:

+
prismcast upgrade
+# or: npm install -g prismcast
+

Once installed, you can start PrismCast with:

+
prismcast
+

CLI Options

+
prismcast [options]
+
+Options:
+  -c, --console                   Log to console instead of file (for Docker or debugging)
+  -d, --debug                     Enable debug logging (verbose output for troubleshooting)
+  -h, --help                      Show this help message
+  -p, --port <port>               Set server port (default: 5589)
+  -v, --version                   Show version number
+  --chrome-data-dir <path>        Set Chrome profile data directory (default: <data-dir>/chromedata)
+  --data-dir <path>               Set data directory (default: ~/.prismcast)
+  --list-env                      List all environment variables
+  --log-file <path>               Set log file path (default: <data-dir>/prismcast.log)
+
+Subcommands:
+  prismcast service <action>      Manage the PrismCast service (install, uninstall, start, stop, restart, status)
+  prismcast upgrade [options]     Upgrade PrismCast to the latest version (--check, --force)
+
+

Running as a Service

+

After upgrading PrismCast, restart the service to pick up the new version. If PrismCast is running as a service, prismcast upgrade will restart it automatically.

+

For the best experience, install PrismCast as a service that starts automatically at login:

+
prismcast service install
+

This configures your system's service manager (launchd on macOS, systemd on Linux, Task Scheduler on Windows) to run PrismCast in the background.

+

Other service commands:

+
prismcast service status    # Check if the service is running
+prismcast service stop      # Stop the service
+prismcast service start     # Start the service
+prismcast service restart   # Restart the service
+prismcast service uninstall # Remove the service
+

Quick Start with Channels DVR

+
    +
  1. Start PrismCast and open http://localhost:5589 in your browser
  2. +
  3. Authenticate with your TV provider - Click "Login" on any channel that requires authentication, complete the login in the browser window that opens, then click "Done"
  4. +
  5. Add to Channels DVR: +
      +
    • Go to Settings → Custom Channels → Add Source
    • +
    • Select M3U Playlist
    • +
    • Enter: http://<your-prismcast-host>:5589/playlist
    • +
    • Set Stream Format to HLS
    • +
    +
  6. +
+

That's it! Your channels will appear in the Channels DVR guide. Channels with a channel number configured in PrismCast will include it in the playlist for guide mapping.

+

Quick Start with Plex

+

PrismCast includes builtin HDHomeRun emulation, allowing Plex to discover it as a network tuner.

+
    +
  1. Start PrismCast — HDHomeRun emulation starts automatically on port 5004
  2. +
  3. Add to Plex: +
      +
    • Go to Settings → Live TV & DVR → Set Up Plex DVR
    • +
    • Enter your PrismCast server address with the HDHR port: <your-prismcast-host>:5004
    • +
    • Plex will detect PrismCast as an HDHomeRun tuner and import available channels
    • +
    +
  4. +
  5. Authenticate — If channels require TV provider login, go to the PrismCast web interface at http://localhost:5589 and use the Channels tab to log in
  6. +
+

Configuration

+

PrismCast includes a web-based configuration interface at http://localhost:5589. From there you can:

+
    +
  • Manage channels - View all available channels, add your own custom channels, or override the defaults
  • +
  • Filter providers - Choose which streaming services are active in your environment and filter channels accordingly
  • +
  • Adjust quality settings - Choose from presets like 720p or 1080p
  • +
  • Configure HLS parameters - Segment duration, buffer size, idle timeout
  • +
  • Configure HDHomeRun - Enable or disable Plex integration, set the HDHR port and device name
  • +
  • Tune recovery behavior - Adjust how aggressively PrismCast recovers from playback issues
  • +
  • Backup and restore - Download your configuration for safekeeping
  • +
+

Configuration is stored in ~/.prismcast/config.json and your TV provider sessions are preserved in ~/.prismcast/chromedata/. These paths can be customized via CLI flags (--data-dir, --chrome-data-dir, --log-file) or environment variables — run prismcast --list-env to see all available options.

+

Platform Support

+

macOS is the primary development and testing platform. PrismCast is thoroughly tested on macOS and should work reliably there.

+

Linux is supported both natively and via Docker. The Docker image includes everything needed to run PrismCast (Chrome, virtual display, VNC access) and is the recommended approach for Linux server deployments. Native Linux installation works with Node.js and Google Chrome installed manually.

+

Windows is supported and users have reported success running PrismCast on Windows 11. Windows is not the primary development platform, so bug reports and pull requests are always appreciated.

+

Docker / Container Deployment

+

PrismCast provides a prebuilt Docker image with everything included: Google Chrome, a virtual display (Xvfb), VNC access, and a browser-based noVNC interface for managing TV provider authentication. The image is available on GitHub Container Registry.

+

Quick Start with Docker Compose

+

The repository includes a ready-to-use Docker Compose file. This is the recommended approach for Docker deployments.

+
    +
  1. Download the compose file and environment template:
  2. +
+
curl -O https://raw.githubusercontent.com/hjdhjd/prismcast/main/prismcast.yaml
+curl -O https://raw.githubusercontent.com/hjdhjd/prismcast/main/prismcast.env.example
+
    +
  1. Optionally, copy the environment template and customize it:
  2. +
+
cp prismcast.env.example prismcast.env
+
    +
  1. Start the container:
  2. +
+
docker compose -f prismcast.yaml up -d
+
    +
  1. Open http://localhost:5589 for the PrismCast web interface and http://localhost:6080/vnc.html for browser-based VNC access to Chrome.
  2. +
+

Quick Start with Docker Run

+

If you prefer not to use Docker Compose:

+
docker run -d \
+  --name prismcast \
+  --shm-size=2g \
+  -p 5589:5589 \
+  -p 5900:5900 \
+  -p 6080:6080 \
+  -p 5004:5004 \
+  -v prismcast-data:/root/.prismcast \
+  ghcr.io/hjdhjd/prismcast:latest
+

Ports

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortServiceDescription
5589PrismCastWeb interface and HLS/MPEG-TS streaming
5900VNCDirect VNC access to the Chrome browser
6080noVNCBrowser-based VNC access (no VNC client needed)
5004HDHomeRunHDHomeRun emulation for Plex
+

TV Provider Authentication

+

TV provider authentication requires interacting with the Chrome browser running inside the container. The container includes two builtin options:

+
    +
  1. noVNC (recommended) - Open http://localhost:6080/vnc.html in any browser for a web-based view of the Chrome instance. No VNC client needed. Use this to complete TV provider logins, then return to the PrismCast web interface and click "Done" on the channel.
  2. +
  3. VNC - Connect any VNC client to localhost:5900 for direct access. Set the NOVNC_PASSWORD environment variable to require a password for VNC connections.
  4. +
+

Your TV provider sessions are stored in the persistent volume and survive container restarts.

+

Display Resolution

+

The virtual display resolution must match or exceed your configured quality preset. The default is 1920x1080, which supports all presets up to 1080p High. Adjust SCREEN_WIDTH and SCREEN_HEIGHT if you need a different resolution.

+ + + + + + + + + + + + + + + + + + + + + +
PresetMinimum Resolution
480p854x480
720p / 720p High1280x720
1080p / 1080p High1920x1080
+

GPU Acceleration

+

The Docker image supports Intel GPU hardware acceleration for significantly lower CPU usage. If your host has an Intel GPU with Quick Sync Video support, pass the GPU device to the container:

+
# In your Docker Compose file:
+devices:
+  - /dev/dri:/dev/dri
+

Or with docker run:

+
docker run -d \
+  --name prismcast \
+  --shm-size=2g \
+  --device /dev/dri:/dev/dri \
+  -p 5589:5589 -p 5900:5900 -p 6080:6080 -p 5004:5004 \
+  -v prismcast-data:/root/.prismcast \
+  ghcr.io/hjdhjd/prismcast:latest
+

The container auto-detects the GPU and configures VA-API acceleration. The default driver (iHD) supports Intel Gen 9 (Skylake) and newer. For older Intel hardware, set LIBVA_DRIVER_NAME=i965. When no GPU is present, the container falls back to software rendering automatically.

+

Container Environment Variables

+

The container accepts environment variables for both the virtual display and PrismCast itself. Display variables are set in the compose file's environment: section or via -e flags with docker run. PrismCast variables can be set the same way.

+

Display and VNC:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableDefaultDescription
DISPLAY_NUM99X11 display number
SCREEN_WIDTH1920Virtual display width in pixels
SCREEN_HEIGHT1080Virtual display height in pixels
SCREEN_DEPTH24Virtual display color depth
NOVNC_PASSWORD(none)Password for VNC/noVNC access. If unset, VNC is open without authentication.
LIBVA_DRIVER_NAMEiHDIntel VA-API driver. Use i965 for pre-Skylake hardware. Only relevant when GPU is passed through.
+

PrismCast:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableDefaultDescription
PORT5589HTTP server port
HOST0.0.0.0HTTP server bind address
CHROME_BIN(auto)Path to Chrome executable
QUALITY_PRESET720p-highVideo quality: 480p, 720p, 720p-high, 1080p, 1080p-high
VIDEO_BITRATE12000000Video bitrate in bps
AUDIO_BITRATE256000Audio bitrate in bps
FRAME_RATE60Target frame rate
HDHR_ENABLEDtrueEnable HDHomeRun emulation for Plex
HDHR_PORT5004HDHomeRun emulation server port
HDHR_FRIENDLY_NAMEPrismCastDevice name shown in Plex
HLS_SEGMENT_DURATION2HLS segment duration in seconds
HLS_MAX_SEGMENTS10Maximum segments kept in memory per stream
HLS_IDLE_TIMEOUT30000Idle stream timeout in milliseconds
MAX_CONCURRENT_STREAMS10Maximum simultaneous streams
PRISMCAST_DATA_DIR/root/.prismcastData directory for configuration, channels, and logs
PRISMCAST_CHROME_DATA_DIR(data-dir)/chromedataChrome profile directory for TV provider sessions
PRISMCAST_LOG_FILE(data-dir)/prismcast.logLog file path
+

Run prismcast --list-env inside the container for a complete listing of all available environment variables.

+

Persistent Storage

+

The compose file mounts a Docker volume at /root/.prismcast, which stores:

+
    +
  • Configuration - config.json with all PrismCast settings
  • +
  • Custom channels - channels.json with user-defined channel definitions
  • +
  • Chrome profile - TV provider login sessions and cookies
  • +
  • Logs - prismcast.log for troubleshooting
  • +
+

This volume persists across container restarts and image updates. Back up this volume to preserve your configuration and login sessions.

+

Updating

+

To update to the latest PrismCast image using Docker Compose:

+
docker compose -f prismcast.yaml pull
+docker compose -f prismcast.yaml up -d
+

If you use docker run, pull the latest image and recreate the container:

+
docker pull ghcr.io/hjdhjd/prismcast:latest
+

Then re-run your original docker run command. The persistent volume preserves your configuration, channels, and login sessions across updates.

+

Building from Source

+

If you prefer to build the Docker image yourself:

+
git clone https://github.com/hjdhjd/prismcast.git
+cd prismcast
+docker buildx build --platform linux/amd64 -f Dockerfile -t prismcast:local .
+

Then use prismcast:local as the image name in your compose file or docker run command.

+

Contributing

+

Contributions are welcome! Whether it's bug reports, feature requests, new channel definitions, or pull requests, I appreciate your interest in improving PrismCast. If you've got a streaming site that works well with PrismCast, consider submitting a pull request to add it to the preconfigured channels.

+

License

+

ISC License

+

Copyright (c) 2024-2026 HJD

+

Acknowledgments

+

Special thanks to the Channels DVR team for creating such a wonderful DVR platform and for their work on Chrome Capture for Channels, which inspired this project.

+

Development Dashboard

+

This is mostly of interest to the true developer nerds amongst us.

+

License +Build Status +Dependencies +GitHub commits since latest release

+
\ No newline at end of file diff --git a/KaraKeep/attachments/1e1ad172-26b3-4c81-884c-a51cee7bd6e1-Reblog-by-@thevisualvamp-·-1.jpg b/KaraKeep/attachments/1e1ad172-26b3-4c81-884c-a51cee7bd6e1-Reblog-by-@thevisualvamp-·-1.jpg new file mode 100644 index 0000000..5e3ebbd Binary files /dev/null and b/KaraKeep/attachments/1e1ad172-26b3-4c81-884c-a51cee7bd6e1-Reblog-by-@thevisualvamp-·-1.jpg differ diff --git a/KaraKeep/attachments/22fbb69c-5a4d-4dc8-bfa8-00e477fa865a-NO.S-PROJECT-on-X-”【pick.jpg b/KaraKeep/attachments/22fbb69c-5a4d-4dc8-bfa8-00e477fa865a-NO.S-PROJECT-on-X-”【pick.jpg new file mode 100644 index 0000000..b66dfd0 Binary files /dev/null and b/KaraKeep/attachments/22fbb69c-5a4d-4dc8-bfa8-00e477fa865a-NO.S-PROJECT-on-X-”【pick.jpg differ diff --git a/KaraKeep/attachments/24e279da-7bff-4101-b7c9-d3f26521fff9-Tnewties-トゥエンティーズ-on-X.jpg b/KaraKeep/attachments/24e279da-7bff-4101-b7c9-d3f26521fff9-Tnewties-トゥエンティーズ-on-X.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/24e279da-7bff-4101-b7c9-d3f26521fff9-Tnewties-トゥエンティーズ-on-X.jpg differ diff --git a/KaraKeep/attachments/253497dc-0e09-43fc-ba19-35d6896403fd-Shota-Ashida-on-Instagram.jpg b/KaraKeep/attachments/253497dc-0e09-43fc-ba19-35d6896403fd-Shota-Ashida-on-Instagram.jpg new file mode 100644 index 0000000..015296a Binary files /dev/null and b/KaraKeep/attachments/253497dc-0e09-43fc-ba19-35d6896403fd-Shota-Ashida-on-Instagram.jpg differ diff --git a/KaraKeep/attachments/25d4bf4a-920f-4dee-8c8f-99db98f7acb3-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg b/KaraKeep/attachments/25d4bf4a-920f-4dee-8c8f-99db98f7acb3-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/25d4bf4a-920f-4dee-8c8f-99db98f7acb3-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg differ diff --git a/KaraKeep/attachments/26c6d686-3ea2-41e7-a6d4-0f5eb46f4a05-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg b/KaraKeep/attachments/26c6d686-3ea2-41e7-a6d4-0f5eb46f4a05-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg new file mode 100644 index 0000000..6b18dbf Binary files /dev/null and b/KaraKeep/attachments/26c6d686-3ea2-41e7-a6d4-0f5eb46f4a05-MISAMARU-on-X-”博物館行く日の和洋折衷コーデ。.jpg differ diff --git a/KaraKeep/attachments/274b6b25-3992-4802-ad38-2a9b9c7d14b3-Post-by-@catchymemes-·-1.jpg b/KaraKeep/attachments/274b6b25-3992-4802-ad38-2a9b9c7d14b3-Post-by-@catchymemes-·-1.jpg new file mode 100644 index 0000000..68a7d2e --- /dev/null +++ b/KaraKeep/attachments/274b6b25-3992-4802-ad38-2a9b9c7d14b3-Post-by-@catchymemes-·-1.jpg @@ -0,0 +1,2 @@ +

Avatar

The image captures the miraculous moment when the rays of sun hit a rare cloud called a pile cloud, and the angle and other subtle conditions are reflected in a divine rainbow color. (Source)

42,696 notes

Avatar

Gay Clouds! Who'd have thought?!

Avatar

That’s astonishing. I had no idea that could occur.

Avatar

rainbow road from Mario Cart!

Avatar

Avatar

ALL HAIL THE GLOW CLOUD

Avatar

ALL HAIL

Avatar

Avatar

Who activated the Bifrost?

Avatar

god putting a dvd in his recorder

Avatar

Wow!

Avatar

Is a good afertnood

Avatar

I would die

Avatar

Avatar

these clouds ate 💅🏾

Avatar

beautiful ranbow

Avatar

Can you imagine what the ancients thought when they saw this?!?

Avatar

Isn't nature amazing

Avatar

It would have figured.

Avatar

So beautiful! It's nice that you have captured this on film!! For posterity! Might not happen again.

Avatar

Thought that was the gay nuke, for a moment.

Avatar

Cool!

Avatar

Thank you for the history lesson. I know there's something you can learn everyday even littlle. + but this is extraordinary.

Avatar

Avatar

Mother nature supporting us the gays

Avatar

ALL. HAIL. THE. GLOW. CLOUD.

Avatar

Oh look its a gaylo (a gay halo)

Avatar

Shame it’s not real :(

Avatar

@robclemz what do you mean? Did the most rudimentary search on pileus clouds and rainbow, found tons of supporting sources, including one from NASA. https://science.nasa.gov/iridescent-pileus-cloud-over-china it’s called cloud iridescence and it is very much real, just rare.

Avatar

@blueandbluer oh, it’s a real phenomenon, but these videos aren’t real unfortunately.

Avatar

Not clouds, light beings they already here to save us and ready disclose ✨

Avatar

Amazing

Avatar

Avatar

third impact

Avatar

All hail

Avatar

That there's a sonic rainboom

Avatar

Omfg guys it's God's rainbow pool!!!

Avatar

I want to see one in person. That's amazingly beautiful 😍 🌈☁️

Avatar

ALL HAIL

Avatar

Avatar

THAT IS SO COOL WOAHH 😯 THANK YOU BB 💛

Avatar

ALL HAIL!!!!

Avatar

Oh man I came across this a while ago and turns out that while cloud iridescence exists, these particular videos are not real 😔 They're composed from existing photos and exaggerated.

Avatar

Aww shit

Avatar

A L L H A I L

Avatar

Holy shit

\ No newline at end of file diff --git a/KaraKeep/attachments/2afc00ea-3eb0-4b30-9926-9e9be37a0492-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg b/KaraKeep/attachments/2afc00ea-3eb0-4b30-9926-9e9be37a0492-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg new file mode 100644 index 0000000..511a96b Binary files /dev/null and b/KaraKeep/attachments/2afc00ea-3eb0-4b30-9926-9e9be37a0492-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg differ diff --git a/KaraKeep/attachments/2d58a9f3-0a16-411b-95b1-4adcc8bc92ed-Sorry-2026,-the-’90s-Did.jpg b/KaraKeep/attachments/2d58a9f3-0a16-411b-95b1-4adcc8bc92ed-Sorry-2026,-the-’90s-Did.jpg new file mode 100644 index 0000000..0de82b5 Binary files /dev/null and b/KaraKeep/attachments/2d58a9f3-0a16-411b-95b1-4adcc8bc92ed-Sorry-2026,-the-’90s-Did.jpg differ diff --git a/KaraKeep/attachments/2d86c844-80f4-429a-97b8-2c26314b8173-V1ck3s-octo-fiesta-at.jpg b/KaraKeep/attachments/2d86c844-80f4-429a-97b8-2c26314b8173-V1ck3s-octo-fiesta-at.jpg new file mode 100644 index 0000000..d6bc242 Binary files /dev/null and b/KaraKeep/attachments/2d86c844-80f4-429a-97b8-2c26314b8173-V1ck3s-octo-fiesta-at.jpg differ diff --git a/KaraKeep/attachments/2e3a5c92-e8e3-40e3-9469-09f5abaf2b8c-Ingredient-Flavors.jpg b/KaraKeep/attachments/2e3a5c92-e8e3-40e3-9469-09f5abaf2b8c-Ingredient-Flavors.jpg new file mode 100644 index 0000000..1ff1055 Binary files /dev/null and b/KaraKeep/attachments/2e3a5c92-e8e3-40e3-9469-09f5abaf2b8c-Ingredient-Flavors.jpg differ diff --git a/KaraKeep/attachments/2e755ad8-ce5f-4fb7-a3fa-d2e1391a54b7-IPv6-Network-(Auto).jpg b/KaraKeep/attachments/2e755ad8-ce5f-4fb7-a3fa-d2e1391a54b7-IPv6-Network-(Auto).jpg new file mode 100644 index 0000000..78a5c0b --- /dev/null +++ b/KaraKeep/attachments/2e755ad8-ce5f-4fb7-a3fa-d2e1391a54b7-IPv6-Network-(Auto).jpg @@ -0,0 +1,247 @@ +
+ + +

In my previous article, IPv6 Tunneling over IPv4 Networks, I +discussed how to connect a LAN to the IPv6 public Internet. This article +continues the theme, discussing the issues surrounding the LAN’s configuration +for IPv6.

+ +

Looking at how LAN’s are configured for IPv4 proves to be instructive. Many of +the techniques, and all of the patterns turn out to have parallels in IPv6. +During the design of IPv6 engineers took the opportunity for refactoring using +lessons learned from IPv4. Initial host configuration was an area that received +some attention, and so, we will explore the new methods provided by IPv6 as well +as the traditional techniques carried forward from IPv4.

+ +

Network Autoconfiguration

+ +

The goal here is to identify how hosts joining an IPv6 network can come to +discover and then interoperate on that network. The network may also have +IPv4, but it should not be required. Specifically, the goal is to show how +hosts can, with emphasis towards automation, configure themselves on an IPv6 +only network. The same (pre)configuration should also work if the network +happens to support IPv4, and the hosts should then configure and join the IPv4 +network as well.

+ +

There are two use cases that are used to vet the proposed methods. The first is +the “small lab” use case. Think of a small, less than 100 hosts, lab +environment, or SOHO office. In this sort of environment some of the hosts are +very dynamic, and some are more static with specific functions assigned to them; +for instance, a mail, or IRC server. The second use case is the prototype +environment for a distributed application. Often such environments are created +with VM’s using tools such as Vagrant inside a +developer’s laptop. Such environments can be paused and restarted, relocated, +and the hosts are often destroyed and recreated for a “fresh install”. In both +cases, formal rigor in configuring and maintaining the network are not as +important as a degree of automation combined with flexibility to manually adjust +things as needed for the task at hand.

+ +

In an IPv4 world, DHCP combined with DNS are the go-to tools for such +configuration. As luck has it, both are available in the IPv6 world as +well. DNS remains unchanged, except for the addition of the AAAA record that +holds IPv6 addresses; AAAA records are retrievable via IPv4 as well. DHCP +functions the same, but the specifics are adapted for IPv6 and to disambiguate, +it is known as DHCPv6; there is a separate RFC: RFC-3315.

+ +

IPv6 Autoconfiguration

+ +

During the design of IPv6, then codenamed ‘IPng’, the design of +“autoconfiguration” for IP was refactored to support a more automated method by +which hosts could join an IPv6 network. In the base IPv4 protocol there is no +explicit support for autoconfiguration. In IPv6 autoconfiguration support was +initially integrated into ICMPv6. This comes in the form of Neighbor +Discovery Protocol (NDP) and includes the ability for a host to automatically +discover:

+ +
    +
  • Neighbor Discovery and Advertisement, replacing IPv4’s ARP.
  • +
  • Network address prefix value. + +
      +
    • Note: network address prefix length is fixed in IPv6 to /64.
    • +
  • +
  • Link (L2) parameter discovery, such as MTU.
  • +
  • Next-hop routing determination through Router Solicitation and Advertisement +(RA).
  • +
  • Duplicate address detection, thus allowing hosts to generate a host address +and determine if it is a duplicate. (If so, they will pick another).
  • +
+ +

The above tools that made up the original NDP allow a host to perform what is +formally called Stateless address autoconfiguration (SLAAC). Additionally, +NDP, through Router Solicitation and Router Advertisement (RA), allows a host to +define itself a unique host address, determine its network address, and +router(s). These are all the necessary details a host needs to start sending +and receiving IP packets. The IPng designers believed they had successfully +refactored the base IP protocol, including ICMP, to handle autoconfiguration.

+ +

In hindsight, the refactoring was not agile enough. While hosts can configure +the IP layer with SLAAC, it turns out that DHCPv4 is used provide added +functionality beyond simply configuring the IP layer of a host. The almost +universally used feature of DHCP, beyond the IP layer, is communicating the DNS +server’s IP address. SLAAC did not initially have support for this and thus +DHCPv6 was born. The ICMPv6 Router Advertisement was extended in RFC-6106 to +allow the inclusion of DNS configuration information in the RA message.

+ +

RFC-6106, which allows DNS details in router advertisements, is not the end of +the story. Firstly, its adoption has been slow, and secondly, there remain +additional configuration details not covered by the RFC that are desired when +autoconfiguring hosts on an IP network. In fact, IANA cites well over 150 +option parameters registered for DHCP [1].

+ +

Stateful and Stateless DHCPv6

+ +

The ability for a host to autoconfigure, through SLAAC, it’s IPv6 details gives +rise to a new mode of use for DHCP - “Stateless DHCPv6”. In this mode, the host +first uses SLAAC to configure its IPv6 details and then uses DHCPv6 to request +additional details like DNS, NTP, etc. In this mode the host indicates it is +operating “stateless” and the server does not perform address assignment.

+ +

In addition to the stateless mode, DHCPv6 can also be used in a “stateful” mode +where an IPv6 address is assigned from the server’s pool of addresses. IPv6 +allows and most often requires hosts to have multiple IPv6 addresses assigned to +a single interface; the link-local address is an excellent example of this. +Because hosts must support multiple addresses per interface it is possible to +use both SLAAC and stateful DHCPv6 to configure a host. If both methods are +used then there will be multiple IPv6 addresses assigned to the interface. The +link-local address is also required, so using both methods will ensure the +interface has at least three addresses.

+ +

The late arrival of DNS configuration as part of SLAAC caused some vendors, +Microsoft Windows most notably, to pursue client IPv6 autoconfiguration which +required DHCPv6. This makes the use of DHCPv6 a near requirement in any network +that has liberal requirements for operating system support.

+ +

Host Registration in DNS

+ +

Providing DNS configuration to an autoconfiguring host does not imply +registering that host in the local DNS tables. In fact, neither DHCPv4, nor +DHCPv6 address the issue of DNS registration for newly configured hosts. In +many environments, including lab and prototype use case environments, +registering configured hosts ranges from very helpful to required. Some clients +will perform this task, but this behavior is not common enough to rely on it.

+ +

There are a number of different tools to support registering hosts in DNS as +they join a network, but one project is more appealing than the others for our +given use cases: Dnsmasq. The Dnsmasq project combines DHCP and DNS in a +single daemon and supports both IPv4 and IPv6. Dnsmasq also supports portions +of IPv6 autoconfiguration, including router advertisement (RA). The feature +that places Dnsmasq in the most appealing position is that its DHCP and DNS +integration includes automatically registering DHCP leases in the DNS tables +when a hostname is provided in the DHCP request; solving exactly the problem not +explicitly addressed in DHCP or DNS specifications.

+ +

Through experimentation it was determined that Windows and Mac OSX based systems +consistently provide the hostname as part of their DHCP request. Unfortunately, +the most popular, and widely used, DHCP client, from ISC, either does not, or is +rarely configured to send the hostname. Fortunately, an alternative DHCP client +does: the dhcpcd client. Investigating the dhcpcd client also revealed that +it is trivial to swap the ISC client for dhcpcd on most Linux hosts.

+ +

Router and Client Configuration

+ +

The following is the Dnsmasq_ configuration applied on the router that allows +for the most effective autoconfiguration of IPv6:

+ +
# dnsmasq configuration for router "appliance"
+no-resolv
+server=10.3.7.1
+
+local=/cloud1/
+
+domain=cloud1
+dhcp-fqdn
+
+enable-ra
+dhcp-option=option6:dns-server,[2001:db8:4b:222::1]
+dhcp-option=option6:dns-name,cloud1
+
+dhcp-range=::100,::1ff,constructor:em1
+
+ +

The configuration is broken down as follows:

+ +
+
no-resolve
+
Disable using /etc/resolv.conf as a basis for configuring the dnsmasq server. +This was done to make this example clearly explicit.
+
server=10.3.7.1
+
Configure the server that dnsmasq forwards all DNS requests it can not handle +locally to. Note that the forwarder does not need to be a IPv6 address, +although it could be. Multiple forwarders are configurable if desired.
+
local=/cloud1/
+
Declare the domain “cloud1” as the domain being served locally.
+
domain=cloud1
+
Declare the domain “cloud1” as the domain for all DHCP requests
+
dhcp-fqdn
+
Force all DHCP clients to be placed in the “cloud1” domain, regardless of what +domain they specify in the DHCP request.
+
enable-ra
+
Perform IPv6 Router Advertisement as part of Dnsmasq’s operation. Other +router advertisement daemons should not be run. If the host Dnsmasq is +running on is not the router then disable this.
+
dhcp-option...dns-server
+
Explicitly configure and ensure the dns-server option is sent in the DHCP +reply. The address listed is an address assigned to the ‘em1’ interface on +this host.
+
dhcp-option...dns-name
+
Send ‘cloud1’ as the assigned domain to all clients performing DHCP requests.
+
dhcp-range...
+
Issue IPv6 addresses between ::100 and ::1ff in response to DHCP requests. +The clause, “constructor:em1” directs the configuration to use the network +prefix of the ‘em1’ interface as the network prefix for the leased addresses. +The actual address returned will be [em1 prefix]::[100-1ff].
+
+ +

Enabling the log-dhcp or log-queries parameters in Dnsmasq will enable +verbose reporting of either DHCP or DNS is debugging is required.

+ +

Client DHCP Configuration

+ +

No explicit configuration is required on the client side except replacing the +ISC DHCP client with the dhcpcd client. For Debian derived Linux +installations:

+ +
> sudo apt-get remove isc-dhcp-client isc-dhcp-common
+> sudo apt-get install dhcpcd5
+
+ +

No configuration files need to be modified.

+ +

Conclusion

+ +

By utilizing the Dnsmasq_ and dhcpcd_ projects a very simple configuration can +be constructed that supports autoconfiguration of an IPv6 network. This pattern +can be utilized in both a heterogeneous lab and prototype environments, +including Vagrant based setups on developer laptops.

+ +

References

+ +
+
DHCPv6
+
https://en.wikipedia.org/wiki/DHCPv6
+
https://tools.ietf.org/html/rfc3315
+
ICMPv6
+
https://en.wikipedia.org/wiki/ICMPv6
+
https://tools.ietf.org/html/rfc4443
+
https://tools.ietf.org/html/rfc6106
+
NDP - Neighbor Discovery Protocol:
+
https://en.wikipedia.org/wiki/Neighbor_Discovery_Protocol
+
Dnsmasq - DHCP + DNS daemon
+
http://www.thekelleys.org.uk/dnsmasq/doc.html
+
dhcpcd - alternative DHCP client
+
http://roy.marples.name/projects/dhcpcd/index
+
+ + + + +
\ No newline at end of file diff --git a/KaraKeep/attachments/34ad0016-d238-45ab-96ed-2b5e80dc7063-Unique-Guns-in-Anime-The.jpg b/KaraKeep/attachments/34ad0016-d238-45ab-96ed-2b5e80dc7063-Unique-Guns-in-Anime-The.jpg new file mode 100644 index 0000000..c4f6893 Binary files /dev/null and b/KaraKeep/attachments/34ad0016-d238-45ab-96ed-2b5e80dc7063-Unique-Guns-in-Anime-The.jpg differ diff --git a/KaraKeep/attachments/354ff041-f416-4257-bcb8-381ba3b329d2-MISAMARU-on-X-”アメスリ着物が新登場!.jpg b/KaraKeep/attachments/354ff041-f416-4257-bcb8-381ba3b329d2-MISAMARU-on-X-”アメスリ着物が新登場!.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/354ff041-f416-4257-bcb8-381ba3b329d2-MISAMARU-on-X-”アメスリ着物が新登場!.jpg differ diff --git a/KaraKeep/attachments/35bdf21d-0d00-43b0-a81c-04c4c79bf7c2-image.jpg b/KaraKeep/attachments/35bdf21d-0d00-43b0-a81c-04c4c79bf7c2-image.jpg new file mode 100644 index 0000000..45bd08c Binary files /dev/null and b/KaraKeep/attachments/35bdf21d-0d00-43b0-a81c-04c4c79bf7c2-image.jpg differ diff --git a/KaraKeep/attachments/35d79559-fd59-4ee6-baa8-05b5d5773860-Unique-Guns-in-Anime-–.jpg b/KaraKeep/attachments/35d79559-fd59-4ee6-baa8-05b5d5773860-Unique-Guns-in-Anime-–.jpg new file mode 100644 index 0000000..501c891 Binary files /dev/null and b/KaraKeep/attachments/35d79559-fd59-4ee6-baa8-05b5d5773860-Unique-Guns-in-Anime-–.jpg differ diff --git a/KaraKeep/attachments/35e7303a-292e-4fe6-b58e-66231b5f4c33-alaska-on-X-“once-you-realize.jpg b/KaraKeep/attachments/35e7303a-292e-4fe6-b58e-66231b5f4c33-alaska-on-X-“once-you-realize.jpg new file mode 100644 index 0000000..98921e7 --- /dev/null +++ b/KaraKeep/attachments/35e7303a-292e-4fe6-b58e-66231b5f4c33-alaska-on-X-“once-you-realize.jpg @@ -0,0 +1 @@ +

Don’t miss what’s happening

People on X are the first to know.

Post

Conversation

New to X?

Sign up now to get your own personalized timeline!

By signing up, you agree to the Terms of Service and Privacy Policy, including Cookie Use.

Trending now

What’s happening

Sports · Trending

Paul Blackburn

Trending in United States

#BELIFT_Do_Better

Trending with #FOREVER_WITH_7ENHA

Only on X · Trending

#OldFriends

Sports · Trending

Rosario

\ No newline at end of file diff --git a/KaraKeep/attachments/38245179-89e4-4b89-9b01-0f31a0577433-pokopia-meals-spreadsheet.jpg b/KaraKeep/attachments/38245179-89e4-4b89-9b01-0f31a0577433-pokopia-meals-spreadsheet.jpg new file mode 100644 index 0000000..fdc58f0 Binary files /dev/null and b/KaraKeep/attachments/38245179-89e4-4b89-9b01-0f31a0577433-pokopia-meals-spreadsheet.jpg differ diff --git a/KaraKeep/attachments/38377923-8140-4eaf-a452-103a91990f26-image.jpg b/KaraKeep/attachments/38377923-8140-4eaf-a452-103a91990f26-image.jpg new file mode 100644 index 0000000..e963bd1 Binary files /dev/null and b/KaraKeep/attachments/38377923-8140-4eaf-a452-103a91990f26-image.jpg differ diff --git a/KaraKeep/attachments/3a389673-3eb1-41e4-ade1-eef82e6c9b3d-Anker-Desk-Clamp-USB-Power.jpg b/KaraKeep/attachments/3a389673-3eb1-41e4-ade1-eef82e6c9b3d-Anker-Desk-Clamp-USB-Power.jpg new file mode 100644 index 0000000..1ae2899 Binary files /dev/null and b/KaraKeep/attachments/3a389673-3eb1-41e4-ade1-eef82e6c9b3d-Anker-Desk-Clamp-USB-Power.jpg differ diff --git a/KaraKeep/attachments/3bc47f18-90a6-464c-b555-5f76fea3e9e0-hjdhjd-prismcast-Chrome-based.jpg b/KaraKeep/attachments/3bc47f18-90a6-464c-b555-5f76fea3e9e0-hjdhjd-prismcast-Chrome-based.jpg new file mode 100644 index 0000000..99b9065 Binary files /dev/null and b/KaraKeep/attachments/3bc47f18-90a6-464c-b555-5f76fea3e9e0-hjdhjd-prismcast-Chrome-based.jpg differ diff --git a/KaraKeep/attachments/3bfdf769-818a-4c83-b602-a6f5ea3d522f-Make-This-Lumber-Farm-in.jpg b/KaraKeep/attachments/3bfdf769-818a-4c83-b602-a6f5ea3d522f-Make-This-Lumber-Farm-in.jpg new file mode 100644 index 0000000..e3f3656 Binary files /dev/null and b/KaraKeep/attachments/3bfdf769-818a-4c83-b602-a6f5ea3d522f-Make-This-Lumber-Farm-in.jpg differ diff --git a/KaraKeep/attachments/3f7f6332-d864-43c4-8321-a87028fd4c0f-Sorry-2026,-the-’90s-Did.jpg b/KaraKeep/attachments/3f7f6332-d864-43c4-8321-a87028fd4c0f-Sorry-2026,-the-’90s-Did.jpg new file mode 100644 index 0000000..4481655 --- /dev/null +++ b/KaraKeep/attachments/3f7f6332-d864-43c4-8321-a87028fd4c0f-Sorry-2026,-the-’90s-Did.jpg @@ -0,0 +1,364 @@ +
+ +

There's something particularly satisfying about watching '90s fashion dominate today's trends, especially as someone who lived through them the first time around. If anything, this ongoing revival has cemented my understanding of what made 90s fashion so great in the first place.

There was an effortless ease to getting dressed. Personally, that came in the form of dungarees, primary coloured t-shirts and pedal pushers (as they were so garishly named back then), but I remember the fashion icons of that era dressing in a way that felt stylish but attainable, so much so that certain outfits have stood the test of time. There's Princess Diana's revenge dress, Kate Moss's sheer slip, and practically everything Jennifer Aniston, Courteney Cox and Lisa Kudrow wore both on and off the set of Friends.

As a new season rolls around, it's easy to get caught up in microtrends and social media hauls when you need inspiration, but I'm here to remind you that the '90s hold all the inspiration you'll need to upgrade your wardrobe for spring.

So I've dug through the archives to see how some of our beloved 90s celebrities dressed for spring and, given how many of today's trends are rooted in that very era, their outfits feel more relevant than ever. From paired back tailoring to effortless off-duty looks, these are the outfits I'll be taking notes from this season. Read on to find out who did spring best, and shop their looks.

5 '90s CELEBRITY LOOKS TO RECREATE FOR SPRING:

1. GWYNETH PALTROW: LEATHER TROUSERS + SLEEVELESS ROLLNECK

+ +Gwyneth Paltrow wearing leather trousers and a sleeveless rollneck +

(Image credit: Getty Images)

Style Notes: Spring is a transitional month, and as the weather is proving right now, it's not always sunshine and blue skies, so knitwear should still be a key player in your spring wardrobe. The trick to transitional knitwear is to take a note out of Gwyneth Paltrow's book and play around with lighter silhouettes, whether that's a short-sleeve t-shirt style or a sleeveless rollneck. Styles like this allow you to layer in adaptable ways, but also look incredibly chic on their own.

Shop the Look:

+

+ +Sleeveless Turtleneck Top +

+
+
+

& Other Stories

+

Sleeveless Turtleneck Top

+
+
+ +

A great spring basic.

+
+
+
+

+ +Merino Wool Skinny Scarf in Black Harlequin +

+
+
+

TBCo

+

Merino Wool Skinny Scarf

+
+
+ +

100% merino wool.

+
+
+
+

+ +Zw Collection Tailored Wide-Leg Leather-Effect Trousers +

+
+
+

ZARA

+

Tailored Wide-Leg Leather-Effect Trousers

+
+
+ +

A 90s wardrobe essential.

+
+
+
+

+ +Sandals +

+
+
+

H&M

+

Sandals

+
+
+ +

An iconic style.

+
+
+

2. JULIA ROBERTS: SUIT + TIE + BROGUES

+ +Julia Roberts wearing a men&#039;s Armani suit, tie and derbys. +

(Image credit: Getty Images)

Style Notes: The suit that Julia Roberts wore to the 1990 Golden Globes was a men's Armani suit, and there's something to be said for browsing menswear for your spring tailoring. Oversized silhouettes are huge for this season, and I highly recommend trying on some men's shirts and blazers for the perfect oversized fit. Menswear sections also stock a great selection of ties, another trend which continues to grow, so you can find the perfect one to go with your suit.

Shop the Look:

+

+ +Gelso Oversized Blazer in Grey - the Frankie Shop +

+
+
+

The Frankie Shop

+

Gelso Oversized Blazer

+
+
+ +

Loved by fashion editors.

+
+
+
+

+ +The Boyfriend: Fine Poplin, White +

+
+
+

With Nothing Underneath

+

The Boyfriend

+
+
+ +

Size up for an oversized fit.

+
+
+
+

+ +100% Silk Paisley Print Tie - Men | Mango United Kingdom +

+
+
+

MANGO

+

100% Silk Paisley Print Tie

+
+
+ +

Shop men's for the best selection of ties.

+
+
+
+

+ +Gelso High-Rise Wide-Leg Pants in Grey - the Frankie Shop +

+
+
+

The Frankie Shop

+

Gelso High-Rise Wide-Leg Pants

+
+
+ +

Perfect for the office.

+
+
+
+

+ +Burnished Glossed-Leather Brogues +

+
+
+

TOD'S

+

Burnished Glossed-Leather Brogues

+
+
+ +

It's all about the back-to-school shoes this season.

+
+
+

3. CAROLYN BESSETTE KENNEDY: SLEEVELESS KNIT + CROPPED JEANS

+ +Carolyn Bessette Kennedy wearing a sleeveless knit and cropped jeans. +

(Image credit: Getty Images)

Style Notes: If you haven't watched or heard of Love Story, I don't know where you've been, but it's the reason everyone's talking about Carolyn Bessette Kennedy and her iconic style. This particular look sums up her outfits perfectly. They were minimal and effortless, and a solid argument for having good quality basics in your wardrobe. A sleeveless knit, cropped jeans and strappy sandals couldn't be easier to put together, but will be a combination you'll come back to multiple times this season.

Shop the Look:

+

+ +Emilia Cotton Crew Neck Tank-Black +

+
+
+

Boden

+

Emilia Cotton Crew Neck Tank

+
+
+ +

A great transitional piece.

+
+
+
+

+ +Kick Flare Denim True Vintage - 23/28 +

+
+
+

Toteme

+

Kick Flare Denim True Vintage

+
+
+ +

A vintage wash is perfect for spring.

+
+
+
+

+ +Serenity Bare Sandal +

+
+
+

Reformation

+

Serenity Bare Sandal

+
+
+ +

Got any weddings coming up? There are the perfect wedding guest pair.

+
+
+
+

+ +Small Roscida Drop Hoops +

+
+
+

Otiumberg

+

Small Roscida Drop Hoops

+
+
+ +

A twist on the classic huggie.

+
+
+

4. NAOMI CAMPBELL: TRENCH COAT + CAPRI TROUSERS

+ +Naomi Campbell wearing a trench coat and capri trousers. +

(Image credit: Getty Images)

Style Notes: Here, Naomi Campbell makes the case for the white trench. We all love a trench coat and understand how hard working it can be, and yet very rarely consider having more than one colour in our wardrobes. A lighter shade of cream or white adds a brightness you just can't achieve with a camel trench, and creates a crisp, clean look when worn with other white pieces.

Shop the Look:

+

+ +Pure Silk Collared Shirt +

+
+
+

Marks & Spencer

+

Pure Silk Collared Shirt

+
+
+ +

An elegant addition to your spring wardrobe.

+
+
+
+

+ +Mid-Length Lightweight Cotton Belgravia Trench Coat&amp;#8203; in Seashell White - Women, Cotton Gabardine | Burberry&amp;reg; Official +

+
+
+

Burberry

+

Mid-Length Lightweight Cotton Belgravia Trench Coat​

+
+
+ +

A worthy investment.

+
+
+
+

+ +Asos Design Denim Capri Trousers in Mid Blue +

+
+
+

ASOS DESIGN

+

Denim Capri Trousers

+
+
+ +

These will work with everything from flip flops to kitten heels.

+
+
+
+

+ +Nappa Leather Slingback Sandals +

+
+
+

& Other Stories

+

Nappa Leather Slingback Sandals

+
+
+ +

Move over classic heels. It's all about the peep toe this season.

+
+
+
+

+ +Laura Sunglasses in Honey +

+
+
+

Linda Farrow

+

Laura Sunglasses in Honey

+
+
+ +

A classic 90s frame.

+
+
+

5. JENNIFER ANISTON: VEST TOP + CARGO TROUSERS + FLIP FLOPS

+ +Jennifer Aniston wearing a vest top, cargo trousers and flip flop. +

(Image credit: Getty Images)

Style Notes: There isn't a single part of this outfit that isn't currently a major must-have. From the platform flip flops and narrow framed sunnies to the slouchy cargo trousers and vest top, they're all items you either already have, or should seriously consider adding to your wardrobe for spring. What makes it such an iconic look is the red, which is more than just a pop, but is grounded by pairing with black items only, creating a monochrome effect.

Shop the Look:

+

+ +Perfect Basic Vest +

+
+
+

ME+EM

+

Perfect Basic Vest

+
+
+ +

Available in 8 other colours.

+
+
+
+

+ +We the Free Park Ave Pull-On Cargo Pants +

+
+
+

Free People

+

We the Free Park Ave Pull-On Cargo Pants

+
+
+ +

Size up if you want an even slouchier look.

+
+
+
+

+ +Tony Bianco Jetta Toe Thong Flatform Sandals in Chocolate Brown +

+
+
+

Tony Bianco

+

Jetta Toe Thong Flatform Sandals

+
+
+ +

Cool and oh so comfortable.

+
+
+
+

+ +Geometrical Frame Sunglasses +

+
+
+

Gucci

+

Geometrical Frame Sunglasses

+
+
+ +

These will never go out of style.

+
+
+
+

+ +A H&amp;egrave;rmes brown belt bag. +

+
+
+

Hèrmes

+

Elan Pocket 24 belt

+
+
+ +

Hand's free and very chic.

+
+
+
+
\ No newline at end of file diff --git a/KaraKeep/attachments/3fb22b0f-b6a2-4123-bec3-1206e3f0691d-Pig-Tail-Bridge-№54,.jpg b/KaraKeep/attachments/3fb22b0f-b6a2-4123-bec3-1206e3f0691d-Pig-Tail-Bridge-№54,.jpg new file mode 100644 index 0000000..1341ffe Binary files /dev/null and b/KaraKeep/attachments/3fb22b0f-b6a2-4123-bec3-1206e3f0691d-Pig-Tail-Bridge-№54,.jpg differ diff --git a/KaraKeep/attachments/3fe45c86-54f9-4ca6-a9de-6b097bbb9929-Moon-music-Here’s-a-Spotify.jpg b/KaraKeep/attachments/3fe45c86-54f9-4ca6-a9de-6b097bbb9929-Moon-music-Here’s-a-Spotify.jpg new file mode 100644 index 0000000..203695c Binary files /dev/null and b/KaraKeep/attachments/3fe45c86-54f9-4ca6-a9de-6b097bbb9929-Moon-music-Here’s-a-Spotify.jpg differ diff --git a/KaraKeep/attachments/40c1a048-1ee3-4e6b-a634-21dfefa2e23b-Docker-Support-Libation.jpg b/KaraKeep/attachments/40c1a048-1ee3-4e6b-a634-21dfefa2e23b-Docker-Support-Libation.jpg new file mode 100644 index 0000000..aac468a --- /dev/null +++ b/KaraKeep/attachments/40c1a048-1ee3-4e6b-a634-21dfefa2e23b-Docker-Support-Libation.jpg @@ -0,0 +1,18 @@ +

Breaking Changes

  • The docker image now runs as user 1001 and group 1001. Make sure that the permissions on your volumes allow user 1001 to read and write to them or see the User section below for other options, or if you're not sure.
  • SLEEP_TIME is now set to -1 by default. This means the image will run once and exit. If you were relying on the previous default, you'll need to explicitly set the SLEEP_TIME environment variable to 30m to replicate the previous behavior.
  • The docker image now ignores the values in Settings.json for Books and InProgress. You can now change the folder that books are saved to by using the LIBATION_BOOKS_DIR environment variable.

Disclaimer

The docker image is provided as-is. We hope it can be useful to you but it is not officially supported.

Configuration

Configuration in Libation is handled by two files, AccountsSettings.json and Settings.json. These files can usually be found in the Libation folder in your user's home directory. The easiest way to configure these is to run the desktop version of Libation and then copy them into a folder, such as /opt/libation/config, that you'll volume mount into the image. Settings.json is technically optional, and, if not provided, Libation will run using the default settings. Additionally, the Books and InProgress settings in Settings.json will be ignored and the image will instead substitute it's own values.

Running

Once the configuration files are copied, the docker image can be run with the following command.

bash

sudo docker run -d \
+  -v /opt/libation/config:/config \
+  -v /opt/libation/books:/data \
+  --name libation \
+  --restart=always \
+  rmcrackan/libation:latest

By default the container will scan for new books once and download any new ones. This is configurable by passing in a value for the SLEEP_TIME environment variable. For example, if you pass in 10m it will keep running, scan for new books, and download them every 10 minutes.

bash

sudo docker run -d \
+  -v /opt/libation/config:/config \
+  -v /opt/libation/books:/data \
+  -e SLEEP_TIME='10m' \
+  --name libation \
+  --restart=always \
+  rmcrackan/libation:latest

Environment Variables

Env VarDefaultDescription
SLEEP_TIME-1Length of time to sleep before doing another scan/download. Set to -1 to run one.
LIBATION_BOOKS_DIR/dataFolder where books will be saved
LIBATION_CONFIG_DIR/configFolder to read configuration from.
LIBATION_DB_DIR/dbOptional folder to load database from. If not mounted, will load database from LIBATION_CONFIG_DIR.
LIBATION_DB_FILEName of database file to load. By default it will look for all .db files and load one if there is only one present.
LIBATION_CREATE_DBtrueWhether or not the image should create a database file if none are found.
LIBATION_CONNECTION_STRINGConnection string for Postgresql. If not present, Libation uses the default sqlite.

User

This docker image runs as user 1001. In order for the image to function properly, user 1001 must be able to read and write the volumes that are mounted in. If they are not, you will see errors, including sqlite error, Microsoft.Data.Sqlite.SqliteException, unable to open database file, Microsoft.EntityFrameworkCore.DbUpdateException

If you're not sure what your user number is, check the output of the id command. Docker should normally run with the number of the user who configured and ran it.

If you want to change the user the image runs as, you can specify -u <uid>:<gid>. For example, to run it as user 2000 and group 3000, you could do the following:

bash

sudo docker run -d \
+  -u 2000:3000 \
+  -v /opt/libation/config:/config \
+  -v /opt/libation/books:/data \
+  --name libation \
+  --restart=always \
+  rmcrackan/libation:latest

If the user it's running as is correct, and it still cannot write, be sure to check whether the files and/or folders might be owned by the wrong user. You can use the chown command to change the owner of the file to the correct user and group number, for example: chown -R 1001:1001 /mnt/audiobooks /mnt/libation-config

Advanced Database Options

The docker image supports an optional database mount location defined by LIBATION_DB_DIR. This allows the database to be mounted as read/write, while allowing the rest of the configuration files to be mounted as read only. This is specifically useful if running in Kubernetes where you can use Configmaps and Secrets to define the configuration. If the LIBATION_DB_DIR is mounted, it will be used, otherwise it will look for the database in LIBATION_CONFIG_DIR. If it does not find the database in the expected location, it will attempt to make an empty database there.

Getting Help

As mentioned above: docker is not officially supported. I'm adding this at the bottom of the page for anyone serious enough to have read this far. If you've tried everything above and would still like help, you can open an issue. Please include [docker] in the title. There are also some docker folks who have offered occasional assistance who you can tag within your issue: @ducamagnifico , @wtanksleyjr , @CLHatch.

Reminder that these are just friendly users who are sometimes around. They're not our customer support.

\ No newline at end of file diff --git a/KaraKeep/attachments/413c02a0-da78-4819-b2e0-1663c00b2258-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg b/KaraKeep/attachments/413c02a0-da78-4819-b2e0-1663c00b2258-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg new file mode 100644 index 0000000..e08fbe7 --- /dev/null +++ b/KaraKeep/attachments/413c02a0-da78-4819-b2e0-1663c00b2258-シア口ア-on-X-”これが速いのか分からないままブランチマ.jpg @@ -0,0 +1,5 @@ +

Don’t miss what’s happening

People on X are the first to know.

Post

Conversation

New to X?

Sign up now to get your own personalized timeline!

By signing up, you agree to the Terms of Service and Privacy Policy, including Cookie Use.

Trending now

What’s happening

Sports · Trending

LA Knight

Sports · Trending

Colt Keith

Entertainment · Trending

#ParadiseHulu

Sports · Trending

Paul Blackburn

Trending with Boone, Doval

\ No newline at end of file diff --git a/KaraKeep/attachments/49df76ff-0cd2-4f0a-afcb-5cd2f9143423-Post-by-@catchymemes-·-1.jpg b/KaraKeep/attachments/49df76ff-0cd2-4f0a-afcb-5cd2f9143423-Post-by-@catchymemes-·-1.jpg new file mode 100644 index 0000000..a229023 Binary files /dev/null and b/KaraKeep/attachments/49df76ff-0cd2-4f0a-afcb-5cd2f9143423-Post-by-@catchymemes-·-1.jpg differ diff --git a/KaraKeep/attachments/4d928b50-cc22-447d-94f4-c46742e02691-alaska-on-X-“once-you-realize.jpg b/KaraKeep/attachments/4d928b50-cc22-447d-94f4-c46742e02691-alaska-on-X-“once-you-realize.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/4d928b50-cc22-447d-94f4-c46742e02691-alaska-on-X-“once-you-realize.jpg differ diff --git a/KaraKeep/attachments/4ef28cbc-4c2e-4264-ad78-9d74bd0b138b-alaska-on-X-“once-you-realize.jpg b/KaraKeep/attachments/4ef28cbc-4c2e-4264-ad78-9d74bd0b138b-alaska-on-X-“once-you-realize.jpg new file mode 100644 index 0000000..d48df7a Binary files /dev/null and b/KaraKeep/attachments/4ef28cbc-4c2e-4264-ad78-9d74bd0b138b-alaska-on-X-“once-you-realize.jpg differ diff --git a/KaraKeep/attachments/4f0fe47b-484e-4b8d-8634-3ff31573299a-pinko🐬👽-on-X-”@145k4-a-lot.jpg b/KaraKeep/attachments/4f0fe47b-484e-4b8d-8634-3ff31573299a-pinko🐬👽-on-X-”@145k4-a-lot.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/4f0fe47b-484e-4b8d-8634-3ff31573299a-pinko🐬👽-on-X-”@145k4-a-lot.jpg differ diff --git a/KaraKeep/attachments/4fe571f0-ed85-4933-aadf-f72891648d1f-Dr.-Ahmad-Al-Khatib,-MD,.jpg b/KaraKeep/attachments/4fe571f0-ed85-4933-aadf-f72891648d1f-Dr.-Ahmad-Al-Khatib,-MD,.jpg new file mode 100644 index 0000000..d3be5fe Binary files /dev/null and b/KaraKeep/attachments/4fe571f0-ed85-4933-aadf-f72891648d1f-Dr.-Ahmad-Al-Khatib,-MD,.jpg differ diff --git a/KaraKeep/attachments/534d005f-c408-40d6-839c-d71374da5f74-Reblog-by-@thevisualvamp-·-1.jpg b/KaraKeep/attachments/534d005f-c408-40d6-839c-d71374da5f74-Reblog-by-@thevisualvamp-·-1.jpg new file mode 100644 index 0000000..08c88ca --- /dev/null +++ b/KaraKeep/attachments/534d005f-c408-40d6-839c-d71374da5f74-Reblog-by-@thevisualvamp-·-1.jpg @@ -0,0 +1 @@ +

Avatar

Avatar

Avatar

Shoe porn

Avatar

Avatar

Avatar

Follow me

thevisualvampReblogged horstandresNov 19, 2023mxrihFeb 29, 2020FollowthevisualvampNov 19, 2023I love pasta 5438759

thevisualvampRebloggedNov 19, 2023oldfarmhouseOct 5, 2023Follow𝗁𝗍𝗍𝗉s://instagram.com/serenanddilly thevisualvampNov 19, 2023Man’s best friend 184306

thevisualvampRebloggedNov 19, 2023oldfarmhouseMay 31, 2023FollowNew day🌅thevisualvampNov 19, 2023I love a messy bed #interior design#bedroom7194

thevisualvampReblogged bcourchaineNov 19, 2023thepaintedchateauNov 18, 2023Follow..."now is where love breathes"....~RumithevisualvampNov 19, 2023Rumi the wise guy 78172

thevisualvampReblogged bcourchaineNov 19, 2023miss-love-smackedAug 27, 2023FollowSunset Long Island. Georgia OKeeffe 1939thevisualvampNov 19, 2023Artists I love #georgia o'keeffe144214

thevisualvampReblogged bcourchaineNov 19, 2023malaisequotesNov 18, 2023Follow“Because children grow up, we think a child's purpose is to grow up. But a child's purpose is to be a child. Nature doesn't disdain what lives only for a day. It pours the whole of itself into the each moment.”The Coast of Utopia by Tom StoppardthevisualvampNov 19, 2023Poetic #ceasefire#tom stoppard4870

thevisualvampReblogged bcourchaineNov 19, 2023ophelia-networkNov 17, 2023Follow"Spirituality means waking up. Most people, even though they don't know it, are asleep. They're born asleep, they live asleep, they marry in their sleep, they breed children in their sleep, they die in their sleep without ever waking up. They never understand the loveliness and the beauty of this thing that we call human existence." Anthony de MelloClaude VerlindethevisualvampNov 19, 2023Good night 1222

thevisualvampReblogged bcourchaineNov 19, 2023msmarymillspaulosNov 19, 2023FollowThere must be more to life than having everything Maurice SendakthevisualvampNov 19, 2023Man’s best friend #maurice sendak2352

thevisualvampNov 19, 2023Man’s best friend #interior design38

thevisualvampReblogged the-gardeners-worldNov 19, 2023letmebeforeverloveOct 5, 2020FollowsapiofelineOct 3, 2023“The only sea I saw was the seesaw sea With you riding on it.Lie down, lie easy. Let me shipwreck in your thighs.— Dylan Thomas (Under Milk Wood)thevisualvampNov 19, 2023Poetic #dylan thomas2267609

thevisualvampRebloggedNov 19, 2023yummyinmytumblyNov 19, 2023FollowQuick Tortellini BolognesethevisualvampNov 19, 2023I love pasta 3770

thevisualvampRebloggedNov 19, 2023alice-down-the-rabbbit-hole-deaJohn Malkovich and Uma Thurman on the set of DangerousLiaisons, 1988.thevisualvampNov 19, 2023Cinematic moments #dangerous liaisons1530

thevisualvampReblogged alice-down-the-rabbbit-hole-deaNov 19, 2023formeroklahomanAug 3, 2023FollowBefore camera cranes were invented, William A. Wellman pulled off this tracking shot in WINGS (1927). It was the first Best Picture Oscar winner.thevisualvampNov 19, 2023Cinematic moments #film history#wings3023,79032,311

thevisualvampRebloggedNov 19, 2023alice-down-the-rabbbit-hole-deathevisualvampNov 19, 2023The horsey set 2560

thevisualvampRebloggedNov 19, 2023alice-down-the-rabbbit-hole-deaalice-down-the-rabbbit-hole-deathevisualvampNov 19, 2023Prince Forever #prince53115

\ No newline at end of file diff --git a/KaraKeep/attachments/59a504e6-be3d-4e20-8c6f-ceca79606e14-Shota-Ashida-on-Instagram.jpg b/KaraKeep/attachments/59a504e6-be3d-4e20-8c6f-ceca79606e14-Shota-Ashida-on-Instagram.jpg new file mode 100644 index 0000000..8ab9f31 Binary files /dev/null and b/KaraKeep/attachments/59a504e6-be3d-4e20-8c6f-ceca79606e14-Shota-Ashida-on-Instagram.jpg differ diff --git a/KaraKeep/attachments/5b39eaa9-68e6-45e0-86b6-85992eeefd0a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg b/KaraKeep/attachments/5b39eaa9-68e6-45e0-86b6-85992eeefd0a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg new file mode 100644 index 0000000..9f2889b Binary files /dev/null and b/KaraKeep/attachments/5b39eaa9-68e6-45e0-86b6-85992eeefd0a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg differ diff --git a/KaraKeep/attachments/5d3201eb-6a52-4c4f-9a88-c59f54128e9e-MISAMARU-on-X-”アメスリ着物が新登場!.jpg b/KaraKeep/attachments/5d3201eb-6a52-4c4f-9a88-c59f54128e9e-MISAMARU-on-X-”アメスリ着物が新登場!.jpg new file mode 100644 index 0000000..e03a11d Binary files /dev/null and b/KaraKeep/attachments/5d3201eb-6a52-4c4f-9a88-c59f54128e9e-MISAMARU-on-X-”アメスリ着物が新登場!.jpg differ diff --git a/KaraKeep/attachments/5d323927-385d-4fee-a7b0-7db63a9587b6-Post-by-@catchymemes-·-1.jpg b/KaraKeep/attachments/5d323927-385d-4fee-a7b0-7db63a9587b6-Post-by-@catchymemes-·-1.jpg new file mode 100644 index 0000000..5171c6a Binary files /dev/null and b/KaraKeep/attachments/5d323927-385d-4fee-a7b0-7db63a9587b6-Post-by-@catchymemes-·-1.jpg differ diff --git a/KaraKeep/attachments/5dae84ab-e03b-4bb6-bb0f-2c22388015cb-Daily-Planner-Screenshot.jpg b/KaraKeep/attachments/5dae84ab-e03b-4bb6-bb0f-2c22388015cb-Daily-Planner-Screenshot.jpg new file mode 100644 index 0000000..24933c0 Binary files /dev/null and b/KaraKeep/attachments/5dae84ab-e03b-4bb6-bb0f-2c22388015cb-Daily-Planner-Screenshot.jpg differ diff --git a/KaraKeep/attachments/6130328a-70a3-4888-8f93-67032d1d0ed8-Tnewties-トゥエンティーズ-on-X.jpg b/KaraKeep/attachments/6130328a-70a3-4888-8f93-67032d1d0ed8-Tnewties-トゥエンティーズ-on-X.jpg new file mode 100644 index 0000000..33764a6 Binary files /dev/null and b/KaraKeep/attachments/6130328a-70a3-4888-8f93-67032d1d0ed8-Tnewties-トゥエンティーズ-on-X.jpg differ diff --git a/KaraKeep/attachments/67e88391-3daf-4a68-8574-14349790a5c2-paint-recipes.jpg b/KaraKeep/attachments/67e88391-3daf-4a68-8574-14349790a5c2-paint-recipes.jpg new file mode 100644 index 0000000..5bf900e Binary files /dev/null and b/KaraKeep/attachments/67e88391-3daf-4a68-8574-14349790a5c2-paint-recipes.jpg differ diff --git a/KaraKeep/attachments/6d6e6e3a-387d-4286-8b6b-bb103288c1cc-Unique-Guns-in-Anime-The.jpg b/KaraKeep/attachments/6d6e6e3a-387d-4286-8b6b-bb103288c1cc-Unique-Guns-in-Anime-The.jpg new file mode 100644 index 0000000..18b25e8 Binary files /dev/null and b/KaraKeep/attachments/6d6e6e3a-387d-4286-8b6b-bb103288c1cc-Unique-Guns-in-Anime-The.jpg differ diff --git a/KaraKeep/attachments/7134b1d0-bdfd-40fe-a480-55afb8299509-Moon-music-Here’s-a-Spotify.jpg b/KaraKeep/attachments/7134b1d0-bdfd-40fe-a480-55afb8299509-Moon-music-Here’s-a-Spotify.jpg new file mode 100644 index 0000000..363be9c Binary files /dev/null and b/KaraKeep/attachments/7134b1d0-bdfd-40fe-a480-55afb8299509-Moon-music-Here’s-a-Spotify.jpg differ diff --git a/KaraKeep/attachments/716a074c-458e-4920-a52a-76a968311924-Brutalism-The-University-of.jpg b/KaraKeep/attachments/716a074c-458e-4920-a52a-76a968311924-Brutalism-The-University-of.jpg new file mode 100644 index 0000000..45963f1 Binary files /dev/null and b/KaraKeep/attachments/716a074c-458e-4920-a52a-76a968311924-Brutalism-The-University-of.jpg differ diff --git a/KaraKeep/attachments/72b0e584-0e3c-4cfc-a87a-baf08c234bfc-Docker-Support-Libation.jpg b/KaraKeep/attachments/72b0e584-0e3c-4cfc-a87a-baf08c234bfc-Docker-Support-Libation.jpg new file mode 100644 index 0000000..6e669ca Binary files /dev/null and b/KaraKeep/attachments/72b0e584-0e3c-4cfc-a87a-baf08c234bfc-Docker-Support-Libation.jpg differ diff --git a/KaraKeep/attachments/79336178-5338-4e3c-b0f6-244fd2fd6a34-pinko🐬👽-on-X-”@145k4-a-lot.jpg b/KaraKeep/attachments/79336178-5338-4e3c-b0f6-244fd2fd6a34-pinko🐬👽-on-X-”@145k4-a-lot.jpg new file mode 100644 index 0000000..19af118 Binary files /dev/null and b/KaraKeep/attachments/79336178-5338-4e3c-b0f6-244fd2fd6a34-pinko🐬👽-on-X-”@145k4-a-lot.jpg differ diff --git a/KaraKeep/attachments/79994532-0e74-4e46-9ab3-9768f611a314-Unique-Guns-in-Anime-–.jpg b/KaraKeep/attachments/79994532-0e74-4e46-9ab3-9768f611a314-Unique-Guns-in-Anime-–.jpg new file mode 100644 index 0000000..099467c Binary files /dev/null and b/KaraKeep/attachments/79994532-0e74-4e46-9ab3-9768f611a314-Unique-Guns-in-Anime-–.jpg differ diff --git a/KaraKeep/attachments/7c6a2c14-795c-4329-b047-dd39fdd2cdd4-Moon-music-Here’s-a-Spotify.jpg b/KaraKeep/attachments/7c6a2c14-795c-4329-b047-dd39fdd2cdd4-Moon-music-Here’s-a-Spotify.jpg new file mode 100644 index 0000000..6a5caf4 --- /dev/null +++ b/KaraKeep/attachments/7c6a2c14-795c-4329-b047-dd39fdd2cdd4-Moon-music-Here’s-a-Spotify.jpg @@ -0,0 +1,193 @@ +
+
+ +
+
+ + +The silhouette of a woman looking out the window at Earth. + +
What song would you want to be listening to while looking out at this view? +(Image credit: NASA) +
+
+
+ +

Alongside its serious objectives, like testing the Orion capsule in deep space and imaging lava flows on the lunar surface, NASA's Artemis 2 lunar mission has its whimsy, too.

For example, there is a beloved moon toy named "Rise" on the mission serving as a zero-gravity indicator and holding a microchip with the names of space fans who signed up to have their presence enter the lunar arena. There are also the "wakeup songs," a tradition carried on from previous crewed missions. These are exactly what you'd expect. Each day, at the designated wakeup time for the Artemis 2 crew, Mission Control radios in to Orion and plays a short snippet of a song to help them start their day with positivity.

Here are the songs so far:

Flight Day 1: "Sleepyhead" by Young & Sick

Flight Day 2: "Green Light" by John Legend (feat. André 3000)

Flight Day 3: "In a Daydream" by Freddy Jones Band

Breaking space news, the latest updates on rocket launches, skywatching events and more!

Flight Day 4: "Pink Pony Club" by Chappell Roan

Flight Day 5: "Working Class Heroes (Work)" by CeeLo Green

Flight Day 6: "Good Morning" by Mandisa, TobyMac

Astronaut wakeup calls go back to the Apollo years. For instance, the Apollo 10 astronauts had the song "It's Nice to Go Trav'ling" by Frank Sinatra as one of their wakeup calls, and Apollo 15 had the theme song from "2001: A Space Odyssey."

The space shuttle program had tons of wakeup calls of their own. For example, STS-134 Pilot Greg Johnson's son chose "Drops of Jupiter" to play for his dad during that 2011 mission — to which Johnson said, "I love that song, and I love being in space," before apologizing for missing his son's birthday. That same mission, the second-to-last of the shuttle program, also had "Il Mio Pensiero," performed by Ligabue for mission specialist Roberto Vittori.

During the final space shuttle mission, STS-135, Pilot Doug Hurley selected Coldplay's "Viva la Vida" to be played (and later picked "Don't Panic" for another day). R.E.M.'s Michael Stipe also personally sent an a capella version of "Man on the Moon" for the crew.

An in-depth list of these wakeup songs can be found in this document, which also features some of the cute and, yes, whimsical banter between astronauts and Mission Control. What a lovely tradition.

+
+ +

Share your thoughts

0

0

0

0

+
+ + +
+ +

Join the community

+

Join the Space.com Family! The best way to keep in touch and to be informed of our latest quizzes and competitions, as well as news and offers.

+ +
+ + +
+ +
+ + + + +

Already have an account? Log in

+
+
+

Log In

+
+ + +

Forgotten your password? Reset it

+

Not got an account? Register

+
+
+ +
+ + +
+ + +

My Details

+

Update your details below...

+ +
+ + +
+ +

Keep in the Know

+

Would you like to be kept informed about new quizzes and offers from Future and its partners?

+
+ + +
+
+ + + +
+

Validate Your Mobile No.

+

We have sent a code to . Please enter it below to verify your account.

+
+ +
+

+ Update mobile number +

+

+ Resend code +

+
+
+
+ +
+

Update Your Mobile No.

+

You may enter a new mobile number below. You will be sent a verification code to the phone number you provide.

+
+ +

Cancel +

+
+
+ +
+ +

embed-reactions.hint_heading

+

+ embed-reactions.hint_subheading +

+ + +
+ +
+

Validate Your Email Address

+

We have sent a code to . Please enter it below to verify your account.

+
+ +
+

+ Update email address +

+

+ Resend code +

+
+
+
+ +
+

Update Your Email Address

+

You may enter a new email address below. You will be sent a verification code to the address you provide.

+
+ +

Cancel +

+
+
+ +
+

Create a Username

+

This will be publicly viewable so make it something you like!

+ +
+ +
+ +

Reset your password

+

Enter your email address below. If it is registered with us, we will email you a code that will allow you to reset your password.

+ +
+ +
+ +

Check your inbox

+

If your email address was found in our system, you should receive an email in the next few minutes containing a code. Enter that code below to reset your password.

+ +
+ +
+ +

Set new password

+

Please enter your new password below.

+ +
+ +
+

Leaderboard

+
+ + + + + + + + + + + + +
RankPlayerScoreTime
+
+
+ + + +
+

Monisha Ravisetti is Space.com's Astronomy Editor. She covers black holes, star explosions, gravitational waves, exoplanet discoveries and other enigmas hidden across the fabric of space and time. Previously, she was a science writer at CNET, and before that, reported for The Academic Times. Prior to becoming a writer, she was an immunology researcher at Weill Cornell Medical Center in New York. She graduated from New York University in 2018 with a B.A. in philosophy, physics and chemistry. She spends too much time playing online chess. Her favorite planet is Earth.

+ +
+ + + + + +
\ No newline at end of file diff --git a/KaraKeep/attachments/7d68f162-32b8-4e15-962a-942c666edca1-Sorry-2026,-the-’90s-Did.jpg b/KaraKeep/attachments/7d68f162-32b8-4e15-962a-942c666edca1-Sorry-2026,-the-’90s-Did.jpg new file mode 100644 index 0000000..618a1ef Binary files /dev/null and b/KaraKeep/attachments/7d68f162-32b8-4e15-962a-942c666edca1-Sorry-2026,-the-’90s-Did.jpg differ diff --git a/KaraKeep/attachments/815aa7c2-efa8-4167-b129-5d5c9349f78a-@i-on-X-Screenshot.jpg b/KaraKeep/attachments/815aa7c2-efa8-4167-b129-5d5c9349f78a-@i-on-X-Screenshot.jpg new file mode 100644 index 0000000..15b586b Binary files /dev/null and b/KaraKeep/attachments/815aa7c2-efa8-4167-b129-5d5c9349f78a-@i-on-X-Screenshot.jpg differ diff --git a/KaraKeep/attachments/8c2d8550-eb5b-4445-8fbd-e2a3cec8afed-NO.S-PROJECT-on-X-”【pick.jpg b/KaraKeep/attachments/8c2d8550-eb5b-4445-8fbd-e2a3cec8afed-NO.S-PROJECT-on-X-”【pick.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/8c2d8550-eb5b-4445-8fbd-e2a3cec8afed-NO.S-PROJECT-on-X-”【pick.jpg differ diff --git a/KaraKeep/attachments/8cc40447-f750-4bf2-a935-69c7a35a2923-Reblog-by-@thevisualvamp-·-1.jpg b/KaraKeep/attachments/8cc40447-f750-4bf2-a935-69c7a35a2923-Reblog-by-@thevisualvamp-·-1.jpg new file mode 100644 index 0000000..badd8da Binary files /dev/null and b/KaraKeep/attachments/8cc40447-f750-4bf2-a935-69c7a35a2923-Reblog-by-@thevisualvamp-·-1.jpg differ diff --git a/KaraKeep/attachments/a0a9d75a-abb2-4705-a850-ff88eb544645-Bookmark-r52rx1vz27hvtt3e2capn.jpg b/KaraKeep/attachments/a0a9d75a-abb2-4705-a850-ff88eb544645-Bookmark-r52rx1vz27hvtt3e2capn.jpg new file mode 100644 index 0000000..6dd961d Binary files /dev/null and b/KaraKeep/attachments/a0a9d75a-abb2-4705-a850-ff88eb544645-Bookmark-r52rx1vz27hvtt3e2capn.jpg differ diff --git a/KaraKeep/attachments/a17cb29b-b676-46af-a98a-0ccb748479a5-V1ck3s-octo-fiesta-at.jpg b/KaraKeep/attachments/a17cb29b-b676-46af-a98a-0ccb748479a5-V1ck3s-octo-fiesta-at.jpg new file mode 100644 index 0000000..904308f Binary files /dev/null and b/KaraKeep/attachments/a17cb29b-b676-46af-a98a-0ccb748479a5-V1ck3s-octo-fiesta-at.jpg differ diff --git a/KaraKeep/attachments/a1bbbe44-8e87-4e0d-a350-8a664828bb76-V1ck3s-octo-fiesta-at.jpg b/KaraKeep/attachments/a1bbbe44-8e87-4e0d-a350-8a664828bb76-V1ck3s-octo-fiesta-at.jpg new file mode 100644 index 0000000..be99701 --- /dev/null +++ b/KaraKeep/attachments/a1bbbe44-8e87-4e0d-a350-8a664828bb76-V1ck3s-octo-fiesta-at.jpg @@ -0,0 +1,159 @@ +
+

A Subsonic API proxy server that transparently integrates multiple music streaming providers as sources. When a song is not available in your local Navidrome library, it is automatically fetched from your configured provider, downloaded, and served to your Subsonic-compatible client. The downloaded song is then added to your library, making it available locally for future listens.

+

Why "Octo-Fiesta"?

+

The name was randomly generated by GitHub when creating the repository. We found it amusing and somewhat fitting for a music application. After all, "fiesta" evokes a party atmosphere, which goes well with music streaming. So we kept it!

+

Features

+
    +
  • Multi-Provider Architecture: Pluggable music service system supporting multiple streaming providers
  • +
  • Transparent Proxy: Acts as a middleware between Subsonic clients and your Navidrome server
  • +
  • Seamless Integration: Automatically searches and streams music from your configured provider when not available locally
  • +
  • Automatic Downloads: Songs are downloaded on-the-fly and cached for future use
  • +
  • External Playlist Support: Search, discover, and download playlists with automatic M3U generation
  • +
  • Hi-Res Audio Support: Up to 24-bit/192kHz FLAC quality
  • +
  • Full Metadata Embedding: Complete ID3 tags and embedded cover art
  • +
  • Organized Library: Downloads saved in clean Artist/Album/Track folder structure
  • +
+

Supported Music Providers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProviderCredentials RequiredMax QualityPlaylist Support
SquidWTFNoFLAC 24-bitNo
QobuzYesFLAC 24-bit/192kHzYes
DeezerYesFLAC 16-bitYes
Yandex MusicYesFLAC 16-bitYes
+

See the Supported Music Providers wiki page for detailed information.

+

Compatible Clients

+ + + + + + + + + + + + + + + + + + + + + +
PlatformClients
DesktopAonsoku, Feishin, Supersonic, Subplayer, Aurial
AndroidNavic, Tempus, Substreamer, Yuzic
iOSNavic, Narjo, BeatsX, Yuzic
+

See the Compatible Clients wiki page for details and incompatible clients.

+

Quick Start

+

Requirements

+
    +
  • A running Navidrome server (or other Subsonic-compatible server)
  • +
  • Docker and Docker Compose (recommended) or .NET 9.0 SDK
  • +
+

Docker Installation

+
# Clone the repository
+git clone https://github.com/V1ck3s/octo-fiesta.git
+cd octo-fiesta
+
+# Configure
+cp .env.example .env
+nano .env  # Edit with your settings
+
+# Start
+docker-compose up -d
+

The proxy will be available at http://localhost:5274. Point your Subsonic client to this URL instead of your Navidrome server.

+

See the Installation wiki page for detailed instructions including manual installation.

+

Configuration

+

See the Configuration wiki page for all available settings.

+

Getting Credentials

+ +

Architecture

+
┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
+│  Subsonic       │────▶│   Octo-Fiesta    │────▶│   Navidrome     │
+│  Client         │◀────│   (Proxy)        │◀────│   Server        │
+│  (Aonsoku)      │     │                  │     │                 │
+└─────────────────┘     └────────┬─────────┘     └─────────────────┘
+                                 │
+                                 ▼
+                        ┌─────────────────┐
+                        │ Music Providers │
+                        │  - Deezer       │
+                        │  - Qobuz        │
+                        │  - SquidWTF     │
+                        └─────────────────┘
+
+

Limitations

+
    +
  • Playlist Search: Streaming provider playlists appear in global search but may not show in the Playlists tab due to client-side filtering.
  • +
  • Playlist Display: Due to Subsonic API limitations, playlists appear at the end of the album list with a music note icon. See Playlists for details.
  • +
  • Token Expiration: Provider authentication tokens expire and need periodic refresh.
  • +
+

Documentation

+

Full documentation is available in the Wiki:

+ +
+

Need help? Please check the Wiki before opening an issue.

+
+

Contributing

+

Contributions are welcome! See the Development & Contributing guide.

+
# Build
+dotnet build
+
+# Run tests
+dotnet test
+

License

+

GPL-3.0

+

Acknowledgments

+ +
\ No newline at end of file diff --git a/KaraKeep/attachments/a8816528-6fb8-4100-b2be-ba42bedeafab-image.jpg b/KaraKeep/attachments/a8816528-6fb8-4100-b2be-ba42bedeafab-image.jpg new file mode 100644 index 0000000..5899670 Binary files /dev/null and b/KaraKeep/attachments/a8816528-6fb8-4100-b2be-ba42bedeafab-image.jpg differ diff --git a/KaraKeep/attachments/ac0e47fd-e093-4338-9ed7-c30a5e36eb51-NO.S-PROJECT-on-X-”【pick.jpg b/KaraKeep/attachments/ac0e47fd-e093-4338-9ed7-c30a5e36eb51-NO.S-PROJECT-on-X-”【pick.jpg new file mode 100644 index 0000000..a4bf1cf --- /dev/null +++ b/KaraKeep/attachments/ac0e47fd-e093-4338-9ed7-c30a5e36eb51-NO.S-PROJECT-on-X-”【pick.jpg @@ -0,0 +1,3 @@ +

Don’t miss what’s happening

People on X are the first to know.

Post

Conversation

【pick up】おでかけパニエ ブラック + +フリルのボリュームだけでふわっふわの、ミニ丈仕様のパニエ。お手元のミニワンピースを、お気軽にシルエットチェンジ!フリルをチラッとのぞかせても可愛いアイテムです。

Image

Image

Image

New to X?

Sign up now to get your own personalized timeline!

By signing up, you agree to the Terms of Service and Privacy Policy, including Cookie Use.

Trending now

What’s happening

Music · Trending

中島裕翔

Trending worldwide

裕翔結婚

Trending worldwide

結婚発表

Sports · Trending

マンシー

\ No newline at end of file diff --git a/KaraKeep/attachments/ad9d6ba0-fa5a-4d74-b6b6-416477c85347-Lake-Como,-Italy-Screenshot.jpg b/KaraKeep/attachments/ad9d6ba0-fa5a-4d74-b6b6-416477c85347-Lake-Como,-Italy-Screenshot.jpg new file mode 100644 index 0000000..d554abe Binary files /dev/null and b/KaraKeep/attachments/ad9d6ba0-fa5a-4d74-b6b6-416477c85347-Lake-Como,-Italy-Screenshot.jpg differ diff --git a/KaraKeep/attachments/adc875e0-f5a9-4ad8-ae9e-787ed98fe852-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg b/KaraKeep/attachments/adc875e0-f5a9-4ad8-ae9e-787ed98fe852-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg new file mode 100644 index 0000000..ac8f236 --- /dev/null +++ b/KaraKeep/attachments/adc875e0-f5a9-4ad8-ae9e-787ed98fe852-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg @@ -0,0 +1,1260 @@ +
+ + + + +
+ +
+ + + + +
+
+ + + Back + + + + + + + +
+
+ + +
+

+ Search with your voice +

+
+ +
+ +
+ +
+ + + +
+ + + + + +
+ + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+
+ + +
+ +

+ Download +

+
+ + + +
+ +
+
+ + +

+ 21,644 views • Apr 10, 2026 • #ぽこあポケモン #ぽこポケ #ぽこあ +

+ + + + + + +

5×5のスペースで収まる小さなレイアウトを12個考えました +すべて生息地つきでデザインしています! + 

...more +
...more + +
+ +
+ + + + +
+
+ + + + + + + + + + + + +
+ + + + +
+ + +
+ + みんなはどのレイアウトが好き? +コメント欄で教えてね +
+ + + + + + + +
+ + + +

+ Like +

+ + +

+ 8 +

+ +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + まさにこんな動画を待ってました!毎回かわいくておしゃれでアイテムの使い方もじょうずすぎて大ファンです🥹🥹 +
+ + + + + + + +
+ + + +

+ Like +

+ + +

+ 6 +

+ +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 9×9のも出してほしい +
+ + + + + + + +
+ + + +

+ Like +

+ + +

+ 3 +

+ +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + めっちゃ参考になります、金属とか機械のレイアウトが好きですね +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 真似したいレイアウトばかり、、、最後に実際においた例まで見せてもらえて早速ピカチュウとピチューのピクニックを作りたくなってる私w +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 使用素材一覧が最初に出てくるのがめちゃくちゃありがたい&この材料でどんな5×5になるの…?と楽しく拝見できました!! +街クリエイトも動画作りもめちゃくちゃすごいです!!! +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + いつも動画楽しみにしてます! +今回もすごくかわいいです参考にさせていただきます! +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + ほんとにわかりやすくて可愛くていつも参考にさせて頂いてます +すでに風車小屋以外全て作りました +今回のも作りやすそうなのに可愛くて絶対作ります +
+ + + + + + + +
+ + + +

+ Like +

+ + +

+ 1 +

+ +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 参考にさせて頂きます! +これで住み心地もあがるのなら、いいですね! +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 12個もすごーいしかもどれもかわいくてちゃんと生息地になってるとこさすがです!そして全部雰囲気ぜんぜん違うレイアウトで、それぞれの街の雰囲気にどれかは絶対合うはずって思いました🫶 +私はというと〜工事現場が好きすぎる〜だから作業場も好き +あとはパン屋さんSwitch2ぽこポケ持ってないくせに、作ってみたいな〜って思っちゃいました +
+ + + + + + + +
+ + + +

+ Like +

+ + +

+ 2 +

+ +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + イングリッシュガーデンとピザ釜のとてもステキ +まだアイテムが揃ってないものが作れるようになったら作ってみたいです(≧∇≦)ありがとう +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + どれもみんな可愛い +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 最後のピチューピカチュウに癒されました! +やっぱ可愛いは正義 +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 可愛い~!🫶️色んなところで使えそうだしエリアの繋ぎにもなるの天才過ぎる… +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + ゆりもさーん登録者5万人おめでとうございます·͜· ♡ +うわぁぁどれも可愛すぎる~!!!!好きすぎる…自分のとこにも取り入れます♡ +そしてエレガレントなゆりもさんも可愛すぎませんか𐤔𐤔𐤔 +
+ + + + + + + +
+ + + +

+ Like +

+ + +

+ 1 +

+ +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + どれも役に立ちそうなレイアウトですね! +ゆりもさんはちょっとした隙間建築とか +装飾も本当上手で参考になります +自分は溶鉱炉付きの作業場が気に入りました +もしぽこポケを始めたら色々作ってみたいです! +
+ + + + Read more + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + チャンネル登録させてもらいました +レイアウト全部好きです真似させてください +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + 改めまして5万人おめでとうございます! +好きなのは10のパン屋ですかね〜 3の砂場のやつもポケモン(シロデスナ)かな? +
+ + + + + + + +
+ + + +

+ Like +

+ + + + +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +
+ + + + +
+ + +
+ + ちょうど、ゆりもさん5×5の動画とか出さないのかな〜って思ってたところだったのでめっちゃタイミング良くてありがたいです +参考にさせていただきます\(*°∀°*)/ +
+ + + + + + + +
+ + + +

+ Like +

+ + +

+ 1 +

+ +

+ Dislike +

+ + + + + + +
+ + + +
+ + +
+ + +Top is selected, so you'll see featured comments
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + +

+ 【5×5クリエイト】生息地つき!街づくりで役に立つレイアウト12選 | ぽこあポケモン🌱 Pokopia 5×5 Build +

+ + +

1.7KLikes

21,644Views

15hAgo

+ +
+ + + +
+ + +

Follow along using the transcript.

+ + + + +
+

ゆりも / Yurimo

+

+ 51.2K subscribers +

+
+
+ + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/KaraKeep/attachments/b15135b3-ba0e-4616-802f-86652a3b6494-Catalytic-Converter-for.jpg b/KaraKeep/attachments/b15135b3-ba0e-4616-802f-86652a3b6494-Catalytic-Converter-for.jpg new file mode 100644 index 0000000..386a378 Binary files /dev/null and b/KaraKeep/attachments/b15135b3-ba0e-4616-802f-86652a3b6494-Catalytic-Converter-for.jpg differ diff --git a/KaraKeep/attachments/b4b61eef-3ac2-411c-ad91-4d20a30d4fb5-IPv6-Network-(Auto).jpg b/KaraKeep/attachments/b4b61eef-3ac2-411c-ad91-4d20a30d4fb5-IPv6-Network-(Auto).jpg new file mode 100644 index 0000000..9cca6c3 Binary files /dev/null and b/KaraKeep/attachments/b4b61eef-3ac2-411c-ad91-4d20a30d4fb5-IPv6-Network-(Auto).jpg differ diff --git a/KaraKeep/attachments/b567eb28-c60a-4986-9c52-48be624c59bd-Manifold-Catalytic-Converter.jpg b/KaraKeep/attachments/b567eb28-c60a-4986-9c52-48be624c59bd-Manifold-Catalytic-Converter.jpg new file mode 100644 index 0000000..c893348 --- /dev/null +++ b/KaraKeep/attachments/b567eb28-c60a-4986-9c52-48be624c59bd-Manifold-Catalytic-Converter.jpg @@ -0,0 +1 @@ +

Busted Auto Parts

K Source Driver Side Mirror w/ Backing Fits 17-20 Elantra Sedan (Korean & US)

Fits 07-14 Tahoe Yukon 07-13 Escalade Left Driver Pwr Mirror with Heat, Pwr Fold

Left Driver Mirror Glass Heated w/Rear Holder For 09-19 Journey w/Manual Fold

Fits 94-04 S10 GM Sonoma Right Pass Mirror Assm Non Fold Manual Text Blk

Taurus Sable Right Pass Power Smooth & Text Blk Non-Fold w/ Heat, Puddle Lamp

Sponsored

People who viewed this item also viewed

  • For HYUNDAI ELANTRA 2.0L 2017-2020 Manifold Catalytic Converter 28510-2EFA0

    $94.04

    Free delivery

  • NEW Manifold Catalytic Converter For 2017-2020 Hyundai Elantra 2.0L US

    $139.00

    Free delivery

    Sponsored

  • For HYUNDAI ELANTRA 2.0L 2017-2020 Manifold Catalytic Converter 674-092

    $84.99

    Free delivery

  • Manifold Catalytic Converter for Hyundai Elantra Sedan 2.0L L4 GAS 2017-2020

    $59.80

    Free delivery

  • Catalytic Converter for Hyundai Elantra Gt 2014-2017/Tucson 2014-2018 2.0L

    $112.58

    Free delivery

Similar Items

Gf8acc207-8dce-4e37-98cb-c788bfcfe2ddS4d559804-8cb3-4b1f-88d3-6c44ec2d55e9p69e299c1-0732-4617-aa49-9bf49d1c8d04Ea1af5988-85bc-4707-b292-1978d3f6e0d5 1305d67e-355a-4620-aa24-3dc510194f54o1357760e-60dc-406b-8200-f2fb3a4a39d2n8eb5f66d-a72b-44b3-a9a3-f9314ac98842sf4f5b5b7-da4c-422a-a111-5d52faca7eb672739513e-6ba0-4f38-a04d-d33aa14411dc24f13c593-053e-4abc-81d3-278e051a1d81o1bd6bbca-dd91-4dcd-bca6-66be76347b18 6093ed3b-5e95-4baa-9778-1a37bc2440ecr5ee627cf-86e7-4742-b5f3-8ded401470927a621a70b-4ae9-435b-980e-5493a7d72a4aec56930e9-18d2-4864-9290-b78ee4555c89Ze5c53a9d-4fbb-472a-8e4b-06b862371219 e294cb30-5612-4e79-8baa-47aa06d1d067M0cbda18a-1b44-4144-ab16-1d9235aec899992dd0c30-e49d-4def-8be1-23f7fa734573 c25c5f9e-bf93-4839-8589-c3ee62ee5c4bNbd6698ef-d35f-4c6a-b366-4977dc1066e915241d01a-c7dd-4543-a0ef-666b7e3f63e8 5b868588-8fc2-49fb-bb08-3a305846fc66d80d02577-0d37-4591-971d-ea858085138a9ee79345-7ae4-45e6-bbc7-1bf76782d957787674d1-cde1-4906-baf0-fa098ac5993675e75c08-d071-4f13-a4cf-844321033868Edb1e9107-90dd-4812-a415-b84ad3b2d3ad

  • Fits HYUNDAI Elantra 2.0L 2014-2016 Manifold Catalytic Converter NOT for SULEV

    $129.00

    Free delivery

  • NEW Manifold Catalytic Converter For 2017-2020 Hyundai Elantra 2.0L

    $59.99

    Free delivery

    Seller 99.7% positive

  • Manifold Catalytic Converter For 2001-2003 Hyundai Elantra / 03-06 Tiburon 2.0L

    $177.99

    Free delivery

    25 sold

  • Manifold Catalytic Converter for Hyundai Elantra Sedan 2.0L L4 GAS 2017-2020

    $59.80

    Free delivery

    Top Rated Plus

US $87.99or Best Offer

or 4 interest-free payments of $22.00 available with

Condition:

New

Compatibility:

3 available1 sold

  • Add to Watchlist

Other people bought this. 1 has already sold.

Breathe easy. Free shipping and returns.

Shipping:

Free Standard Shipping.

Located in: Chino, California, United States

Delivery:

Returns:

30 days returns. Seller pays for return shipping.

Payments:

       Diners Club

Shop with confidence

Top Rated Plus

eBay Money Back Guarantee

About this item

Compatibility

This part is compatible with 34 vehicle(s)

YearMakeModelTrimEngineNotes
2019HyundaiElantraEssential Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraGLS Premium Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraGLS Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraLimited Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraLimited Tech Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraLuxury Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraPreferred Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraSEL Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraSE Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraUltimate Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2019HyundaiElantraValue Edition Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraGL SE Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraGLS Premium Sedan 4-Door2.0L 1999CC 122Cu. In. l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraGLS Sedan 4-Door2.0L 1999CC 122Cu. In. l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraGLS Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraGL Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraLE Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraL Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraLimited Sedan 4-Door2.0L 1999CC l4 GAS DOHC Naturally Aspirated
2018HyundaiElantraLimited Tech Sedan 4-Door2.0L 1999CC 122Cu. In. l4 GAS DOHC Naturally Aspirated

Item specifics

Condition

New: A brand-new, unused, unopened, undamaged item in its original packaging (where packaging is ...

Model

For HYUNDAI ELANTRA 2.0L 2017-2020

Brand

Moe-tech

Type

Manifold Catalytic Converter

Manufacturer Part Number

674-092

Manufacturer Warranty

1 Year

Interchange Part Number

41291, 285102EFB0, 285102ESB0, 22-172, 28510-2EFA0

Country of Origin

China

Item description from the seller

Seller business information

VAT number: GB 304065836

About this seller

Joined Feb 2018

Usually responds within 24 hours

We mainly sells computer accessories and home gardening products and are committed to providing high-quality products and perfect after-sales.Welcome to consult, welcome to buy.

Detailed seller ratings

Average for the last 12 months

Accurate description

4.9

Reasonable shipping cost

5.0

Shipping speed

5.0

Communication

5.0

Seller feedback (23,226)

All ratingsselected

Positive

Neutral

Negative

  • *****- Feedback left by buyer.

    Past 6 months

    Verified purchase

  • l***s (148)- Feedback left by buyer.

    Past month

    Verified purchase

  • s***b (119)- Feedback left by buyer.

    Past 6 months

    Verified purchase

    For 2008-2010 TOYOTA AVALON Front Bumper Radiator Grille Chrome 5310107050 (#196181395719)

  • d***r (544)- Feedback left by buyer.

    Past 6 months

    Verified purchase

    New For Lenovo Thinkpad T430 T430I T430S T530 X230 X230I L430 L530 Keyboard US (#193810799388)

  • *****- Feedback left by buyer.

    Past 6 months

    Verified purchase

  • a***r (1905)- Feedback left by buyer.

    Past 6 months

    Verified purchase

  • m***8 (117)- Feedback left by buyer.

    Past month

    Verified purchase

  • *****- Feedback left by buyer.

    Past month

    Verified purchase

More to explore :

\ No newline at end of file diff --git a/KaraKeep/attachments/bcbfe09f-691f-4f9d-a343-ee531061a0c3-armv6k-nintendo-3ds-The-rustc.jpg b/KaraKeep/attachments/bcbfe09f-691f-4f9d-a343-ee531061a0c3-armv6k-nintendo-3ds-The-rustc.jpg new file mode 100644 index 0000000..bdd9f70 --- /dev/null +++ b/KaraKeep/attachments/bcbfe09f-691f-4f9d-a343-ee531061a0c3-armv6k-nintendo-3ds-The-rustc.jpg @@ -0,0 +1,182 @@ +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+ + + + + + + + + + + + + +
+ +
+
+

armv6k-nintendo-3ds

+

Tier: 3

+

The Nintendo 3DS platform, which has an Armv6k processor, and its associated +operating system (horizon).

+

Rust support for this target is not affiliated with Nintendo, and is not derived +from nor used with any official Nintendo SDK.

+

Target maintainers

+

This target is maintained by members of the @rust3ds +organization:

+

@Meziu +@AzureMarker +@ian-h-chamberlain

+

Requirements

+

This target is cross-compiled. Dynamic linking is not supported.

+

#![no_std] crates can be built using build-std to build core and optionally +alloc, and either panic_abort or panic_unwind.

+

std is partially supported, but mostly works. Some APIs are unimplemented +and will simply return an error, such as std::process. An allocator is provided +by default.

+

In order to support some APIs, binaries must be linked against libc written +for the target, using a linker for the target. These are provided by the +devkitARM toolchain. See +Cross-compilation toolchains and C code +for more details.

+

Additionally, some helper crates provide implementations of some libc functions +use by std that may otherwise be missing. These, or an alternate implementation +of the relevant functions, are required to use std:

+
    +
  • pthread-3ds provides pthread APIs for std::thread.
  • +
  • shim-3ds fulfills some other missing libc APIs (e.g. getrandom).
  • +
+

Binaries built for this target should be compatible with all variants of the +3DS (and 2DS) hardware and firmware, but testing is limited and some versions may +not work correctly.

+

This target generates binaries in the ELF format.

+

Building the target

+

You can build Rust with support for the target by adding it to the target +list in bootstrap.toml and providing paths to the devkitARM toolchain.

+
[build]
+build-stage = 1
+target = ["armv6k-nintendo-3ds"]
+
+[target.armv6k-nintendo-3ds]
+cc = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-gcc"
+cxx = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-g++"
+ar = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-ar"
+ranlib = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-ranlib"
+linker = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-gcc"
+
+

Also, to build compiler_builtins for the target, export these flags before +building the Rust toolchain:

+
export CFLAGS_armv6k_nintendo_3ds="-mfloat-abi=hard -mtune=mpcore -mtp=soft -march=armv6k"
+
+

Building Rust programs

+

Rust does not yet ship pre-compiled artifacts for this target.

+

The recommended way to build binaries is by using the +cargo-3ds tool, which uses build-std +and provides commands that work like the usual cargo run, cargo build, etc. +The cargo 3ds new will automatically set up a new project with the dependencies +needed to build a simple binary.

+

You can also build Rust with the target enabled (see +Building the target above).

+

As mentioned in Requirements, programs that use std must link +against both the devkitARM toolchain and libraries providing the libc APIs used +in std. There is a general-purpose utility crate for working with nonstandard +APIs provided by the OS: ctru-rs. +Add it to Cargo.toml to use it in your program:

+
[dependencies]
+ctru-rs = { git = "https://github.com/rust3ds/ctru-rs.git" }
+
+

Depending on ctru-rs ensures that all the necessary symbols are available at +link time.

+

Testing

+

Binaries built for this target can be run in an emulator (most commonly +Citra), or sent to a device through +the use of a tool like devkitARM’s 3dslink. They may also simply be copied +to an SD card to be inserted in the device.

+

The cargo-3ds tool mentioned in Building Rust programs +supports the use of 3dslink with cargo 3ds run. The default Rust test runner +is not supported, but +custom test frameworks +can be used with cargo 3ds test to run unit tests on a device.

+

The Rust test suite for library/std is not yet supported.

+

Cross-compilation toolchains and C code

+

C code can be built for this target using the +devkitARM toolchain. +This toolchain provides arm-none-eabi-gcc as the linker used to link Rust +programs as well.

+

The toolchain also provides a libc implementation, which is required by std +for many of its APIs, and a helper library libctru which is used by several +of the helper crates listed in Requirements. +This toolchain does not, however, include all of the APIs expected by std, +and the remaining APIs are implemented by pthread-3ds and linker-fix-3ds.

+ +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/KaraKeep/attachments/bcfcfd90-a1b3-417c-9f1f-534017c06505-NO.S-PROJECT-on-X-”【pick.jpg b/KaraKeep/attachments/bcfcfd90-a1b3-417c-9f1f-534017c06505-NO.S-PROJECT-on-X-”【pick.jpg new file mode 100644 index 0000000..52a6e61 Binary files /dev/null and b/KaraKeep/attachments/bcfcfd90-a1b3-417c-9f1f-534017c06505-NO.S-PROJECT-on-X-”【pick.jpg differ diff --git a/KaraKeep/attachments/c3afda7a-3966-4fe8-9ac0-d526aefee8fb-Poke-Dolls-Guide.jpg b/KaraKeep/attachments/c3afda7a-3966-4fe8-9ac0-d526aefee8fb-Poke-Dolls-Guide.jpg new file mode 100644 index 0000000..dc39daa Binary files /dev/null and b/KaraKeep/attachments/c3afda7a-3966-4fe8-9ac0-d526aefee8fb-Poke-Dolls-Guide.jpg differ diff --git a/KaraKeep/attachments/c78ddd37-e319-48e9-aa44-9d05e7ec5535-the-happy-smiler.jpg b/KaraKeep/attachments/c78ddd37-e319-48e9-aa44-9d05e7ec5535-the-happy-smiler.jpg new file mode 100644 index 0000000..2110eac Binary files /dev/null and b/KaraKeep/attachments/c78ddd37-e319-48e9-aa44-9d05e7ec5535-the-happy-smiler.jpg differ diff --git a/KaraKeep/attachments/d4ae7d43-46d3-4c73-99d0-9277ad8e4dc4-Brutalism-The-University-of.jpg b/KaraKeep/attachments/d4ae7d43-46d3-4c73-99d0-9277ad8e4dc4-Brutalism-The-University-of.jpg new file mode 100644 index 0000000..4e2ee4d Binary files /dev/null and b/KaraKeep/attachments/d4ae7d43-46d3-4c73-99d0-9277ad8e4dc4-Brutalism-The-University-of.jpg differ diff --git a/KaraKeep/attachments/d8481403-ae53-4216-9acc-cbd0f58e5ccf-Anker-Desk-Clamp-USB-Power.jpg b/KaraKeep/attachments/d8481403-ae53-4216-9acc-cbd0f58e5ccf-Anker-Desk-Clamp-USB-Power.jpg new file mode 100644 index 0000000..52b3e5e Binary files /dev/null and b/KaraKeep/attachments/d8481403-ae53-4216-9acc-cbd0f58e5ccf-Anker-Desk-Clamp-USB-Power.jpg differ diff --git a/KaraKeep/attachments/dafa3407-18bd-41b4-a93c-5e8a95815438-I-painted-a-Jirachi-Pokemon.jpg b/KaraKeep/attachments/dafa3407-18bd-41b4-a93c-5e8a95815438-I-painted-a-Jirachi-Pokemon.jpg new file mode 100644 index 0000000..cacb07b Binary files /dev/null and b/KaraKeep/attachments/dafa3407-18bd-41b4-a93c-5e8a95815438-I-painted-a-Jirachi-Pokemon.jpg differ diff --git a/KaraKeep/attachments/ddca5d7b-0f28-4575-889f-92116e046cd0-image.jpg b/KaraKeep/attachments/ddca5d7b-0f28-4575-889f-92116e046cd0-image.jpg new file mode 100644 index 0000000..8a8873f Binary files /dev/null and b/KaraKeep/attachments/ddca5d7b-0f28-4575-889f-92116e046cd0-image.jpg differ diff --git a/KaraKeep/attachments/e3288a47-b14b-479a-8728-648abafacba4-Stamp-Values.jpg b/KaraKeep/attachments/e3288a47-b14b-479a-8728-648abafacba4-Stamp-Values.jpg new file mode 100644 index 0000000..7798a0a Binary files /dev/null and b/KaraKeep/attachments/e3288a47-b14b-479a-8728-648abafacba4-Stamp-Values.jpg differ diff --git a/KaraKeep/attachments/ea288328-da05-4052-a325-d8c6b415e8df-Manifold-Catalytic-Converter.jpg b/KaraKeep/attachments/ea288328-da05-4052-a325-d8c6b415e8df-Manifold-Catalytic-Converter.jpg new file mode 100644 index 0000000..74bbeca Binary files /dev/null and b/KaraKeep/attachments/ea288328-da05-4052-a325-d8c6b415e8df-Manifold-Catalytic-Converter.jpg differ diff --git a/KaraKeep/attachments/ea5bdc41-7565-4839-9b85-64266555d7cd-Make-This-Lumber-Farm-in.jpg b/KaraKeep/attachments/ea5bdc41-7565-4839-9b85-64266555d7cd-Make-This-Lumber-Farm-in.jpg new file mode 100644 index 0000000..bfd3da7 Binary files /dev/null and b/KaraKeep/attachments/ea5bdc41-7565-4839-9b85-64266555d7cd-Make-This-Lumber-Farm-in.jpg differ diff --git a/KaraKeep/attachments/ecb5262d-3225-4cd3-a0fc-4cb6354c9a80-Manifold-Catalytic-Converter.jpg b/KaraKeep/attachments/ecb5262d-3225-4cd3-a0fc-4cb6354c9a80-Manifold-Catalytic-Converter.jpg new file mode 100644 index 0000000..b80d4ad Binary files /dev/null and b/KaraKeep/attachments/ecb5262d-3225-4cd3-a0fc-4cb6354c9a80-Manifold-Catalytic-Converter.jpg differ diff --git a/KaraKeep/attachments/f084371d-f859-44b1-a0aa-e29f08919b2a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg b/KaraKeep/attachments/f084371d-f859-44b1-a0aa-e29f08919b2a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg new file mode 100644 index 0000000..4a29e0c Binary files /dev/null and b/KaraKeep/attachments/f084371d-f859-44b1-a0aa-e29f08919b2a-(1)-【5×5クリエイト】生息地つき!街づくりで役に立つレ.jpg differ diff --git a/KaraKeep/attachments/f378201a-fcdb-4c98-8b1f-049588cb2fe4-I-painted-a-Jirachi-Pokemon.jpg b/KaraKeep/attachments/f378201a-fcdb-4c98-8b1f-049588cb2fe4-I-painted-a-Jirachi-Pokemon.jpg new file mode 100644 index 0000000..60dffe6 Binary files /dev/null and b/KaraKeep/attachments/f378201a-fcdb-4c98-8b1f-049588cb2fe4-I-painted-a-Jirachi-Pokemon.jpg differ diff --git a/KaraKeep/attachments/f65116b2-fa97-4d35-b514-fd80108ac35f-Pig-Tail-Bridge-№54,.jpg b/KaraKeep/attachments/f65116b2-fa97-4d35-b514-fd80108ac35f-Pig-Tail-Bridge-№54,.jpg new file mode 100644 index 0000000..c19f71a Binary files /dev/null and b/KaraKeep/attachments/f65116b2-fa97-4d35-b514-fd80108ac35f-Pig-Tail-Bridge-№54,.jpg differ diff --git a/KaraKeep/attachments/fd9e5ed2-90f1-4c34-91a0-26164abe8b4b-NO.S-PROJECT-on-X-”【pick.jpg b/KaraKeep/attachments/fd9e5ed2-90f1-4c34-91a0-26164abe8b4b-NO.S-PROJECT-on-X-”【pick.jpg new file mode 100644 index 0000000..8e668f9 Binary files /dev/null and b/KaraKeep/attachments/fd9e5ed2-90f1-4c34-91a0-26164abe8b4b-NO.S-PROJECT-on-X-”【pick.jpg differ