From 5434d577072e5d10f1a759c8035f161c2ea14f5a Mon Sep 17 00:00:00 2001 From: Stefan Imhoff Date: Thu, 15 Jun 2023 12:07:26 +0200 Subject: [PATCH] fix(a11y): more accessibility issues --- astro.config.mjs | 4 +- shiki-theme.json | 1405 +++++++++++++++++ src/components/AmazonBook.tsx | 2 +- src/components/JournalList.astro | 2 +- src/content/journal/2017/gitbook.mdx | 2 +- .../journal/2020/apps-tools-services.mdx | 430 +---- src/pages/[...slug].astro | 2 +- src/pages/ai-art.astro | 7 +- src/pages/sketchnotes.astro | 7 +- src/styles/global.css | 4 + tailwind.config.cjs | 2 +- 11 files changed, 1429 insertions(+), 438 deletions(-) create mode 100644 shiki-theme.json diff --git a/astro.config.mjs b/astro.config.mjs index d302afa..9e8f87f 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -10,12 +10,14 @@ import serviceWorker from 'astrojs-service-worker'; import { site } from './src/data/site'; import { remarkReadingTime, remarkWidont } from './src/utils'; +import customTheme from './shiki-theme.json'; + // https://astro.build/config export default defineConfig({ site: 'https://www.stefanimhoff.de', markdown: { shikiConfig: { - theme: 'nord', + theme: customTheme, langs: [], wrap: true, }, diff --git a/shiki-theme.json b/shiki-theme.json new file mode 100644 index 0000000..7f85291 --- /dev/null +++ b/shiki-theme.json @@ -0,0 +1,1405 @@ +{ + "name": "nord", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "focusBorder": "#3b4252", + "foreground": "#d8dee9", + "activityBar.background": "#2e3440", + "activityBar.dropBackground": "#3b4252", + "activityBar.foreground": "#d8dee9", + "activityBar.activeBorder": "#88c0d0", + "activityBar.activeBackground": "#3b4252", + "activityBarBadge.background": "#88c0d0", + "activityBarBadge.foreground": "#2e3440", + "badge.foreground": "#2e3440", + "badge.background": "#88c0d0", + "button.background": "#88c0d0ee", + "button.foreground": "#2e3440", + "button.hoverBackground": "#88c0d0", + "button.secondaryBackground": "#434c5e", + "button.secondaryForeground": "#d8dee9", + "button.secondaryHoverBackground": "#4c566a", + "charts.red": "#bf616a", + "charts.blue": "#81a1c1", + "charts.yellow": "#ebcb8b", + "charts.orange": "#d08770", + "charts.green": "#a3be8c", + "charts.purple": "#b48ead", + "charts.foreground": "#d8dee9", + "charts.lines": "#88c0d0", + "debugConsole.infoForeground": "#88c0d0", + "debugConsole.warningForeground": "#ebcb8b", + "debugConsole.errorForeground": "#bf616a", + "debugConsole.sourceForeground": "#616e88", + "debugConsoleInputIcon.foreground": "#81a1c1", + "debugExceptionWidget.background": "#4c566a", + "debugExceptionWidget.border": "#2e3440", + "debugToolBar.background": "#3b4252", + "descriptionForeground": "#d8dee9e6", + "diffEditor.insertedTextBackground": "#81a1c133", + "diffEditor.removedTextBackground": "#bf616a4d", + "dropdown.background": "#3b4252", + "dropdown.border": "#3b4252", + "dropdown.foreground": "#d8dee9", + "editorActiveLineNumber.foreground": "#d8dee9cc", + "editorCursor.foreground": "#d8dee9", + "editorHint.border": "#ebcb8b00", + "editorHint.foreground": "#ebcb8b", + "editorIndentGuide.background": "#434c5eb3", + "editorIndentGuide.activeBackground": "#4c566a", + "editorInlayHint.background": "#434c5e", + "editorInlayHint.foreground": "#d8dee9", + "editorLineNumber.foreground": "#4c566a", + "editorLineNumber.activeForeground": "#d8dee9", + "editorWhitespace.foreground": "#4c566ab3", + "editorWidget.background": "#2e3440", + "editorWidget.border": "#3b4252", + "editor.background": "#2e3440", + "editor.foreground": "#d8dee9", + "editor.hoverHighlightBackground": "#3b4252", + "editor.findMatchBackground": "#88c0d066", + "editor.findMatchHighlightBackground": "#88c0d033", + "editor.findRangeHighlightBackground": "#88c0d033", + "editor.lineHighlightBackground": "#3b4252", + "editor.lineHighlightBorder": "#3b4252", + "editor.inactiveSelectionBackground": "#434c5ecc", + "editor.inlineValuesBackground": "#4c566a", + "editor.inlineValuesForeground": "#eceff4", + "editor.selectionBackground": "#434c5ecc", + "editor.selectionHighlightBackground": "#434c5ecc", + "editor.rangeHighlightBackground": "#434c5e52", + "editor.wordHighlightBackground": "#81a1c166", + "editor.wordHighlightStrongBackground": "#81a1c199", + "editor.stackFrameHighlightBackground": "#5e81ac", + "editor.focusedStackFrameHighlightBackground": "#5e81ac", + "editorError.foreground": "#bf616a", + "editorError.border": "#bf616a00", + "editorWarning.foreground": "#ebcb8b", + "editorWarning.border": "#ebcb8b00", + "editorBracketMatch.background": "#2e344000", + "editorBracketMatch.border": "#88c0d0", + "editorBracketHighlight.foreground1": "#8fbcbb", + "editorBracketHighlight.foreground2": "#88c0d0", + "editorBracketHighlight.foreground3": "#81a1c1", + "editorBracketHighlight.foreground4": "#5e81ac", + "editorBracketHighlight.foreground5": "#8fbcbb", + "editorBracketHighlight.foreground6": "#88c0d0", + "editorBracketHighlight.unexpectedBracket.foreground": "#bf616a", + "editorCodeLens.foreground": "#4c566a", + "editorGroup.background": "#2e3440", + "editorGroup.border": "#3b425201", + "editorGroup.dropBackground": "#3b425299", + "editorGroupHeader.border": "#3b425200", + "editorGroupHeader.noTabsBackground": "#2e3440", + "editorGroupHeader.tabsBackground": "#2e3440", + "editorGroupHeader.tabsBorder": "#3b425200", + "editorGutter.background": "#2e3440", + "editorGutter.modifiedBackground": "#ebcb8b", + "editorGutter.addedBackground": "#a3be8c", + "editorGutter.deletedBackground": "#bf616a", + "editorHoverWidget.background": "#3b4252", + "editorHoverWidget.border": "#3b4252", + "editorLink.activeForeground": "#88c0d0", + "editorMarkerNavigation.background": "#5e81acc0", + "editorMarkerNavigationError.background": "#bf616ac0", + "editorMarkerNavigationWarning.background": "#ebcb8bc0", + "editorOverviewRuler.border": "#3b4252", + "editorOverviewRuler.currentContentForeground": "#3b4252", + "editorOverviewRuler.incomingContentForeground": "#3b4252", + "editorOverviewRuler.findMatchForeground": "#88c0d066", + "editorOverviewRuler.rangeHighlightForeground": "#88c0d066", + "editorOverviewRuler.selectionHighlightForeground": "#88c0d066", + "editorOverviewRuler.wordHighlightForeground": "#88c0d066", + "editorOverviewRuler.wordHighlightStrongForeground": "#88c0d066", + "editorOverviewRuler.modifiedForeground": "#ebcb8b", + "editorOverviewRuler.addedForeground": "#a3be8c", + "editorOverviewRuler.deletedForeground": "#bf616a", + "editorOverviewRuler.errorForeground": "#bf616a", + "editorOverviewRuler.warningForeground": "#ebcb8b", + "editorOverviewRuler.infoForeground": "#81a1c1", + "editorRuler.foreground": "#434c5e", + "editorSuggestWidget.background": "#2e3440", + "editorSuggestWidget.border": "#3b4252", + "editorSuggestWidget.foreground": "#d8dee9", + "editorSuggestWidget.focusHighlightForeground": "#88c0d0", + "editorSuggestWidget.highlightForeground": "#88c0d0", + "editorSuggestWidget.selectedBackground": "#434c5e", + "editorSuggestWidget.selectedForeground": "#d8dee9", + "extensionButton.prominentForeground": "#d8dee9", + "extensionButton.prominentBackground": "#434c5e", + "extensionButton.prominentHoverBackground": "#4c566a", + "errorForeground": "#bf616a", + "gitDecoration.modifiedResourceForeground": "#ebcb8b", + "gitDecoration.deletedResourceForeground": "#bf616a", + "gitDecoration.untrackedResourceForeground": "#a3be8c", + "gitDecoration.ignoredResourceForeground": "#d8dee966", + "gitDecoration.conflictingResourceForeground": "#5e81ac", + "gitDecoration.submoduleResourceForeground": "#8fbcbb", + "gitDecoration.stageDeletedResourceForeground": "#bf616a", + "gitDecoration.stageModifiedResourceForeground": "#ebcb8b", + "input.background": "#3b4252", + "input.foreground": "#d8dee9", + "input.placeholderForeground": "#d8dee999", + "input.border": "#3b4252", + "inputOption.activeBackground": "#5e81ac", + "inputOption.activeBorder": "#5e81ac", + "inputOption.activeForeground": "#eceff4", + "inputValidation.errorBackground": "#bf616a", + "inputValidation.errorBorder": "#bf616a", + "inputValidation.infoBackground": "#81a1c1", + "inputValidation.infoBorder": "#81a1c1", + "inputValidation.warningBackground": "#d08770", + "inputValidation.warningBorder": "#d08770", + "keybindingLabel.background": "#4c566a", + "keybindingLabel.border": "#4c566a", + "keybindingLabel.bottomBorder": "#4c566a", + "keybindingLabel.foreground": "#d8dee9", + "list.activeSelectionBackground": "#88c0d0", + "list.activeSelectionForeground": "#2e3440", + "list.inactiveSelectionBackground": "#434c5e", + "list.inactiveSelectionForeground": "#d8dee9", + "list.inactiveFocusBackground": "#434c5ecc", + "list.hoverForeground": "#eceff4", + "list.focusForeground": "#d8dee9", + "list.focusBackground": "#88c0d099", + "list.focusHighlightForeground": "#eceff4", + "list.hoverBackground": "#3b4252", + "list.dropBackground": "#88c0d099", + "list.highlightForeground": "#88c0d0", + "list.errorForeground": "#bf616a", + "list.warningForeground": "#ebcb8b", + "merge.currentHeaderBackground": "#81a1c166", + "merge.currentContentBackground": "#81a1c14d", + "merge.incomingHeaderBackground": "#8fbcbb66", + "merge.incomingContentBackground": "#8fbcbb4d", + "merge.border": "#3b425200", + "minimap.background": "#2e3440", + "minimap.errorHighlight": "#bf616acc", + "minimap.findMatchHighlight": "#88c0d0", + "minimap.selectionHighlight": "#88c0d0cc", + "minimap.warningHighlight": "#ebcb8bcc", + "minimapGutter.addedBackground": "#a3be8c", + "minimapGutter.deletedBackground": "#bf616a", + "minimapGutter.modifiedBackground": "#ebcb8b", + "minimapSlider.activeBackground": "#434c5eaa", + "minimapSlider.background": "#434c5e99", + "minimapSlider.hoverBackground": "#434c5eaa", + "notification.background": "#3b4252", + "notification.buttonBackground": "#434c5e", + "notification.buttonForeground": "#d8dee9", + "notification.buttonHoverBackground": "#4c566a", + "notification.errorBackground": "#bf616a", + "notification.errorForeground": "#2e3440", + "notification.foreground": "#d8dee9", + "notification.infoBackground": "#88c0d0", + "notification.infoForeground": "#2e3440", + "notification.warningBackground": "#ebcb8b", + "notification.warningForeground": "#2e3440", + "notificationCenter.border": "#3b425200", + "notificationCenterHeader.background": "#2e3440", + "notificationCenterHeader.foreground": "#88c0d0", + "notificationLink.foreground": "#88c0d0", + "notifications.background": "#3b4252", + "notifications.border": "#2e3440", + "notifications.foreground": "#d8dee9", + "notificationToast.border": "#3b425200", + "panel.background": "#2e3440", + "panel.border": "#3b4252", + "panelTitle.activeBorder": "#88c0d000", + "panelTitle.activeForeground": "#88c0d0", + "panelTitle.inactiveForeground": "#d8dee9", + "peekView.border": "#4c566a", + "peekViewEditor.background": "#2e3440", + "peekViewEditorGutter.background": "#2e3440", + "peekViewEditor.matchHighlightBackground": "#88c0d04d", + "peekViewResult.background": "#2e3440", + "peekViewResult.fileForeground": "#88c0d0", + "peekViewResult.lineForeground": "#d8dee966", + "peekViewResult.matchHighlightBackground": "#88c0d0cc", + "peekViewResult.selectionBackground": "#434c5e", + "peekViewResult.selectionForeground": "#d8dee9", + "peekViewTitle.background": "#3b4252", + "peekViewTitleDescription.foreground": "#d8dee9", + "peekViewTitleLabel.foreground": "#88c0d0", + "pickerGroup.border": "#3b4252", + "pickerGroup.foreground": "#88c0d0", + "progressBar.background": "#88c0d0", + "quickInputList.focusBackground": "#88c0d0", + "quickInputList.focusForeground": "#2e3440", + "sash.hoverBorder": "#88c0d0", + "scrollbar.shadow": "#00000066", + "scrollbarSlider.activeBackground": "#434c5eaa", + "scrollbarSlider.background": "#434c5e99", + "scrollbarSlider.hoverBackground": "#434c5eaa", + "selection.background": "#88c0d099", + "sideBar.background": "#2e3440", + "sideBar.foreground": "#d8dee9", + "sideBar.border": "#3b4252", + "sideBarSectionHeader.background": "#3b4252", + "sideBarSectionHeader.foreground": "#d8dee9", + "sideBarTitle.foreground": "#d8dee9", + "statusBar.background": "#3b4252", + "statusBar.debuggingBackground": "#5e81ac", + "statusBar.debuggingForeground": "#d8dee9", + "statusBar.noFolderForeground": "#d8dee9", + "statusBar.noFolderBackground": "#3b4252", + "statusBar.foreground": "#d8dee9", + "statusBarItem.activeBackground": "#4c566a", + "statusBarItem.hoverBackground": "#434c5e", + "statusBarItem.prominentBackground": "#3b4252", + "statusBarItem.prominentHoverBackground": "#434c5e", + "statusBarItem.errorBackground": "#3b4252", + "statusBarItem.errorForeground": "#bf616a", + "statusBarItem.warningBackground": "#ebcb8b", + "statusBarItem.warningForeground": "#2e3440", + "statusBar.border": "#3b425200", + "tab.activeBackground": "#3b4252", + "tab.activeForeground": "#d8dee9", + "tab.border": "#3b425200", + "tab.activeBorder": "#88c0d000", + "tab.unfocusedActiveBorder": "#88c0d000", + "tab.inactiveBackground": "#2e3440", + "tab.inactiveForeground": "#d8dee966", + "tab.unfocusedActiveForeground": "#d8dee999", + "tab.unfocusedInactiveForeground": "#d8dee966", + "tab.hoverBackground": "#3b4252cc", + "tab.unfocusedHoverBackground": "#3b4252b3", + "tab.hoverBorder": "#88c0d000", + "tab.unfocusedHoverBorder": "#88c0d000", + "tab.activeBorderTop": "#88c0d000", + "tab.unfocusedActiveBorderTop": "#88c0d000", + "tab.lastPinnedBorder": "#4c566a", + "terminal.background": "#2e3440", + "terminal.foreground": "#d8dee9", + "terminal.ansiBlack": "#3b4252", + "terminal.ansiRed": "#bf616a", + "terminal.ansiGreen": "#a3be8c", + "terminal.ansiYellow": "#ebcb8b", + "terminal.ansiBlue": "#81a1c1", + "terminal.ansiMagenta": "#b48ead", + "terminal.ansiCyan": "#88c0d0", + "terminal.ansiWhite": "#e5e9f0", + "terminal.ansiBrightBlack": "#4c566a", + "terminal.ansiBrightRed": "#bf616a", + "terminal.ansiBrightGreen": "#a3be8c", + "terminal.ansiBrightYellow": "#ebcb8b", + "terminal.ansiBrightBlue": "#81a1c1", + "terminal.ansiBrightMagenta": "#b48ead", + "terminal.ansiBrightCyan": "#8fbcbb", + "terminal.ansiBrightWhite": "#eceff4", + "terminal.tab.activeBorder": "#88c0d0", + "textBlockQuote.background": "#3b4252", + "textBlockQuote.border": "#81a1c1", + "textCodeBlock.background": "#4c566a", + "textLink.activeForeground": "#88c0d0", + "textLink.foreground": "#88c0d0", + "textPreformat.foreground": "#8fbcbb", + "textSeparator.foreground": "#eceff4", + "titleBar.activeBackground": "#2e3440", + "titleBar.activeForeground": "#d8dee9", + "titleBar.border": "#2e344000", + "titleBar.inactiveBackground": "#2e3440", + "titleBar.inactiveForeground": "#d8dee966", + "tree.indentGuidesStroke": "#616e88", + "walkThrough.embeddedEditorBackground": "#2e3440", + "welcomePage.buttonBackground": "#434c5e", + "welcomePage.buttonHoverBackground": "#4c566a", + "widget.shadow": "#00000066" + }, + "tokenColors": [ + { + "settings": { + "foreground": "#d8dee9ff", + "background": "#1e2229" + } + }, + { + "scope": "emphasis", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "strong", + "settings": { + "fontStyle": "bold" + } + }, + { + "name": "Comment", + "scope": "comment", + "settings": { + "foreground": "#616E88" + } + }, + { + "name": "Constant Character", + "scope": "constant.character", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "Constant Character Escape", + "scope": "constant.character.escape", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "Constant Language", + "scope": "constant.language", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Constant Numeric", + "scope": "constant.numeric", + "settings": { + "foreground": "#B48EAD" + } + }, + { + "name": "Constant Regexp", + "scope": "constant.regexp", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "Entity Name Class/Type", + "scope": ["entity.name.class", "entity.name.type.class"], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "Entity Name Function", + "scope": "entity.name.function", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "Entity Name Tag", + "scope": "entity.name.tag", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Entity Other Attribute Name", + "scope": "entity.other.attribute-name", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "Entity Other Inherited Class", + "scope": "entity.other.inherited-class", + "settings": { + "fontStyle": "bold", + "foreground": "#8FBCBB" + } + }, + { + "name": "Invalid Deprecated", + "scope": "invalid.deprecated", + "settings": { + "foreground": "#D8DEE9", + "background": "#EBCB8B" + } + }, + { + "name": "Invalid Illegal", + "scope": "invalid.illegal", + "settings": { + "foreground": "#D8DEE9", + "background": "#BF616A" + } + }, + { + "name": "Keyword", + "scope": "keyword", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Keyword Operator", + "scope": "keyword.operator", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Keyword Other New", + "scope": "keyword.other.new", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Markup Bold", + "scope": "markup.bold", + "settings": { + "fontStyle": "bold" + } + }, + { + "name": "Markup Changed", + "scope": "markup.changed", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "Markup Deleted", + "scope": "markup.deleted", + "settings": { + "foreground": "#BF616A" + } + }, + { + "name": "Markup Inserted", + "scope": "markup.inserted", + "settings": { + "foreground": "#A3BE8C" + } + }, + { + "name": "Meta Preprocessor", + "scope": "meta.preprocessor", + "settings": { + "foreground": "#5E81AC" + } + }, + { + "name": "Punctuation", + "scope": "punctuation", + "settings": { + "foreground": "#ECEFF4" + } + }, + { + "name": "Punctuation Definition Parameters", + "scope": [ + "punctuation.definition.method-parameters", + "punctuation.definition.function-parameters", + "punctuation.definition.parameters" + ], + "settings": { + "foreground": "#ECEFF4" + } + }, + { + "name": "Punctuation Definition Tag", + "scope": "punctuation.definition.tag", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Punctuation Definition Comment", + "scope": [ + "punctuation.definition.comment", + "punctuation.end.definition.comment", + "punctuation.start.definition.comment" + ], + "settings": { + "foreground": "#616E88" + } + }, + { + "name": "Punctuation Section", + "scope": "punctuation.section", + "settings": { + "foreground": "#ECEFF4" + } + }, + { + "name": "Punctuation Section Embedded", + "scope": ["punctuation.section.embedded.begin", "punctuation.section.embedded.end"], + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Punctuation Terminator", + "scope": "punctuation.terminator", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Punctuation Variable", + "scope": "punctuation.definition.variable", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Storage", + "scope": "storage", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "String", + "scope": "string", + "settings": { + "foreground": "#A3BE8C" + } + }, + { + "name": "String Regexp", + "scope": "string.regexp", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "Support Class", + "scope": "support.class", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "Support Constant", + "scope": "support.constant", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Support Function", + "scope": "support.function", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "Support Function Construct", + "scope": "support.function.construct", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Support Type", + "scope": "support.type", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "Support Type Exception", + "scope": "support.type.exception", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "Token Debug", + "scope": "token.debug-token", + "settings": { + "foreground": "#b48ead" + } + }, + { + "name": "Token Error", + "scope": "token.error-token", + "settings": { + "foreground": "#bf616a" + } + }, + { + "name": "Token Info", + "scope": "token.info-token", + "settings": { + "foreground": "#88c0d0" + } + }, + { + "name": "Token Warning", + "scope": "token.warn-token", + "settings": { + "foreground": "#ebcb8b" + } + }, + { + "name": "Variable", + "scope": "variable.other", + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "Variable Language", + "scope": "variable.language", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "Variable Parameter", + "scope": "variable.parameter", + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[C/CPP] Punctuation Separator Pointer-Access", + "scope": "punctuation.separator.pointer-access.c", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[C/CPP] Meta Preprocessor Include", + "scope": [ + "source.c meta.preprocessor.include", + "source.c string.quoted.other.lt-gt.include" + ], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[C/CPP] Conditional Directive", + "scope": [ + "source.cpp keyword.control.directive.conditional", + "source.cpp punctuation.definition.directive", + "source.c keyword.control.directive.conditional", + "source.c punctuation.definition.directive" + ], + "settings": { + "foreground": "#5E81AC", + "fontStyle": "bold" + } + }, + { + "name": "[CSS] Constant Other Color RGB Value", + "scope": "source.css constant.other.color.rgb-value", + "settings": { + "foreground": "#B48EAD" + } + }, + { + "name": "[CSS](Function) Meta Property-Value", + "scope": "source.css meta.property-value", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[CSS] Media Queries", + "scope": [ + "source.css keyword.control.at-rule.media", + "source.css keyword.control.at-rule.media punctuation.definition.keyword" + ], + "settings": { + "foreground": "#D08770" + } + }, + { + "name": "[CSS] Punctuation Definition Keyword", + "scope": "source.css punctuation.definition.keyword", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[CSS] Support Type Property Name", + "scope": "source.css support.type.property-name", + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[diff] Meta Range Context", + "scope": "source.diff meta.diff.range.context", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[diff] Meta Header From-File", + "scope": "source.diff meta.diff.header.from-file", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[diff] Punctuation Definition From-File", + "scope": "source.diff punctuation.definition.from-file", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[diff] Punctuation Definition Range", + "scope": "source.diff punctuation.definition.range", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[diff] Punctuation Definition Separator", + "scope": "source.diff punctuation.definition.separator", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Elixir](JakeBecker.elixir-ls) module names", + "scope": "entity.name.type.module.elixir", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Elixir](JakeBecker.elixir-ls) module attributes", + "scope": "variable.other.readwrite.module.elixir", + "settings": { + "foreground": "#D8DEE9", + "fontStyle": "bold" + } + }, + { + "name": "[Elixir](JakeBecker.elixir-ls) atoms", + "scope": "constant.other.symbol.elixir", + "settings": { + "foreground": "#D8DEE9", + "fontStyle": "bold" + } + }, + { + "name": "[Elixir](JakeBecker.elixir-ls) modules", + "scope": "variable.other.constant.elixir", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Go] String Format Placeholder", + "scope": "source.go constant.other.placeholder.go", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "[Java](JavaDoc) Comment Block Documentation HTML Entities", + "scope": "source.java comment.block.documentation.javadoc punctuation.definition.entity.html", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Java](JavaDoc) Constant Other", + "scope": "source.java constant.other", + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[Java](JavaDoc) Keyword Other Documentation", + "scope": "source.java keyword.other.documentation", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java](JavaDoc) Keyword Other Documentation Author", + "scope": "source.java keyword.other.documentation.author.javadoc", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java](JavaDoc) Keyword Other Documentation Directive/Custom", + "scope": [ + "source.java keyword.other.documentation.directive", + "source.java keyword.other.documentation.custom" + ], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java](JavaDoc) Keyword Other Documentation See", + "scope": "source.java keyword.other.documentation.see.javadoc", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java] Meta Method-Call", + "scope": "source.java meta.method-call meta.method", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Java](JavaDoc) Meta Tag Template Link", + "scope": [ + "source.java meta.tag.template.link.javadoc", + "source.java string.other.link.title.javadoc" + ], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java](JavaDoc) Meta Tag Template Value", + "scope": "source.java meta.tag.template.value.javadoc", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Java](JavaDoc) Punctuation Definition Keyword", + "scope": "source.java punctuation.definition.keyword.javadoc", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java](JavaDoc) Punctuation Definition Tag", + "scope": [ + "source.java punctuation.definition.tag.begin.javadoc", + "source.java punctuation.definition.tag.end.javadoc" + ], + "settings": { + "foreground": "#616E88" + } + }, + { + "name": "[Java] Storage Modifier Import", + "scope": "source.java storage.modifier.import", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java] Storage Modifier Package", + "scope": "source.java storage.modifier.package", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java] Storage Type", + "scope": "source.java storage.type", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java] Storage Type Annotation", + "scope": "source.java storage.type.annotation", + "settings": { + "foreground": "#D08770" + } + }, + { + "name": "[Java] Storage Type Generic", + "scope": "source.java storage.type.generic", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Java] Storage Type Primitive", + "scope": "source.java storage.type.primitive", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[JavaScript] Decorator", + "scope": [ + "source.js punctuation.decorator", + "source.js meta.decorator variable.other.readwrite", + "source.js meta.decorator entity.name.function" + ], + "settings": { + "foreground": "#D08770" + } + }, + { + "name": "[JavaScript] Meta Object-Literal Key", + "scope": "source.js meta.object-literal.key", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[JavaScript](JSDoc) Storage Type Class", + "scope": "source.js storage.type.class.jsdoc", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[JavaScript] String Template Literals Punctuation", + "scope": [ + "source.js string.quoted.template punctuation.quasi.element.begin", + "source.js string.quoted.template punctuation.quasi.element.end", + "source.js string.template punctuation.definition.template-expression" + ], + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[JavaScript] Interpolated String Template Punctuation Functions", + "scope": "source.js string.quoted.template meta.method-call.with-arguments", + "settings": { + "foreground": "#ECEFF4" + } + }, + { + "name": "[JavaScript] String Template Literal Variable", + "scope": [ + "source.js string.template meta.template.expression support.variable.property", + "source.js string.template meta.template.expression variable.other.object" + ], + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[JavaScript] Support Type Primitive", + "scope": "source.js support.type.primitive", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[JavaScript] Variable Other Object", + "scope": "source.js variable.other.object", + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[JavaScript] Variable Other Read-Write Alias", + "scope": "source.js variable.other.readwrite.alias", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[JavaScript] Parentheses in Template Strings", + "scope": [ + "source.js meta.embedded.line meta.brace.square", + "source.js meta.embedded.line meta.brace.round", + "source.js string.quoted.template meta.brace.square", + "source.js string.quoted.template meta.brace.round" + ], + "settings": { + "foreground": "#ECEFF4" + } + }, + { + "name": "[HTML] Constant Character Entity", + "scope": "text.html.basic constant.character.entity.html", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "[HTML] Constant Other Inline-Data", + "scope": "text.html.basic constant.other.inline-data", + "settings": { + "foreground": "#D08770", + "fontStyle": "italic" + } + }, + { + "name": "[HTML] Meta Tag SGML Doctype", + "scope": "text.html.basic meta.tag.sgml.doctype", + "settings": { + "foreground": "#5E81AC" + } + }, + { + "name": "[HTML] Punctuation Definition Entity", + "scope": "text.html.basic punctuation.definition.entity", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[INI] Entity Name Section Group-Title", + "scope": "source.properties entity.name.section.group-title.ini", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[INI] Punctuation Separator Key-Value", + "scope": "source.properties punctuation.separator.key-value.ini", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Markdown] Markup Fenced Code Block", + "scope": [ + "text.html.markdown markup.fenced_code.block", + "text.html.markdown markup.fenced_code.block punctuation.definition" + ], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Markdown] Markup Heading", + "scope": "markup.heading", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Markdown] Markup Inline", + "scope": [ + "text.html.markdown markup.inline.raw", + "text.html.markdown markup.inline.raw punctuation.definition.raw" + ], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Markdown] Markup Italic", + "scope": "text.html.markdown markup.italic", + "settings": { + "fontStyle": "italic" + } + }, + { + "name": "[Markdown] Markup Link", + "scope": "text.html.markdown markup.underline.link", + "settings": { + "fontStyle": "underline" + } + }, + { + "name": "[Markdown] Markup List Numbered/Unnumbered", + "scope": "text.html.markdown beginning.punctuation.definition.list", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Markdown] Markup Quote Punctuation Definition", + "scope": "text.html.markdown beginning.punctuation.definition.quote", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Markdown] Markup Quote Punctuation Definition", + "scope": "text.html.markdown markup.quote", + "settings": { + "foreground": "#616E88" + } + }, + { + "name": "[Markdown] Markup Math Constant", + "scope": "text.html.markdown constant.character.math.tex", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Markdown] Markup Math Definition Marker", + "scope": [ + "text.html.markdown punctuation.definition.math.begin", + "text.html.markdown punctuation.definition.math.end" + ], + "settings": { + "foreground": "#5E81AC" + } + }, + { + "name": "[Markdown] Markup Math Function Definition Marker", + "scope": "text.html.markdown punctuation.definition.function.math.tex", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Markdown] Markup Math Operator", + "scope": "text.html.markdown punctuation.math.operator.latex", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Markdown] Punctuation Definition Heading", + "scope": "text.html.markdown punctuation.definition.heading", + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Markdown] Punctuation Definition Constant/String", + "scope": [ + "text.html.markdown punctuation.definition.constant", + "text.html.markdown punctuation.definition.string" + ], + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Markdown] String Other Link Description/Title", + "scope": [ + "text.html.markdown constant.other.reference.link", + "text.html.markdown string.other.link.description", + "text.html.markdown string.other.link.title" + ], + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Perl] Perl Sigils", + "scope": "source.perl punctuation.definition.variable", + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[PHP] Meta Function-Call Object", + "scope": ["source.php meta.function-call", "source.php meta.function-call.object"], + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Python] Decorator", + "scope": [ + "source.python entity.name.function.decorator", + "source.python meta.function.decorator support.type" + ], + "settings": { + "foreground": "#D08770" + } + }, + { + "name": "[Python] Function Call", + "scope": "source.python meta.function-call.generic", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Python] Support Type", + "scope": "source.python support.type", + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[Python] Function Parameter", + "scope": ["source.python variable.parameter.function.language"], + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[Python] Function Parameter Special", + "scope": [ + "source.python meta.function.parameters variable.parameter.function.language.special.self" + ], + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[Rust] Entity types", + "scope": "source.rust entity.name.type", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[Rust] Macro", + "scope": "source.rust meta.macro entity.name.function", + "settings": { + "fontStyle": "bold", + "foreground": "#88C0D0" + } + }, + { + "name": "[Rust] Attributes", + "scope": [ + "source.rust meta.attribute", + "source.rust meta.attribute punctuation", + "source.rust meta.attribute keyword.operator" + ], + "settings": { + "foreground": "#5E81AC" + } + }, + { + "name": "[Rust] Traits", + "scope": "source.rust entity.name.type.trait", + "settings": { + "fontStyle": "bold" + } + }, + { + "name": "[Rust] Interpolation Bracket Curly", + "scope": "source.rust punctuation.definition.interpolation", + "settings": { + "foreground": "#EBCB8B" + } + }, + { + "name": "[SCSS] Punctuation Definition Interpolation Bracket Curly", + "scope": [ + "source.css.scss punctuation.definition.interpolation.begin.bracket.curly", + "source.css.scss punctuation.definition.interpolation.end.bracket.curly" + ], + "settings": { + "foreground": "#81A1C1" + } + }, + { + "name": "[SCSS] Variable Interpolation", + "scope": "source.css.scss variable.interpolation", + "settings": { + "foreground": "#D8DEE9", + "fontStyle": "italic" + } + }, + { + "name": "[TypeScript] Decorators", + "scope": [ + "source.ts punctuation.decorator", + "source.ts meta.decorator variable.other.readwrite", + "source.ts meta.decorator entity.name.function", + "source.tsx punctuation.decorator", + "source.tsx meta.decorator variable.other.readwrite", + "source.tsx meta.decorator entity.name.function" + ], + "settings": { + "foreground": "#D08770" + } + }, + { + "name": "[TypeScript] Object-literal keys", + "scope": ["source.ts meta.object-literal.key", "source.tsx meta.object-literal.key"], + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[TypeScript] Object-literal functions", + "scope": [ + "source.ts meta.object-literal.key entity.name.function", + "source.tsx meta.object-literal.key entity.name.function" + ], + "settings": { + "foreground": "#88C0D0" + } + }, + { + "name": "[TypeScript] Type/Class", + "scope": [ + "source.ts support.class", + "source.ts support.type", + "source.ts entity.name.type", + "source.ts entity.name.class", + "source.tsx support.class", + "source.tsx support.type", + "source.tsx entity.name.type", + "source.tsx entity.name.class" + ], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[TypeScript] Static Class Support", + "scope": [ + "source.ts support.constant.math", + "source.ts support.constant.dom", + "source.ts support.constant.json", + "source.tsx support.constant.math", + "source.tsx support.constant.dom", + "source.tsx support.constant.json" + ], + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[TypeScript] Variables", + "scope": ["source.ts support.variable", "source.tsx support.variable"], + "settings": { + "foreground": "#D8DEE9" + } + }, + { + "name": "[TypeScript] Parentheses in Template Strings", + "scope": [ + "source.ts meta.embedded.line meta.brace.square", + "source.ts meta.embedded.line meta.brace.round", + "source.tsx meta.embedded.line meta.brace.square", + "source.tsx meta.embedded.line meta.brace.round" + ], + "settings": { + "foreground": "#ECEFF4" + } + }, + { + "name": "[XML] Entity Name Tag Namespace", + "scope": "text.xml entity.name.tag.namespace", + "settings": { + "foreground": "#8FBCBB" + } + }, + { + "name": "[XML] Keyword Other Doctype", + "scope": "text.xml keyword.other.doctype", + "settings": { + "foreground": "#5E81AC" + } + }, + { + "name": "[XML] Meta Tag Preprocessor", + "scope": "text.xml meta.tag.preprocessor entity.name.tag", + "settings": { + "foreground": "#5E81AC" + } + }, + { + "name": "[XML] Entity Name Tag Namespace", + "scope": [ + "text.xml string.unquoted.cdata", + "text.xml string.unquoted.cdata punctuation.definition.string" + ], + "settings": { + "foreground": "#D08770", + "fontStyle": "italic" + } + }, + { + "name": "[YAML] Entity Name Tag", + "scope": "source.yaml entity.name.tag", + "settings": { + "foreground": "#8FBCBB" + } + } + ] +} diff --git a/src/components/AmazonBook.tsx b/src/components/AmazonBook.tsx index 8bad828..ca78024 100644 --- a/src/components/AmazonBook.tsx +++ b/src/components/AmazonBook.tsx @@ -18,7 +18,7 @@ export const AmazonBook: FunctionalComponent = ({ const affiliateUrl = `http://www.amazon.de/gp/product/${asin}?ie=UTF8&tag=stefanimhoffde-21&linkCode=as2&camp=1638&creative=6742&creativeASIN=${asin}`; return ( - + ); diff --git a/src/components/JournalList.astro b/src/components/JournalList.astro index 86f2b8b..4b4478d 100644 --- a/src/components/JournalList.astro +++ b/src/components/JournalList.astro @@ -51,7 +51,7 @@ const { entries } = Astro.props; )}
- + {data.title}
diff --git a/src/content/journal/2017/gitbook.mdx b/src/content/journal/2017/gitbook.mdx index bda2e8c..f446ca8 100644 --- a/src/content/journal/2017/gitbook.mdx +++ b/src/content/journal/2017/gitbook.mdx @@ -77,4 +77,4 @@ And I needed to design a cover in two sizes for the book. - Download **PDF**, **EPUB**, **Mobi** versions on [GitBook](https://github.com/kogakure/book-kogakure/releases) - Read the [online version](https://www.kogakure.de/) of the book - [Source code](https://github.com/kogakure/website-11ty-kogakure.de) of the book -- Found an error, typo, or mistake? Report it [here](https://github.com/kogakure/website-11ty-kogakure.de/issues). +- Found an error, typo, or mistake? [Report the issue](https://github.com/kogakure/website-11ty-kogakure.de/issues). diff --git a/src/content/journal/2020/apps-tools-services.mdx b/src/content/journal/2020/apps-tools-services.mdx index cd033fe..d41f092 100644 --- a/src/content/journal/2020/apps-tools-services.mdx +++ b/src/content/journal/2020/apps-tools-services.mdx @@ -10,9 +10,9 @@ tags: ["productivity", "technology"] This is a list of all the tools, apps, and services I use on my iPhone, iPad, Apple Watch, Apple TV, and Mac. I’ll update this list from time to time. -### Legend - -πŸ“±iPhone/iPad β€’ πŸ–₯ Desktop β€’ πŸ“Ί AppleTV β€’ 🌐 Web + + πŸ“±iPhone/iPad β€’ πŸ–₯ Desktop β€’ πŸ“Ί AppleTV β€’ 🌐 Web + --- @@ -96,426 +96,4 @@ You can create powerful workflows to handover of data between two of these servi I use around 20 services on that long list. -### Apple Workflow πŸ“± - -[Workflow](https://www.workflow.is/) is another automation tool, this time for iOS. Apple bought the company and integrated the tool into its ecosystem. There are much fewer services in Apple Workflow than in IFTTT, but it allows much more complicated workflows. You can automate many apps on your device depending on time, location, arrival, leaving, WLAN, Bluetooth, NFC, or opening an app. And build complex interfaces taking user input and doing something with it. But you don’t need to learn to program, it’s drag and drop. - -## Design, Photography & Conception - -### iA Writer πŸ“± πŸ–₯ - -My main tool for writing is [iA Writer](https://ia.net/writer). I use it on Mac, iPhone, and iPad. It’s the most minimalistic, distraction-free, beautiful writing experience. It supports Markdown, and has tools to analyze your words, and count reading time, characters, words, and sentences. I write my text in Markdown and either open it from DEVONthink in iA Writer or save my texts in iCloud and index the contents of these folders in DEVONthink. - -### Affinity Designer πŸ“± πŸ–₯ - -The British company **Serif** creates the best design tools I know. I worked with and owned Adobe Photoshop and Adobe Illustrator for over 15 years, and use Sketch at work. But [Affinity Designer](https://affinity.serif.com/designer/) is my tool of choice for everything I design: Websites, UI, flyers, and logos. - -I switched away from Adobe when they started forcing people to their cloud solutions and making it impossible to buy a new version every few years, but instead have to pay monthly β€œrent”. Serif won multiple awards for Affinity Designer. - -I use the iPad version and soon plan to buy a big iPad Pro with the Apple Pencil to create even cooler things with Affinity Designer. - -### Affinity Photo πŸ“± πŸ–₯ - -[Affinity Photo](https://affinity.serif.com/de/photo/) is the second tool from **Serif**. I use it less, but when I want to work on photos or photo manipulations, I use Affinity Photo. Serif won multiple awards for Affinity Photo. - -It has support for RAW, PSD, 360Β° photo editing, HDR, batch automation, smart objects, and montage. I’m not a professional photographer, but it’s made for them. - -### Affinity Publisher πŸ–₯ - -[Affinity Publisher](https://affinity.serif.com/publisher/) is the newest tool by **Serif**. It’s an incredibly powerful DTP tool to replace Adobe InDesign or Quark Express. I started working with it, but I plan to create and lay out a book with it. It seamlessly integrates with Affinity Designer and Affinity Photo and allows doing nearly everything you can think of. - -### MindNode πŸ“± πŸ–₯ - -[MindNode](https://mindnode.com/) is my favorite tool to create mind notes and map out ideas. I use it on all my devices. When I learned everything about Japanese Design, I used it to [map out my research](https://my.mindnode.com/FGhdh66uMbi1aJ9RfriKUL3JoMCHd18aS8z9Uayw). - -### Typeface πŸ–₯ - -[Typeface](https://typefaceapp.com/) is my favorite font app. It’s simple and beautiful, the price is fair, and it does all I need. - -### Blender πŸ–₯ - -I don’t use [Blender](https://www.blender.org/) a lot, but it is an incredibly complex open-source 3D creation software. I used to work a lot with 3D in my first job (3ds max, Maya, and Cinema 4D) but when I moved to the web I stopped working with 3D software regularly. I love it, and I’m currently doing online training to learn Blender properly. - -### BΔ“hance πŸ“± 🌐 - -[BΔ“hance](https://www.behance.net/) is the second platform I regularly browse for inspiration. The portfolios of artists and designers are of high quality, and it’s possible to remember interesting pieces on boards. You can follow your favorite artists. - -### Instagram πŸ“± 🌐 - -I don’t like [Instagram](https://www.behance.net/) too much because the browsing experience is crappy, and you can use it on the phone. No iPad app and the web app is limited. But it’s a nice app to publish photos from time to time and follow friends and family. I use it now exclusively on the web. - -## Development - -### Neovim πŸ–₯ - -I use [Neovim](https://neovim.io/) as my primary code editor. It’s the best editor available. You can see my configuration files, the mappings, settings, functions, and the plugins I use in my [dotfiles](https://github.com/kogakure/dotfiles/tree/master/nvim) repository. - -### Visual Studio Code πŸ–₯ - -I use [Visual Studio Code](https://code.visualstudio.com/) from time to time. I use countless extensions, which would be too much to list them all. - -### Kitty πŸ–₯ - -I used iTerm2 for a long time as my terminal, but recently, I switched to [Kitty](https://github.com/kovidgoyal/kitty). It is much faster, which is important because I use NeoVim in the terminal as my primary code editor. - -I use additionally [tmux](https://github.com/tmux/tmux/) and [tmuxinator](https://github.com/tmuxinator/tmuxinator) to manage and restore multiple terminal sessions. I can switch between projects or keep multiple servers running. - -### GitHub πŸ“± πŸ–₯ 🌐 - -[GitHub](https://github.com/) (or [GitHub Enterprise](https://github.com/enterprise) at my workplace) is my tool for storing and working with source code. All my websites are on GitHub and a few dozen other projects. I use [GitHub for mobile](https://github.com/mobile/) and occasionally [GitHub Desktop](https://desktop.github.com/). I use Git on the command line. - -### Netlify 🌐 - -[Netlify](https://www.netlify.com/) is my favorite hosting service. All my websites are hosted for free. If I push a new feature to GitHub, Netlify will [automatically deploy](https://app.netlify.com/sites/stefanimhoff-de/deploys) my website on a preview URL. After all the tests have been running successfully, and I merge the feature, the new feature goes live without needing to do anything more. - -### Dash πŸ“± πŸ–₯ - -[Dash](https://kapeli.com/dash) is an API documentation browser. You can browse over 200 API documentation without searching on the internet. Dash downloads the latest documentation offline to your computer and makes it possible to look things up even when you have no connection to the internet. And I use an integration in Alfred. - -### Kaleidoscope πŸ–₯ - -I used [Kaleidoscope](https://www.kaleidoscopeapp.com/) as my default tool for merge conflicts in Git, but Visual Studio Code has a much nicer way of fixing merge conflicts, I use Kaleidoscope to compare complete codebases or the differences in images. - -### Image Shrinker πŸ–₯ - -[Image Shrinker](https://image-shrinker.com/) is a nice, free tool to minify images and graphics with one drop. Easy, fast, and useful. - -### Integrity πŸ–₯ - -I use [Integrity](https://apps.apple.com/app/integrity/id513610341) regularly to check all my websites for broken links. It’s not something I do every month, but when I do it, this tool is helpful. - -## News & Information - -### Feedbin πŸ“± 🌐 - -[Feedbin](https://feedbin.com/) is my main source of information. I follow all my RSS/Atom feeds, my YouTube subscriptions, Twitter tweets, Newsletters, Reddit, and news sources. A cool feature of Feedbin is to track changes in articles. - -I save everything of interest into Raindrop.io for later research. I used Feedly for many years since the Google News Reader shut, but recently the pricing and features did not match and Feedbin is much more fun to use. - -### Reeder πŸ“± πŸ–₯ - -I use Feedbin together with [Reeder 5](https://reederapp.com/). Reeder is a beautiful newsreader which allows using read later services (Pocket, Instapaper) and many services (Feedbin, Feedly) and directly reading RSS/Atom feeds without service and synchronizing them between all devices via iCloud. - -### Raindrop.io (Pro) πŸ“± πŸ–₯ 🌐 - -[Raindrop.io](https://raindrop.io/) is my bookmark manager. It is a lot of fun, I save nearly everything in it. The tool allows for organizing bookmarks in collections (\$), tagging, and filtering (by type of bookmark). - -A deduplicating service finds broken links (\$). The new highlighting feature allows using of 4 different colors and adds comments to any text. A browser extension allows highlighting the text directly on the website. Each collection can use a different view (Grid, Headlines, Masonry, or List). Full-text search will search every web page and PDF (\$). Raindrop automatically creates a backup of every website for offline reading (\$). - -Raindrop.io can be used to create mood boards, and it is possible to upload common media files. Collections can be edited together with other users, and it is possible to share individual collections publicly ([here are mine](https://raindrop.io/kogakure)). - -### Readwise πŸ“± 🌐 - -[Readwise](https://readwise.io/) is my favorite tool to have all my highlights of different services in one place, no matter if it is my Kindle, Apple Books, Pocket, Feedly, Instapaper, Medium, or Twitter. Each morning, you get five random highlights to review, which is a fantastic way to be reminded of the ideas you highlighted. - -I synchronize my highlights with Obsidian, where I store them permanently as Markdown documents. - -### Pinboard 🌐 - -I use [Pinboard](https://pinboard.in/) as a backup for all the links I save. They get automatically transferred from Raindrop.io to Pinboard with IFTTT. I joined Pinboard when the price was a one-time payment of 9 USD. - -### Wikipedia πŸ“± 🌐 - -I use the [Wikipedia](https://www.wikipedia.org/) website and [iOS app](https://apps.apple.com/app/apple-store/id324715238) all the time. The app allows saving interesting articles into collections and synchronizing them across mobile devices. - -### Tweetbot πŸ“± πŸ–₯ - -I read Twitter feeds in Feedbin, but occasionally, I use [Tweetbot for iOS](https://tapbots.com/tweetbot/) and [Tweetbot for Mac](https://www.tapbots.com/tweetbot/mac/) as a Twitter client. The Twitter feed is otherwise messy, unordered, and full of advertising. I don’t like Twitter in particular, but unfortunately, a lot of industry news is published there. I mute everybody annoying instantly in Tweetbot, sometimes for a week, a month, or forever. - -### Minds πŸ“± 🌐 - -After Twitter started censoring and de-platforming people, I started using [Minds](https://www.minds.com/) again. I used it in 2018 but stopped using it. But now it got many nice new features, it can replace Facebook and Twitter. It’s for free speech, and the people on Minds dislike it if somebody reports what somebody else posted because they think it’s offensive. Criminal things (doxing, calls to violence) will be removed. If you don’t like somebody, block them. I post recommendations on [my profile](https://www.minds.com/kogakure/). - -### Mastodon πŸ“± 🌐 - -I wish more people would use [Mastodon](https://joinmastodon.org/) because it’s much nicer, friendlier, and _decentralized_. Nobody owns it, nobody can control it or cash it, and nobody can silence people. Hundreds of instances are talking to each other. - -Currently, I’m using [Tootle for Mastodon](https://apps.apple.com/us/app/tootle-for-mastodon/id1236013466) on iOS and mirror my Twitter tweets via a [bridge](https://crossposter.masto.donte.com.br/). If you want to follow me: [@kogakure@mastodon.social](https://mastodon.social/@kogakure). - -## Communication - -### Slack πŸ“± πŸ–₯ - -I use [Slack](https://slack.com/) at work. I have another account and use it to push deploy messages, Git commits, Twitter feeds, or RSS updates to my websites in my channels. But I like the tool, and I’m the administrator of a workspace with over 800 people. - -### Apple Messages πŸ“± πŸ–₯ - -[Messages](https://support.apple.com/explore/messages) is the messenger I use with my family. We all have Apple devices, and even my grandmother can use the app. The app has nice features. I wish the Desktop app would get more love from Apple. - -### Apple FaceTime πŸ“± πŸ–₯ - -[FaceTime](https://apps.apple.com/app/facetime/id1110145091) is the video chat messenger I use with my family. - -### ProtonMail (Plus) πŸ“± 🌐 - -[ProtonMail](https://protonmail.com/) is my main email provider, end-to-end encrypted emails. I stopped using Gmail as my main email provider 3 years ago. I sometimes use the [web app](https://mail.protonmail.com/) or the [new beta version](https://beta.protonmail.com/) of the web app, which looks nice. - -### Apple Mail πŸ–₯ - -I use Apple Mail on Desktop to connect to my work email on an Exchange server and my ProtonMail server via the [ProtonMail Bridge](https://proton.me/mail/bridge). - -### Signal πŸ“± πŸ–₯ - -[Signal](https://www.signal.org/) is a messenger I use with co-workers and friends. It is the messenger with the most security and privacy. Additionally, it’s open source, and no malicious code can be sneaked into it by the government or private entity. After deleting WhatsApp, it’s my favorite messenger to communicate across different platforms. - -### Telegram πŸ“± πŸ–₯ - -[Telegram](https://telegram.org/) is a messenger I use with co-workers and friends. A nice thing is your profile can have a link you share with unknown people to contact you. It is the messenger with the nicest features. You can edit a send text and fix errors, create public or private chat rooms and encrypt your communication (unfortunately not the default setting, people don’t do it). - -You can use encrypted Git repositories and link and validate your [profile](https://keybase.io/kogakure) with several external services. You can send messages that auto-delete and even send messages to users not yet on Keybase. - -### Element πŸ“± πŸ–₯ 🌐 - -[Element](https://element.io/) is the official messenger of [Matrix](https://matrix.org/). It’s an open network for secure, decentralized communication. - -It has grown over the last few years and I hope it will win the messenger war one day. With corporations trying to control the ecosystem or governments to weaken encryption, free internet and free communication must move to a decentralized messenger. The messenger is as powerful and feature-rich as Slack, but free. - -Plenty of big companies (as a recent example, Mozilla) move their communication to a self-hosted instance of Matrix. The French government, the German military, and a lot of Germany’s universities use it. Every instance can communicate with all other instances. - -Matrix even allows bridges, to communicate with a user of Slack, Apple Messenger, Facebook Messenger, Telegram, or similar. The bridges are early development, but the future for Matrix looks good. - -You can contact me at [@kogakure:matrix.org](https://matrix.to/#/@kogakure:matrix.org). - -### Status πŸ“± πŸ–₯ - -[Status](https://status.im/) is a new decentralized instant messaging app. It’s a crypto wallet and a Web3 browser. No phone, email, or username is needed to use it. You can choose a random unique ID at the first start. I think it’s a pretty messenger, and it’s easy to share your own (complete anonymous) [profile](https://join.status.im/u/0x046ef708e10d74f71a3294f6bb4b96f0731c6a39bd9abd0993ddfd0015500d3c0dda98b351b2685b9f0e0e57d71cba8149d494f801956a051e77d15d963dc74b81). - -### Session πŸ“± πŸ–₯ - -[Session](https://getsession.org/) is a new decentralized messenger with an interesting security model. It collects no metadata. Not even your phone number or email. You are anonymous. The first time you use it, you get a session key. You can save a backup for this session to restore it on another device. To contact another person, all you need is to have the public session key. The chat is routed through an onion routing network, which makes it nearly impossible to leave any footprint. It’s open source and censorship-resistant. - -### Brave Talk 🌐 - -[Brave Talk](https://talk.brave.com/) is a way to have unlimited video calls with up to 4 people for free. No download of any app is needed. - -### Jitsi Meet πŸ“± 🌐 - -Another nice open-source tool for video chat is [Jitsi](https://meet.jit.si/). It supports many users (currently 75) at the same time. Creating a room is as easy as clicking a button. No extra software is needed, it runs in the browser. There are mobile versions available. It’s the default video conferencing system of [Riot](https://jitsi.riot.im/) (Elements). - -## Browser - -### Brave Browser πŸ“± πŸ–₯ - -My primary browser is [Brave](https://brave.com/). It has the same engine as Chrome, but ad-blocking and tracker-blocking are included by default. It blocks fingerprinting, a way to track you across the internet. Brave is eager to implement new features, for example, crypto wallets or the [IPFS](https://ipfs.io/) peer-to-peer protocol. Plus: It supports all Chrome extensions. - -### Firefox (Developer Edition) πŸ“± πŸ–₯ - -My secondary browser is [Firefox Developer Edition](https://www.mozilla.org/firefox/developer/). I love the features of Firefox. The developer experience is fantastic, and I like in particular the bookmarking system (this sucks with other browsers). Firefox supports tags and has a nice bookmark bar to quickly filter and search bookmarks. - -Mozilla has privacy as a much higher priority than Google. Google works actively on ways to prevent ad-blocking, while Mozilla blocks trackers by default and allows and provides all kinds of additional privacy tools (like container tabs). - -## Media - -### Apple Music πŸ“± πŸ–₯ - -I use [Apple Music](https://www.apple.com/apple-music/) as my music streaming service. I stream music to my five Sonos boxes around my home and use it to wake me up, do workouts or relax on the sofa. I used Spotify before, but they started deplatforming podcasts, which they don’t agree with, and I don’t support this behavior. - -### Overcast πŸ“± πŸ–₯ - -To listen to podcasts, I use [Overcast](https://overcast.fm/). I like how many features it has. - -### Sonos πŸ“± πŸ–₯ - -[Sonos](https://www.sonos.com/) is my favorite sound system since 2012. I have two [Play:5](https://www.sonos.com/shop/play5-white.html), one Play:3, one [Play:1](https://www.sonos.com/shop/one.html) and the [Playbar](https://www.sonos.com/shop/playbar.html). It’s super cool to sync all boxes around the home and have no lag between the music in different rooms. - -### YouTube πŸ“± 🌐 - -I use the [YouTube](https://www.youtube.com/) app and website a lot to watch videos from channels I follow. I use the extensions [DF YouTube](https://addons.mozilla.org/en-US/firefox/addon/df-youtube/) and [Enhancer for YouTube](https://addons.mozilla.org/en-US/firefox/addon/enhancer-for-youtube/) to make the viewing experience more enjoyable. I hide all sidebars, comments, suggestions, and other needy crap. All videos stop by default and are automatically switched to full-screen mode. - -### Odysee/LBRY πŸ“± πŸ–₯ 🌐 - -[Odysee](https://odysee.com/) is a completely decentralized video platform that doesn’t censor anything except illegal things. It uses the [LBRY](https://lbry.com/) network for open, free, and fair digital content. LBRY itself doesn’t censor anything, it cannot do so because the content is shared peer-to-peer and the metadata lives on the blockchain. - -### IMDb πŸ“± 🌐 - -[IMDb](https://www.imdb.com/) is one of the more used apps on my devices. I look up actors, directors, movies, and TV shows all the time. I log all my watched TV shows and movies to keep track of what I have watched. - -### TMDb 🌐 - -[TMDb](https://www.themoviedb.org/) is a nice collaborative movie database and I started using it to link to movies on my website because I like to support open projects. - -### WerStreamtEs πŸ“± 🌐 - -[WerStreamt.es](https://www.werstreamt.es/) (German for WhoStreams.it) is my favorite platform to keep track of movies and TV shows. You can put movies and TV shows on a watch list and add the streaming services you have. The app will send out emails with reminders if something on your watch list has a new season or is available for streaming. - -### Netflix πŸ“± πŸ“Ί - -I use [Netflix](https://www.netflix.com/) on my Apple TV and sometimes on my iPad. I stopped watching TV seven years ago and watch movies and TV shows on Netflix. Here is a [list of things I watched on Netflix](https://www.imdb.com/list/ls027045180/). - -### Prime Video πŸ“± πŸ“Ί - -The second streaming service I use is [Amazon Prime Video](https://www.primevideo.com/). It has much fewer good movies and TV shows, but it’s much, much cheaper. Here is a [list of things I watched on Amazon Prime Video](https://www.imdb.com/list/ls027045359/). - -### Apple Photos πŸ“± πŸ–₯ - -[Apple Photos](https://www.apple.com/ios/photos/) is the default app Apple comes with. It’s good enough for me and easy enough to use by all generations of the whole family. This is where we share photos in the family. - -### QuickTime Player πŸ–₯ - -[QuickTime](https://support.apple.com/downloads/quicktime) is a nice player, and it’s the default on a Mac. Not much more to say. I quickly record screencasts with it. It’s quicker and easier than recording with apps like _ScreenFlow_. - -### VLC πŸ“± πŸ–₯ - -[VLC](https://www.videolan.org/vlc/) is a good and free player. It can play **anything**. Even corrupt or partial videos. I use it to stream my videos from my [Synology NAS](https://www.synology.com/). - -### Shazam πŸ“± - -I use [Shazam](https://www.shazam.com/) for one case: To recognize songs and find them on Spotify. - -## Security & Privacy - -### Bitwarden πŸ“± πŸ–₯ - -[Bitwarden](https://bitwarden.com/) is my Password Manager. I switched recently from 1Password because for a Password Manager security and trust are more important than design. The source code of Bitwarden is open, with no possibility for backdoors. Bitwarden is free with basic features, and adding the premium features is much cheaper than with other Password Managers. - -### ExpressVPN πŸ“± πŸ–₯ - -[ExpressVPN](https://www.expressrefer.com/refer-friend?locale=de&referrer_id=65477408&utm_campaign=referrals&utm_medium=copy_link&utm_source=referral_dashboard) is my current VPN provider. I switched to it from NordVPN after my 3-year contract was over. - -### Cryptomator πŸ“± πŸ–₯ - -[Cryptomator](https://cryptomator.org/) is a free tool to encrypt cloud data. I encrypt all private data either in DEVONthink or with Cryptomator storage in Dropbox. - -### AdGuard Pro πŸ“± - -[AdGuard](https://adguard.com/) is a good way of blocking advertising on iOS devices. I use it to block advertising system-wide on my iPhone and iPad. - -## Learning - -### Duolingo (Plus) πŸ“± 🌐 - -I love [Duolingo](https://www.duolingo.com/)! I learn on Duolingo without missing one day for more than 2 years now. It’s an intuitive and fun way of learning. And it’s free! I started switching to **Plus** recently, which removes advertising and adds offline support and streak repair. I learn [Japanese](https://www.duolingo.com/enroll/ja/en/Learn-Japanese) and [Spanish](https://www.duolingo.com/enroll/es/en/Learn-Spanish) every day. They have good [podcasts](https://podcast.duolingo.com/) for Spanish and French, [stories](https://stories.duolingo.com/), progress quizzes, leagues, and much more. - -### Drops πŸ“± - -[Drops](https://languagedrops.com/) is a fun app I started using a few months ago. I use it for learning vocabulary as a companion to Duolingo. You can learn for 5 minutes for free every 8 hours, which is around 10 minutes every day. - -### Shirabe Jisho πŸ“± 🌐 - -Shirabe Jisho is a [powerful Japanese-English dictionary](https://jisho.org/). It shows nearly everything you can wish for, even the visual stroke order of the characters. The [iOS app](https://apps.apple.com/app/shirabe-jisho/id1005203380) is a complete offline dictionary. - -### Japanese πŸ“± - -[Japanese](https://japaneseapp.com/) is another beautiful Japanese dictionary for iOS and Android. You can even use Flashcards and test your knowledge about Kanji. - -### Human Japanese πŸ“± - -[Human Japanese](https://humanjapanese.com/) is a paid app to learn Japanese. The interface is dated, but the content is good. - -### Goodreads πŸ“± 🌐 - -[Goodreads](https://www.goodreads.com/) is the only decent social reading platform. I use it to track the books I want to read and the books I’m reading and update my status once a week. You can save books to shelves, follow friends, and get inspiration about what to read next or do a reading challenge every year. You can [follow me on Goodreads](https://www.goodreads.com/user/show/28460819) or look into the books I’ve read. - -### Literal πŸ“± 🌐 - -[Literal](https://literal.club/) is a new platform to explore new books, join book clubs and share what you read with other people. You can [follow me on Literal](https://literal.club/kogakure). - -### Kindle πŸ“± πŸ–₯ - -I use the [iPad and iPhone Kindle](https://apps.apple.com/app/kindle/id302584613) app and the [macOS Kindle](https://apps.apple.com/app/kindle/id405399194) app as a companion to my Kindle Paperwhite. I use the app either to look at color photos or illustrations or after I’ve finished a book to review my marginalia (notes and markings). - -## Health & Fitness - -### Health πŸ“± - -I like the [Health](https://www.apple.com/ios/health/) app of Apple, the only drawback is that there is not an iPad or Desktop version of it. It gets better with every release and aggregates data from all kinds of other apps and services. I get my Meditation times, movement data, and workouts from my [Apple Watch](https://www.apple.com/watch/), audio data from my [AirPods Pro](https://www.apple.com/airpods-pro/), my weight from my [Withings Body Cardio](https://www.withings.com/body-cardio) scale, and my sleep from my [Fitbit Charge](https://www.fitbit.com/charge4) – though this needs an extra app to get the data over an API, as Fitbit and Apple have a vendetta and Fitbit doesn’t give their data to the health app. - -### Activity πŸ“± - -The [Activity](https://apps.apple.com/app/activity/id1208224953) app is the app delivered with an Apple Watch. It’s nice to track workouts, movement, and changes in your activity over time. It allows competition with family and friends. And the data is transferred to the Health app. - -### Health Mate πŸ“± 🌐 - -The [Health Mate](https://healthmate.withings.com/) app by Withings is a nice way to have an insight into my weight, fat, water, muscle mass, heart frequency, and pulse wave velocity every morning. I use the Withings [Body Cardio](https://www.withings.com/body-cardio) scale, the [Sleep Analyzer](https://www.withings.com/sleep-analyzer), the [BPM Connect](https://www.withings.com/bpm-connect) blood pressure monitor, and [Thermo](https://www.withings.com/thermo). - -### Reps & Sets - -I use the [Reps & Sets](https://repsandsetsapp.com/) app for my [Calisthenics](/calisthenics/) training, multiple times per week. As an early adopter, I get the Premium features for free. - -### Insight Timer πŸ“± - -I use [Insight Timer](https://insighttimer.com/) for my daily meditation. I honestly don’t use much of its features, except the feature to create custom timers. - -## Finance & Calculations - -### iFinance πŸ“± πŸ–₯ - -[iFinance](https://www.syniumsoftware.com/ifinance) is my tool to track income and spending. Every day, I track my expenses and income for ~5 minutes and make sure everything is fine with my accounts. iFinance has nice tools to automate and analyze your expenses to find out how you spend your income. - -I use the iOS or Apple Watch version to track expenses while I’m on the way. The data is synchronized with iCloud or Wi-Fi across devices. - -### Stocks πŸ“± πŸ–₯ - -I use the Apple [Stocks](https://apps.apple.com/app/stocks/id1069512882) app to keep track of my stocks and funds. It’s simple and easy to use and available on iOS and macOS. - -### Calcbot πŸ“± - -[Calcbot](https://www.tapbots.com/calcbot/) is a beautifully designed calculator and unit converter I use for many years. It’s available for the Apple Watch and has nice features such as sending your calculations as an email, syncing across devices with iCloud, and much more. - -## Weather - -### Netatmo πŸ“± 🌐 - -I use the [Netatmo](https://www.netatmo.com/) weather app to monitor the temperature, COβ‚‚, humidity, noise level, and air pressure in all my rooms and on the balcony. I use a rain monitor. The devices are beautifully designed and have a long life duration (I use them since 2013). - -### Weather Pro πŸ“± - -[WeatherPro](http://www.weatherpro.eu/) is the best and most accurate weather app I know. It’s a free app but for €9.99 per year, you can get more detailed data, hourly forecasts, and other nice features. All advertising gets removed from apps by _MeteoGroup_. - -### RainToday πŸ“± - -[RainToday](http://raintoday.weatherpro.de/lang/en.html) is the second app from _MeteoGroup_ on my devices. There are live updates on upcoming rain in your location that show the estimated duration, intensity, and direction of the rain. - -### SolarWatch πŸ“± - -[SolarWatch](https://apps.apple.com/app/solarwatch-tageslicht-wetter/id1191365122) is my favorite app to show the sunrise and sunset. - -## Tools - -### Hue πŸ“± πŸ–₯ - -I use the [Philips Hue](https://apps.apple.com/app/philips-hue/id1055281310) app to control the light in my home. Nearly all my light bulbs are now from Hue, and I automate a lot of my light cycles. I turn on lights automatically when dusk starts and wake me up with lights during wintertime. I dim down my lights every day at the same time and shut them off at the same time. As I always follow the same routine, this works fantastic. I use multiple different switches and Siri to control the light around my home manually. I even use an [Alfred workflow](https://github.com/benknight/hue-alfred-workflow) to control my light directly from the computer. - -### Apple Maps πŸ“± πŸ–₯ - -I switched to [Apple Maps](https://www.apple.com/maps/) because I dislike Google for a while. But occasionally, I switch and use [Google Maps](https://www.google.com/maps) because the information for stores and opening times is much better. - -### DeepL πŸ“± πŸ–₯ 🌐 - -[DeepL](https://www.deepl.com/translator) is my favorite translation app. - -### Dropbox (Plus) πŸ“± πŸ–₯ 🌐 - -[Dropbox](https://www.dropbox.com/) is my cloud provider. My [Synology NAS](https://www.synology.com/) synchronizes automatically everything in Dropbox as a backup. Never trust cloud providers. - -### iCloud πŸ“± πŸ–₯ 🌐 - -[iCloud](https://www.icloud.com/) is my second cloud provider. The new CloudKit sync is fast and seamless with Apple Devices and Apple services work optimally with iCloud. - -### The Unarchiver πŸ–₯ - -[The Unarchiver](https://theunarchiver.com/) is the best, free, and only app you need to unpack nearly every format available. - -### DaisyDisk πŸ–₯ - -I use [DaisyDisk](https://daisydiskapp.com/) to find and delete unneeded files from my computer. It’s the best visual representation of your hard drive I know. Files can be collected and deleted with one click. - -### AppCleaner πŸ–₯ - -[AppClearner](https://freemacsoft.net/appcleaner/) is a nice and free application that allows uninstalling unwanted apps and deleting all traces and left-over settings at the same time. - -### Find My πŸ“± πŸ–₯ - -I use the [Find My](https://www.apple.com/icloud/find-my/) app to find my devices … and my family. And to get random calls from my grandmother about why I’m at home and not at work. πŸ˜† - -### Komoot πŸ“± 🌐 - -If you’re into Biking or Hiking, [Komoot](https://www.komoot.de/) is the best app I know. It’s free but possible to buy better hiking maps for regions or the whole world. It allows for creating tours and sending them to the iPhone or even Apple Watch app and navigating with it. The route gets even broken down into kinds of streets, height profile, and difficulty. And you can record your tours and share them. - -### Citymapper πŸ“± 🌐 - -[Citymapper](https://citymapper.com/) is a fantastic routing app available for selected big cities around the globe. My home city Hamburg is included. It knows all available transport options and times and calculates the best tour to your target. It even shows you when to get on and off transport and on which side of a subway you have entered. - -### DHL Paket πŸ“± - -The [DHL Paket](https://www.dhl.de/de/privatkunden/kampagnenseiten/dhl-app.html) app is the best way to see all packages on the way to your home or somebody from your home. +### Apple Workflo diff --git a/src/pages/[...slug].astro b/src/pages/[...slug].astro index 1276aca..729b01c 100644 --- a/src/pages/[...slug].astro +++ b/src/pages/[...slug].astro @@ -243,7 +243,7 @@ const schema = JSON.stringify({ } [data-footnote-ref] { - @apply p-[0.1em] font-light !text-accent no-underline; + @apply relative rounded-full bg-accent p-[0.25em] font-light not-italic !text-white no-underline mis-[0.1em]; } } diff --git a/src/pages/ai-art.astro b/src/pages/ai-art.astro index 13f8aec..5da85cb 100644 --- a/src/pages/ai-art.astro +++ b/src/pages/ai-art.astro @@ -63,12 +63,13 @@ const description = 'This is a collection of AI art pieces I’ve created with S > diff --git a/src/pages/sketchnotes.astro b/src/pages/sketchnotes.astro index cb1048b..f878f58 100644 --- a/src/pages/sketchnotes.astro +++ b/src/pages/sketchnotes.astro @@ -59,12 +59,13 @@ const description = 'This is a collection of Sketchnotes I’ve drawn.'; > diff --git a/src/styles/global.css b/src/styles/global.css index 744794e..e46f174 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -36,6 +36,10 @@ @apply whitespace-pre; } + .astro-code { + @apply border-1 border-solid dark:border-white/20; + } + p code, li code, samp { diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 647f68f..1d32511 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -35,7 +35,7 @@ module.exports = { 950: '#0e0d0c', }, code: { - 1: '#282c34', + 1: '#1e2229', 2: '#abb2bf', }, },