Initial commit

This commit is contained in:
Marco van Zijl 2026-05-07 16:23:09 +02:00
commit 9408e71db4
81 changed files with 57097 additions and 0 deletions

3
.obsidian/app.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"attachmentFolderPath": "12 - Bijlagen"
}

1
.obsidian/appearance.json vendored Normal file
View File

@ -0,0 +1 @@
{}

12
.obsidian/community-plugins.json vendored Normal file
View File

@ -0,0 +1,12 @@
[
"dataview",
"obsidian-tasks-plugin",
"omnisearch",
"calendar",
"buttons",
"obsidian-kanban",
"quickadd",
"templater-obsidian",
"tasknotes",
"obsidian-git"
]

33
.obsidian/core-plugins.json vendored Normal file
View File

@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": false,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": true,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}

3
.obsidian/daily-notes.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"folder": "02 - Dagboek"
}

22
.obsidian/graph.json vendored Normal file
View File

@ -0,0 +1,22 @@
{
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1,
"close": true
}

28
.obsidian/hotkeys.json vendored Normal file
View File

@ -0,0 +1,28 @@
{
"editor:toggle-checklist-status": [],
"obsidian-tasks-plugin:toggle-done": [
{
"modifiers": [
"Mod"
],
"key": "Enter"
}
],
"editor:open-link-in-new-leaf": [],
"obsidian-tasks-plugin:edit-task": [
{
"modifiers": [
"Mod"
],
"key": "L"
}
],
"omnisearch:show-modal": [
{
"modifiers": [
"Mod"
],
"key": " "
}
]
}

5186
.obsidian/plugins/buttons/main.js vendored Normal file

File diff suppressed because it is too large Load Diff

10
.obsidian/plugins/buttons/manifest.json vendored Normal file
View File

@ -0,0 +1,10 @@
{
"id": "buttons",
"name": "Buttons",
"description": "Create Buttons in your Obsidian notes to run commands, open links, and insert templates",
"version": "0.9.13",
"author": "shabegom",
"authorUrl": "https://shbgm.ca",
"isDesktopOnly": false,
"minAppVersion": "0.12.8"
}

624
.obsidian/plugins/buttons/styles.css vendored Normal file
View File

@ -0,0 +1,624 @@
/* @settings
name: Buttons
id: buttons-styles
settings:
-
id: button-background
title: Background
type: variable-themed-color
format: hex
opacity: false
default-light: '#f5f6f8'
default-dark: '#1b1b1b'
-
id: button-text
title: Text
type: variable-themed-color
format: hex
opacity: false
default-light: '#1b1b1b'
default-dark: '#f5f6f8'
-
id: button-border
title: Border
type: variable-themed-color
format: hex
opacity: false
default-light: '#7a9486'
default-dark: '#84a83a'
-
id: button-box-shadow
title: Box Shadow
type: variable-themed-color
format: rgb
opacity: true
default-light: '#1b1b1b'
default-dark: '#f5f6f8'
-
id: button-border-radius
title: Border Radius
type: variable-number
format: px
default: 5
-
id: button-size
title: Font Size
type: variable-number
format: em
default: 1
*/
.block-language-button {
padding: 5px;
}
button.button-default {
background: var(--interactive-normal, #f5f6f8);
border-radius: 5px;
border: 1px solid var(--interactive-accent, #ccc);
color: var(--text-accent, #333);
padding: 8px 8px;
text-decoration: none;
font-size: var(--button-size, 1em);
margin: 0;
box-shadow: none;
transform: none;
height: auto;
}
button.button-default:hover {
background: var(--interactive-hover, #e8e9ea);
border: 1px solid var(--interactive-accent-hover, #999);
color: var(--text-accent-hover, #222);
box-shadow: none;
transform: none;
}
.theme-dark button.button-default {
background: var(--interactive-normal);
border: 1px solid var(--interactive-accent);
color: var(--text-accent);
}
.theme-dark button.button-default:hover {
background: var(--interactive-hover, #222);
border: 1px solid var(--interactive-accent-hover, #84a83a);
color: var(--text-accent-hover, #f5f6f8);
box-shadow: none;
transform: none;
}
button.button-inline {
width: unset;
height: unset;
padding: 8px 8px;
}
button.button-default.blue {
background: #76b3fa !important;
color: black !important;
border-color: #76b3fa !important;
}
button.button-default.red {
background-color: red !important;
color: black !important;
border-color: red !important;
}
button.button-default.green {
background: green !important;
color: black !important;
border-color: green !important;
}
button.button-default.yellow {
background: yellow !important;
color: black !important;
border-color: yellow !important;
}
button.button-default.purple {
background: #725585 !important;
color: white !important;
border-color: #725585 !important;
}
button.button-default.orange{
background: #ff944c !important;
color: black !important;
border-color: #ff944c !important;
}
button.button-default.blue:hover {
background: #8bc4ff !important;
color: black !important;
border-color: #8bc4ff !important;
}
button.button-default.red:hover {
background: #ff4444 !important;
color: black !important;
border-color: #ff4444 !important;
}
button.button-default.green:hover {
background: #44ff44 !important;
color: black !important;
border-color: #44ff44 !important;
}
button.button-default.yellow:hover {
background: #ffff44 !important;
color: black !important;
border-color: #ffff44 !important;
}
button.button-default.purple:hover {
background: #8a6ba8 !important;
color: white !important;
border-color: #8a6ba8 !important;
}
button.button-default.orange:hover {
background: #ffb366 !important;
color: black !important;
border-color: #ffb366 !important;
}
/* Modern Button Maker Styles */
.button-maker {
max-width: 45rem;
width: 100%;
max-height: 80vh;
overflow-y: auto;
overflow-x: hidden;
padding: 0;
background: transparent;
border-radius: 0;
box-shadow: none;
box-sizing: border-box;
}
.button-maker-title {
font-size: 1.5rem;
font-weight: 600;
color: var(--text-normal);
margin-bottom: 1rem;
padding: 1.5rem 1.5rem 0 1.5rem;
box-sizing: border-box;
}
.button-maker-container {
padding: 0 1.5rem 1.5rem 1.5rem;
box-sizing: border-box;
width: 100%;
max-width: 100%;
}
.button-maker-form {
display: flex;
flex-direction: column;
gap: 2rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.form-section {
background: var(--background-secondary);
border-radius: 8px;
padding: 1.5rem;
border: 1px solid var(--background-modifier-border);
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.section-title {
font-size: 1.1rem;
font-weight: 600;
color: var(--text-normal);
margin: 0 0 1rem 0;
padding-bottom: 0.5rem;
border-bottom: 2px solid var(--interactive-accent);
width: 100%;
box-sizing: border-box;
}
.form-field {
margin-bottom: 1.5rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.field-label {
display: block;
font-weight: 600;
color: var(--text-normal);
margin-bottom: 0.5rem;
font-size: 0.9rem;
width: 100%;
box-sizing: border-box;
}
.field-description {
color: var(--text-muted);
font-size: 0.8rem;
margin-bottom: 0.75rem;
line-height: 1.4;
width: 100%;
box-sizing: border-box;
}
.button-maker .field-input,
.button-maker .field-textarea {
width: 100%;
max-width: 100%;
padding: 0.75rem;
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
background: var(--background-primary);
color: var(--text-normal);
font-size: 0.9rem;
transition: all 0.2s ease;
box-sizing: border-box;
}
.button-maker .field-input:focus,
.button-maker .field-textarea:focus {
outline: none;
border-color: var(--interactive-accent);
box-shadow: 0 0 0 2px rgba(var(--interactive-accent-rgb), 0.2);
}
.field-textarea {
resize: vertical;
min-height: 80px;
}
.toggle-settings {
display: flex;
flex-direction: column;
gap: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.toggle-field {
display: flex;
align-items: flex-start;
gap: 0.75rem;
padding: 1rem;
background: var(--background-primary);
border-radius: 6px;
border: 1px solid var(--background-modifier-border);
transition: all 0.2s ease;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.toggle-field:hover {
border-color: var(--interactive-accent);
}
.toggle-label {
display: flex;
align-items: center;
gap: 0.75rem;
cursor: pointer;
flex: 1;
min-width: 0;
box-sizing: border-box;
}
.toggle-input {
width: 1.2rem;
height: 1.2rem;
accent-color: var(--interactive-accent);
flex-shrink: 0;
}
.toggle-text {
font-weight: 600;
color: var(--text-normal);
font-size: 0.9rem;
flex-shrink: 0;
}
.toggle-description {
color: var(--text-muted);
font-size: 0.8rem;
margin-top: 0.25rem;
line-height: 1.4;
width: 100%;
box-sizing: border-box;
}
.action-container {
margin-top: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.actions-header {
margin-bottom: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.actions-header h4 {
margin: 0 0 0.5rem 0;
color: var(--text-normal);
font-size: 1rem;
width: 100%;
box-sizing: border-box;
}
.actions-header p {
margin: 0;
color: var(--text-muted);
font-size: 0.8rem;
width: 100%;
box-sizing: border-box;
}
.actions-list {
display: flex;
flex-direction: column;
gap: 1rem;
margin-bottom: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.action-card {
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
padding: 1rem;
transition: all 0.2s ease;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.action-card:hover {
border-color: var(--interactive-accent);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.action-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.action-number {
font-weight: 600;
color: var(--text-normal);
font-size: 0.9rem;
flex-shrink: 0;
}
.btn-remove {
background: var(--background-modifier-error);
color: var(--text-on-accent);
border: none;
border-radius: 4px;
padding: 0.25rem 0.5rem;
font-size: 0.8rem;
cursor: pointer;
transition: all 0.2s ease;
flex-shrink: 0;
}
.btn-remove:hover {
background: var(--background-modifier-error-hover);
}
.action-input-container {
margin-top: 0.75rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.action-input {
width: 100%;
max-width: 100%;
padding: 0.75rem;
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
background: var(--background-primary);
color: var(--text-normal);
font-size: 0.9rem;
box-sizing: border-box;
}
.btn {
padding: 0.75rem 1.5rem;
border: none;
border-radius: 6px;
font-weight: 600;
font-size: 0.9rem;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
}
.btn-primary {
background: var(--interactive-accent);
color: var(--text-on-accent);
}
.btn-primary:hover {
background: var(--interactive-accent-hover);
transform: translateY(-1px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.btn-secondary {
background: transparent;
color: var(--text-normal);
border: 2px solid var(--interactive-accent);
}
.btn-secondary:hover {
background: var(--interactive-accent);
color: var(--text-on-accent);
}
.btn-add-action {
background: var(--interactive-success);
color: var(--text-on-accent);
margin-top: 0.5rem;
}
.btn-add-action:hover {
background: var(--interactive-success-hover);
transform: translateY(-1px);
}
.form-actions {
display: flex;
gap: 1rem;
justify-content: flex-end;
padding-top: 1rem;
border-top: 1px solid var(--background-modifier-border);
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.preview-section {
background: var(--background-secondary);
border-radius: 8px;
padding: 1.5rem;
border: 1px solid var(--background-modifier-border);
margin-top: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.preview-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 60px;
background: var(--background-primary);
border-radius: 6px;
border: 1px solid var(--background-modifier-border);
padding: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.remove-settings,
.replace-settings,
.inherit-settings {
margin-top: 1rem;
padding: 1rem;
background: var(--background-primary);
border-radius: 6px;
border: 1px solid var(--background-modifier-border);
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.custom-color-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
margin-top: 1rem;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
/* Responsive Design */
@media (max-width: 768px) {
.button-maker {
max-width: 95vw;
width: 95vw;
max-height: 90vh;
}
.custom-color-container {
grid-template-columns: 1fr;
}
.form-actions {
flex-direction: column;
}
.btn {
width: 100%;
}
}
/* Dark theme adjustments */
.theme-dark .button-maker {
background: var(--background-primary);
}
.theme-dark .form-section {
background: var(--background-secondary-alt);
}
.theme-dark .action-card {
background: var(--background-primary);
}
.theme-dark .toggle-field {
background: var(--background-primary);
}
.theme-dark .preview-container {
background: var(--background-primary);
}
/* Animation for smooth transitions */
.form-field,
.toggle-field,
.action-card {
animation: fadeIn 0.3s ease-in-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}

10
.obsidian/plugins/calendar/data.json vendored Normal file
View File

@ -0,0 +1,10 @@
{
"shouldConfirmBeforeCreate": true,
"weekStart": "locale",
"wordsPerDot": 250,
"showWeeklyNote": false,
"weeklyNoteFormat": "",
"weeklyNoteTemplate": "",
"weeklyNoteFolder": "",
"localeOverride": "system-default"
}

4459
.obsidian/plugins/calendar/main.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
{
"id": "calendar",
"name": "Calendar",
"description": "Calendar view of your daily notes",
"version": "1.5.10",
"author": "Liam Cain",
"authorUrl": "https://github.com/liamcain/",
"isDesktopOnly": false,
"minAppVersion": "0.9.11"
}

20876
.obsidian/plugins/dataview/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
{
"id": "dataview",
"name": "Dataview",
"version": "0.5.68",
"minAppVersion": "0.13.11",
"description": "Complex data views for the data-obsessed.",
"author": "Michael Brenan <blacksmithgu@gmail.com>",
"authorUrl": "https://github.com/blacksmithgu",
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
"isDesktopOnly": false
}

141
.obsidian/plugins/dataview/styles.css vendored Normal file
View File

@ -0,0 +1,141 @@
.block-language-dataview {
overflow-y: auto;
}
/*****************/
/** Table Views **/
/*****************/
/* List View Default Styling; rendered internally as a table. */
.table-view-table {
width: 100%;
}
.table-view-table > thead > tr, .table-view-table > tbody > tr {
margin-top: 1em;
margin-bottom: 1em;
text-align: left;
}
.table-view-table > tbody > tr:hover {
background-color: var(--table-row-background-hover);
}
.table-view-table > thead > tr > th {
font-weight: 700;
font-size: larger;
border-top: none;
border-left: none;
border-right: none;
border-bottom: solid;
max-width: 100%;
}
.table-view-table > tbody > tr > td {
text-align: left;
border: none;
font-weight: 400;
max-width: 100%;
}
.table-view-table ul, .table-view-table ol {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Rendered value styling for any view. */
.dataview-result-list-root-ul {
padding: 0em !important;
margin: 0em !important;
}
.dataview-result-list-ul {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Generic grouping styling. */
.dataview.result-group {
padding-left: 8px;
}
/*******************/
/** Inline Fields **/
/*******************/
.dataview.inline-field-key {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-primary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-standalone-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
/***************/
/** Task View **/
/***************/
.dataview.task-list-item, .dataview.task-list-basic-item {
margin-top: 3px;
margin-bottom: 3px;
transition: 0.4s;
}
.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
background-color: var(--text-selection);
box-shadow: -40px 0 0 var(--text-selection);
cursor: pointer;
}
/*****************/
/** Error Views **/
/*****************/
div.dataview-error-box {
width: 100%;
min-height: 150px;
display: flex;
align-items: center;
justify-content: center;
border: 4px dashed var(--background-secondary);
}
.dataview-error-message {
color: var(--text-muted);
text-align: center;
}
/*************************/
/** Additional Metadata **/
/*************************/
.dataview.small-text {
font-size: smaller;
color: var(--text-muted);
margin-left: 3px;
}
.dataview.small-text::before {
content: "(";
}
.dataview.small-text::after {
content: ")";
}

452
.obsidian/plugins/obsidian-git/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"author": "Vinzent",
"authorUrl": "https://github.com/Vinzent03",
"id": "obsidian-git",
"name": "Git",
"description": "Integrate Git version control with automatic backup and other advanced features.",
"isDesktopOnly": false,
"fundingUrl": "https://ko-fi.com/vinzent",
"version": "2.38.2"
}

View File

@ -0,0 +1,710 @@
@keyframes loading {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.git-signs-gutter {
.cm-gutterElement {
/* Needed to align the sign properly for different line heigts. Such as
* when having a heading or list item.
*/
padding-top: 0 !important;
}
}
.workspace-leaf-content[data-type="git-view"] .button-border {
border: 2px solid var(--interactive-accent);
border-radius: var(--radius-s);
}
.workspace-leaf-content[data-type="git-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.workspace-leaf-content[data-type="git-history-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.loading {
overflow: hidden;
}
.loading > svg {
animation: 2s linear infinite loading;
transform-origin: 50% 50%;
display: inline-block;
}
.obsidian-git-center {
margin: auto;
text-align: center;
width: 50%;
}
.obsidian-git-textarea {
display: block;
margin-left: auto;
margin-right: auto;
}
.obsidian-git-disabled {
opacity: 0.5;
}
.obsidian-git-center-button {
display: block;
margin: 20px auto;
}
.tooltip.mod-left {
overflow-wrap: break-word;
}
.tooltip.mod-right {
overflow-wrap: break-word;
}
/* Limits the scrollbar to the view body */
.git-view {
display: flex;
flex-direction: column;
position: relative;
height: 100%;
}
/* Re-enable wrapping of nav buttns to prevent overflow on smaller screens #*/
.workspace-drawer .git-view .nav-buttons-container {
flex-wrap: wrap;
}
.git-tools {
display: flex;
margin-left: auto;
}
.git-tools .type {
padding-left: var(--size-2-1);
display: flex;
align-items: center;
justify-content: center;
width: 11px;
}
.git-tools .type[data-type="M"] {
color: orange;
}
.git-tools .type[data-type="D"] {
color: red;
}
.git-tools .buttons {
display: flex;
}
.git-tools .buttons > * {
padding: 0 0;
height: auto;
}
.workspace-leaf-content[data-type="git-view"] .tree-item-self,
.workspace-leaf-content[data-type="git-history-view"] .tree-item-self {
align-items: center;
}
.workspace-leaf-content[data-type="git-view"]
.tree-item-self:hover
.clickable-icon,
.workspace-leaf-content[data-type="git-history-view"]
.tree-item-self:hover
.clickable-icon {
color: var(--icon-color-hover);
}
/* Highlight an item as active if it's diff is currently opened */
.is-active .git-tools .buttons > * {
color: var(--nav-item-color-active);
}
.git-author {
color: var(--text-accent);
}
.git-date {
color: var(--text-accent);
}
.git-ref {
color: var(--text-accent);
}
/* ====== diff2html ======
The following styles are adapted from the obsidian-version-history plugin by
@kometenstaub https://github.com/kometenstaub/obsidian-version-history-diff/blob/main/src/styles.scss
which itself is adapted from the diff2html library with the following original license:
https://github.com/rtfpessoa/diff2html/blob/master/LICENSE.md
Copyright 2014-2016 Rodrigo Fernandes https://rtfpessoa.github.io/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
.theme-dark,
.theme-light {
--git-delete-bg: #ff475040;
--git-delete-hl: #96050a75;
--git-insert-bg: #68d36840;
--git-insert-hl: #23c02350;
--git-change-bg: #ffd55840;
--git-selected: #3572b0;
--git-delete: #c33;
--git-insert: #399839;
--git-change: #d0b44c;
--git-move: #3572b0;
}
.git-diff {
.d2h-d-none {
display: none;
}
.d2h-wrapper {
text-align: left;
border-radius: 0.25em;
overflow: auto;
}
.d2h-file-header.d2h-file-header {
background-color: var(--background-secondary);
border-bottom: 1px solid var(--background-modifier-border);
font-family:
Source Sans Pro,
Helvetica Neue,
Helvetica,
Arial,
sans-serif;
height: 35px;
padding: 5px 10px;
}
.d2h-file-header,
.d2h-file-stats {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.d2h-file-header {
display: none;
}
.d2h-file-stats {
font-size: 14px;
margin-left: auto;
}
.d2h-lines-added {
border: 1px solid var(--color-green);
border-radius: 5px 0 0 5px;
color: var(--color-green);
padding: 2px;
text-align: right;
vertical-align: middle;
}
.d2h-lines-deleted {
border: 1px solid var(--color-red);
border-radius: 0 5px 5px 0;
color: var(--color-red);
margin-left: 1px;
padding: 2px;
text-align: left;
vertical-align: middle;
}
.d2h-file-name-wrapper {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 15px;
width: 100%;
}
.d2h-file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-normal);
font-size: var(--h5-size);
}
.d2h-file-wrapper {
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
margin-bottom: 1em;
max-height: 100%;
}
.d2h-file-collapse {
-webkit-box-pack: end;
-ms-flex-pack: end;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
cursor: pointer;
display: none;
font-size: 12px;
justify-content: flex-end;
padding: 4px 8px;
}
.d2h-file-collapse.d2h-selected {
background-color: var(--git-selected);
}
.d2h-file-collapse-input {
margin: 0 4px 0 0;
}
.d2h-diff-table {
border-collapse: collapse;
font-family: var(--font-monospace);
font-size: var(--code-size);
width: 100%;
}
.d2h-files-diff {
width: 100%;
}
.d2h-file-diff {
/*
overflow-y: scroll;
*/
border-radius: 5px;
font-size: var(--font-text-size);
line-height: var(--line-height-normal);
}
.d2h-file-side-diff {
display: inline-block;
margin-bottom: -8px;
margin-right: -4px;
overflow-x: scroll;
overflow-y: hidden;
width: 50%;
}
.d2h-code-line {
padding-left: 6em;
padding-right: 1.5em;
}
.d2h-code-line,
.d2h-code-side-line {
display: inline-block;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
white-space: nowrap;
width: 100%;
}
.d2h-code-side-line {
/* needed to be changed */
padding-left: 0.5em;
padding-right: 0.5em;
}
.d2h-code-line-ctn {
word-wrap: normal;
background: none;
display: inline-block;
padding: 0;
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
vertical-align: middle;
width: 100%;
/* only works for line-by-line */
white-space: pre-wrap;
}
.d2h-code-line del,
.d2h-code-side-line del {
background-color: var(--git-delete-hl);
color: var(--text-normal);
}
.d2h-code-line del,
.d2h-code-line ins,
.d2h-code-side-line del,
.d2h-code-side-line ins {
border-radius: 0.2em;
display: inline-block;
margin-top: -1px;
text-decoration: none;
vertical-align: middle;
}
.d2h-code-line ins,
.d2h-code-side-line ins {
background-color: var(--git-insert-hl);
text-align: left;
}
.d2h-code-line-prefix {
word-wrap: normal;
background: none;
display: inline;
padding: 0;
white-space: pre;
}
.line-num1 {
float: left;
}
.line-num1,
.line-num2 {
-webkit-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
/*
padding: 0 0.5em;
*/
text-overflow: ellipsis;
width: 2.5em;
padding-left: 0;
}
.line-num2 {
float: right;
}
.d2h-code-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
display: inline-block;
position: absolute;
text-align: right;
width: 5.5em;
}
.d2h-code-linenumber:after {
content: "\200b";
}
.d2h-code-side-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
overflow: hidden;
padding: 0 0.5em;
text-align: right;
text-overflow: ellipsis;
width: 4em;
/* needed to be changed */
display: table-cell;
position: relative;
}
.d2h-code-side-linenumber:after {
content: "\200b";
}
.d2h-code-side-emptyplaceholder,
.d2h-emptyplaceholder {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
}
.d2h-code-line-prefix,
.d2h-code-linenumber,
.d2h-code-side-linenumber,
.d2h-emptyplaceholder {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.d2h-code-linenumber,
.d2h-code-side-linenumber {
direction: rtl;
}
.d2h-del {
background-color: var(--git-delete-bg);
border-color: var(--git-delete-hl);
}
.d2h-ins {
background-color: var(--git-insert-bg);
border-color: var(--git-insert-hl);
}
.d2h-info {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
color: var(--text-faint);
}
.d2h-del,
.d2h-ins,
.d2h-file-diff .d2h-change {
color: var(--text-normal);
}
.d2h-file-diff .d2h-del.d2h-change {
background-color: var(--git-change-bg);
}
.d2h-file-diff .d2h-ins.d2h-change {
background-color: var(--git-insert-bg);
}
.d2h-file-list-wrapper {
a {
text-decoration: none;
cursor: default;
-webkit-user-drag: none;
}
svg {
display: none;
}
}
.d2h-file-list-header {
text-align: left;
}
.d2h-file-list-title {
display: none;
}
.d2h-file-list-line {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
text-align: left;
}
.d2h-file-list {
}
.d2h-file-list > li {
border-bottom: 1px solid var(--background-modifier-border);
margin: 0;
padding: 5px 10px;
}
.d2h-file-list > li:last-child {
border-bottom: none;
}
.d2h-file-switch {
cursor: pointer;
display: none;
font-size: 10px;
}
.d2h-icon {
fill: currentColor;
margin-right: 10px;
vertical-align: middle;
}
.d2h-deleted {
color: var(--git-delete);
}
.d2h-added {
color: var(--git-insert);
}
.d2h-changed {
color: var(--git-change);
}
.d2h-moved {
color: var(--git-move);
}
.d2h-tag {
background-color: var(--background-secondary);
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 10px;
margin-left: 5px;
padding: 0 2px;
}
.d2h-deleted-tag {
border: 1px solid var(--git-delete);
}
.d2h-added-tag {
border: 1px solid var(--git-insert);
}
.d2h-changed-tag {
border: 1px solid var(--git-change);
}
.d2h-moved-tag {
border: 1px solid var(--git-move);
}
/* needed for line-by-line*/
.d2h-diff-tbody {
position: relative;
}
}
/* ====================== Line Authoring Information ====================== */
.cm-gutterElement.obs-git-blame-gutter {
/* Add background color to spacing inbetween and around the gutter for better aesthetics */
border-width: 0px 2px 0.2px 2px;
border-style: solid;
border-color: var(--background-secondary);
background-color: var(--background-secondary);
}
.cm-gutterElement.obs-git-blame-gutter > div,
.line-author-settings-preview {
/* delegate text color to settings */
color: var(--obs-git-gutter-text);
font-family: monospace;
height: 100%; /* ensure, that age-based background color occupies entire parent */
text-align: right;
padding: 0px 6px 0px 6px;
white-space: pre; /* Keep spaces and do not collapse them. */
}
@media (max-width: 800px) {
/* hide git blame gutter not to superpose text */
.cm-gutterElement.obs-git-blame-gutter {
display: none;
}
}
.git-unified-diff-view,
.git-split-diff-view .cm-deletedLine .cm-changedText {
background-color: #ee443330;
}
.git-unified-diff-view,
.git-split-diff-view .cm-insertedLine .cm-changedText {
background-color: #22bb2230;
}
.git-obscure-prompt[git-is-obscured="true"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>');
}
.git-obscure-prompt[git-is-obscured="false"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye-off"><path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"></path><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"></path><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"></path><path d="m2 2 20 20"></path></svg>');
}
/* Override styling of Codemirror merge view "collapsed lines" indicator */
.git-split-diff-view .ͼ2 .cm-collapsedLines {
background: var(--interactive-normal);
border-radius: var(--radius-m);
color: var(--text-accent);
font-size: var(--font-small);
padding: var(--size-4-1) var(--size-4-1);
}
.git-split-diff-view .ͼ2 .cm-collapsedLines:hover {
background: var(--interactive-hover);
color: var(--text-accent-hover);
}
.git-signs-gutter {
.cm-gutterElement {
display: grid;
}
}
.git-gutter-marker:hover {
border-radius: 2px;
}
.git-gutter-marker.git-add {
background-color: var(--color-green);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-change {
background-color: var(--color-yellow);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-changedelete {
color: var(--color-yellow);
font-weight: var(--font-bold);
font-size: 1rem;
justify-self: center;
height: inherit;
}
.git-gutter-marker.git-delete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: end;
}
.git-gutter-marker.git-topdelete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: start;
}
div:hover > .git-gutter-marker.git-change {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-add {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-delete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-topdelete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-changedelete {
font-weight: var(--font-bold);
}
.git-gutter-marker.staged {
opacity: 0.5;
}
.git-diff {
.cm-merge-revert {
width: 4em;
}
/* Ensure that merge revert markers are positioned correctly */
.cm-merge-revert > * {
position: absolute;
background-color: var(--background-secondary);
display: flex;
}
}
/* Prevent shifting of the editor when git signs gutter is the only gutter present */
.cm-gutters.cm-gutters-before:has(> .git-signs-gutter:only-child) {
margin-inline-end: 0;
.git-signs-gutter {
margin-inline-start: -1rem;
}
}
.git-changes-status-bar-colored {
.git-add {
color: var(--color-green);
}
.git-change {
color: var(--color-yellow);
}
.git-delete {
color: var(--color-red);
}
}
.git-changes-status-bar .git-add {
margin-right: 0.3em;
}
.git-changes-status-bar .git-change {
margin-right: 0.3em;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
{
"id": "obsidian-kanban",
"name": "Kanban",
"version": "2.0.51",
"minAppVersion": "1.0.0",
"description": "Create markdown-backed Kanban boards in Obsidian.",
"author": "mgmeyers",
"authorUrl": "https://github.com/mgmeyers/obsidian-kanban",
"helpUrl": "https://publish.obsidian.md/kanban/Obsidian+Kanban+Plugin",
"isDesktopOnly": false
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,86 @@
{
"presets": {
"this_file": "path includes {{query.file.path}}",
"this_folder": "folder includes {{query.file.folder}}",
"this_folder_only": "filter by function task.file.folder === query.file.folder",
"this_root": "root includes {{query.file.root}}",
"hide_date_fields": "# Hide any values for all date fields\nhide due date\nhide scheduled date\nhide start date\nhide created date\nhide done date\nhide cancelled date",
"hide_non_date_fields": "# Hide all the non-date fields, but not tags\nhide id\nhide depends on\nhide recurrence rule\nhide on completion\nhide priority",
"hide_query_elements": "# Hide postpone, edit and backinks\nhide postpone button\nhide edit button\nhide backlinks",
"hide_everything": "# Hide everything except description and any tags\npreset hide_date_fields\npreset hide_non_date_fields\npreset hide_query_elements"
},
"globalQuery": "",
"globalFilter": "",
"removeGlobalFilter": false,
"taskFormat": "tasksPluginEmoji",
"setCreatedDate": true,
"setDoneDate": true,
"setCancelledDate": true,
"autoSuggestInEditor": true,
"autoSuggestMinMatch": 0,
"autoSuggestMaxItems": 20,
"provideAccessKeys": true,
"useFilenameAsScheduledDate": false,
"filenameAsScheduledDateFormat": "",
"filenameAsDateFolders": [],
"recurrenceOnNextLine": false,
"removeScheduledDateOnRecurrence": false,
"statusSettings": {
"coreStatuses": [
{
"symbol": " ",
"name": "Todo",
"nextStatusSymbol": "x",
"availableAsCommand": true,
"type": "TODO"
},
{
"symbol": "x",
"name": "Done",
"nextStatusSymbol": " ",
"availableAsCommand": true,
"type": "DONE"
}
],
"customStatuses": [
{
"symbol": "/",
"name": "In Progress",
"nextStatusSymbol": "x",
"availableAsCommand": true,
"type": "IN_PROGRESS"
},
{
"symbol": "-",
"name": "Cancelled",
"nextStatusSymbol": " ",
"availableAsCommand": true,
"type": "CANCELLED"
}
]
},
"features": {
"INTERNAL_TESTING_ENABLED_BY_DEFAULT": true
},
"generalSettings": {},
"headingOpened": {
"Core Statuses": true,
"Custom Statuses": true
},
"debugSettings": {
"ignoreSortInstructions": false,
"showTaskHiddenData": false,
"recordTimings": false
},
"loggingOptions": {
"minLevels": {
"": "info",
"tasks": "info",
"tasks.Cache": "info",
"tasks.Events": "info",
"tasks.File": "info",
"tasks.Query": "info",
"tasks.Task": "info"
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,12 @@
{
"id": "obsidian-tasks-plugin",
"name": "Tasks",
"version": "7.21.0",
"minAppVersion": "1.4.0",
"description": "Track tasks across your vault. Supports due dates, recurring tasks, done dates, sub-set of checklist items, and filtering.",
"helpUrl": "https://publish.obsidian.md/tasks/",
"author": "Clare Macrae and Ilyas Landikov (created by Martin Schenck)",
"authorUrl": "https://github.com/obsidian-tasks-group",
"fundingUrl": "https://github.com/sponsors/claremacrae",
"isDesktopOnly": false
}

File diff suppressed because one or more lines are too long

42
.obsidian/plugins/omnisearch/data.json vendored Normal file
View File

@ -0,0 +1,42 @@
{
"useCache": true,
"hideExcluded": false,
"recencyBoost": "0",
"downrankedFoldersFilters": [],
"ignoreDiacritics": true,
"ignoreArabicDiacritics": false,
"indexedFileTypes": [],
"displayTitle": "",
"PDFIndexing": false,
"officeIndexing": false,
"imagesIndexing": false,
"aiImageIndexing": false,
"unsupportedFilesIndexing": "default",
"splitCamelCase": false,
"openInNewPane": false,
"vimLikeNavigationShortcut": false,
"ribbonIcon": true,
"showExcerpt": true,
"maxEmbeds": 5,
"renderLineReturnInExcerpts": true,
"showCreateButton": false,
"highlight": true,
"showPreviousQueryResults": true,
"simpleSearch": false,
"tokenizeUrls": false,
"fuzziness": "1",
"weightBasename": 10,
"weightDirectory": 7,
"weightH1": 6,
"weightH2": 5,
"weightH3": 4,
"weightUnmarkedTags": 2,
"weightCustomProperties": [],
"httpApiEnabled": false,
"httpApiPort": "51361",
"httpApiNotice": true,
"welcomeMessage": "1.21.0",
"verboseLogging": false,
"DANGER_httpHost": null,
"DANGER_forceSaveCache": false
}

170
.obsidian/plugins/omnisearch/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
{
"id": "omnisearch",
"name": "Omnisearch",
"version": "1.27.2",
"minAppVersion": "1.7.2",
"description": "A search engine that just works",
"author": "Simon Cambier",
"authorUrl": "https://github.com/scambier/obsidian-omnisearch",
"fundingUrl": {
"Github": "https://github.com/sponsors/scambier",
"Ko-fi": "https://ko-fi.com/scambier"
},
"isDesktopOnly": false
}

135
.obsidian/plugins/omnisearch/styles.css vendored Normal file
View File

@ -0,0 +1,135 @@
.omnisearch-modal {
}
.omnisearch-result {
white-space: normal;
display: flex;
flex-direction: row;
/* justify-content: space-between; */
flex-wrap: nowrap;
}
.omnisearch-result__title-container {
display: flex;
align-items: center;
justify-content: space-between;
column-gap: 5px;
flex-wrap: wrap;
}
.omnisearch-result__title {
white-space: pre-wrap;
align-items: center;
display: flex;
gap: 5px;
}
.omnisearch-result__title > span {
}
.omnisearch-result__folder-path {
font-size: 0.75rem;
align-items: center;
display: flex;
gap: 5px;
color: var(--text-muted);
}
.omnisearch-result__extension {
font-size: 0.7rem;
color: var(--text-muted);
}
.omnisearch-result__counter {
font-size: 0.7rem;
color: var(--text-muted);
}
.omnisearch-result__body {
white-space: normal;
font-size: small;
word-wrap: normal;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
color: var(--text-muted);
margin-inline-start: 0.5em;
}
.omnisearch-result__embed {
margin-left: 1em;
}
.omnisearch-result__image-container {
flex-basis: 20%;
text-align: end;
}
.omnisearch-highlight {
}
.omnisearch-default-highlight {
text-decoration: underline;
text-decoration-color: var(--text-highlight-bg);
text-decoration-thickness: 3px;
text-underline-offset: -1px;
text-decoration-skip-ink: none;
}
.omnisearch-input-container {
display: flex;
align-items: center;
flex-direction: row;
gap: 5px;
}
.omnisearch-result__icon {
display: inline-block;
vertical-align: middle;
width: 16px;
height: 16px;
margin-right: 4px;
}
.omnisearch-result__icon svg {
width: 100%;
height: 100%;
}
.omnisearch-result__icon--emoji {
font-size: 16px;
vertical-align: middle;
margin-right: 4px;
}
@media only screen and (max-width: 600px) {
.omnisearch-input-container {
flex-direction: column;
}
.omnisearch-input-container__buttons {
display: flex;
flex-direction: row;
width: 100%;
padding: 0 1em 0 1em;
gap: 1em;
}
.omnisearch-input-container__buttons > button {
flex-grow: 1;
}
}
@media only screen and (min-width: 600px) {
.omnisearch-input-container__buttons {
margin-inline-end: 1em;
}
}
.omnisearch-input-field {
position: relative;
flex-grow: 1;
}

115
.obsidian/plugins/quickadd/data.json vendored Normal file
View File

@ -0,0 +1,115 @@
{
"choices": [],
"inputPrompt": "single-line",
"persistInputPromptDrafts": true,
"useSelectionAsCaptureValue": true,
"devMode": false,
"templateFolderPath": "",
"announceUpdates": "major",
"version": "2.11.0",
"globalVariables": {},
"onePageInputEnabled": false,
"disableOnlineFeatures": true,
"enableRibbonIcon": false,
"showCaptureNotification": true,
"showInputCancellationNotification": false,
"enableTemplatePropertyTypes": false,
"dateAliases": {
"t": "today",
"tm": "tomorrow",
"yd": "yesterday",
"nw": "next week",
"nm": "next month",
"ny": "next year",
"lw": "last week",
"lm": "last month",
"ly": "last year"
},
"ai": {
"defaultModel": "Ask me",
"defaultSystemPrompt": "As an AI assistant within Obsidian, your primary goal is to help users manage their ideas and knowledge more effectively. Format your responses using Markdown syntax. Please use the [[Obsidian]] link format. You can write aliases for the links by writing [[Obsidian|the alias after the pipe symbol]]. To use mathematical notation, use LaTeX syntax. LaTeX syntax for larger equations should be on separate lines, surrounded with double dollar signs ($$). You can also inline math expressions by wrapping it in $ symbols. For example, use $$w_{ij}^{\text{new}}:=w_{ij}^{\text{current}}+etacdotdelta_jcdot x_{ij}$$ on a separate line, but you can write \"($eta$ = learning rate, $delta_j$ = error term, $x_{ij}$ = input)\" inline.",
"promptTemplatesFolderPath": "",
"showAssistant": true,
"providers": [
{
"name": "OpenAI",
"endpoint": "https://api.openai.com/v1",
"apiKey": "",
"models": [
{
"name": "gpt-3.5-turbo",
"maxTokens": 4096
},
{
"name": "gpt-3.5-turbo-16k",
"maxTokens": 16384
},
{
"name": "gpt-3.5-turbo-1106",
"maxTokens": 16385
},
{
"name": "gpt-4",
"maxTokens": 8192
},
{
"name": "gpt-4-32k",
"maxTokens": 32768
},
{
"name": "gpt-4-1106-preview",
"maxTokens": 128000
},
{
"name": "gpt-4-turbo",
"maxTokens": 128000
},
{
"name": "gpt-4o",
"maxTokens": 128000
},
{
"name": "gpt-4o-mini",
"maxTokens": 128000
}
],
"autoSyncModels": false,
"modelSource": "modelsDev"
},
{
"name": "Gemini",
"endpoint": "https://generativelanguage.googleapis.com",
"apiKey": "",
"models": [
{
"name": "gemini-1.5-pro",
"maxTokens": 1000000
},
{
"name": "gemini-1.5-flash",
"maxTokens": 1000000
},
{
"name": "gemini-1.5-flash-8b",
"maxTokens": 1000000
}
],
"autoSyncModels": false,
"modelSource": "modelsDev"
}
]
},
"migrations": {
"migrateToMacroIDFromEmbeddedMacro": true,
"useQuickAddTemplateFolder": true,
"incrementFileNameSettingMoveToDefaultBehavior": true,
"mutualExclusionInsertAfterAndWriteToBottomOfFile": true,
"setVersionAfterUpdateModalRelease": true,
"addDefaultAIProviders": true,
"removeMacroIndirection": true,
"migrateFileOpeningSettings": true,
"backfillFileOpeningDefaults": true,
"setProviderModelDiscoveryMode": true,
"migrateProviderApiKeysToSecretStorage": true
}
}

114
.obsidian/plugins/quickadd/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,12 @@
{
"id": "quickadd",
"name": "QuickAdd",
"version": "2.11.0",
"minAppVersion": "1.11.4",
"description": "Quickly add new pages or content to your vault.",
"author": "Christian B. B. Houmann",
"authorUrl": "https://bagerbach.com",
"fundingUrl": "https://www.buymeacoffee.com/chhoumann",
"helpUrl": "https://quickadd.obsidian.guide/docs/",
"isDesktopOnly": false
}

1
.obsidian/plugins/quickadd/styles.css vendored Normal file

File diff suppressed because one or more lines are too long

459
.obsidian/plugins/tasknotes/data.json vendored Normal file
View File

@ -0,0 +1,459 @@
{
"tasksFolder": "03 - Taken/{{year}}",
"moveArchivedTasks": false,
"archiveFolder": "TaskNotes/Archive",
"taskTag": "task",
"taskIdentificationMethod": "tag",
"hideIdentifyingTagsInCards": true,
"taskPropertyName": "",
"taskPropertyValue": "",
"excludedFolders": "01 - Inbox, 02 - Dagboek",
"defaultTaskPriority": "normal",
"defaultTaskStatus": "open",
"taskOrgFiltersCollapsed": false,
"taskFilenameFormat": "zettel",
"storeTitleInFilename": true,
"customFilenameTemplate": "{title}",
"taskCreationDefaults": {
"defaultContexts": "",
"defaultTags": "",
"defaultProjects": "",
"useParentNoteAsProject": false,
"defaultTimeEstimate": 0,
"defaultRecurrence": "none",
"defaultDueDate": "none",
"defaultScheduledDate": "today",
"bodyTemplate": "",
"useBodyTemplate": false,
"defaultReminders": []
},
"calendarViewSettings": {
"defaultView": "dayGridMonth",
"customDayCount": 3,
"slotDuration": "00:30:00",
"slotMinTime": "06:00:00",
"slotMaxTime": "19:00:00",
"scrollTime": "08:00:00",
"firstDay": 1,
"timeFormat": "24",
"showWeekends": true,
"locale": "",
"defaultShowScheduled": true,
"defaultShowDue": true,
"defaultShowDueWhenScheduled": true,
"defaultShowScheduledToDueSpan": false,
"defaultShowTimeEntries": false,
"defaultShowRecurring": true,
"defaultShowICSEvents": true,
"enableTimeblocking": true,
"defaultShowTimeblocks": true,
"defaultTimeblockColor": "#6366f1",
"nowIndicator": true,
"selectMirror": true,
"weekNumbers": true,
"showTodayHighlight": true,
"eventMinHeight": 15,
"slotEventOverlap": true,
"eventMaxStack": null,
"dayMaxEvents": true,
"dayMaxEventRows": false
},
"pomodoroWorkDuration": 25,
"pomodoroShortBreakDuration": 5,
"pomodoroLongBreakDuration": 15,
"pomodoroLongBreakInterval": 4,
"pomodoroAutoStartBreaks": true,
"pomodoroAutoStartWork": false,
"pomodoroNotifications": true,
"pomodoroSoundEnabled": true,
"pomodoroSoundVolume": 50,
"pomodoroStorageLocation": "plugin",
"pomodoroMobileSidebar": "tab",
"enableTaskLinkOverlay": true,
"disableOverlayOnAlias": false,
"enableInstantTaskConvert": true,
"useDefaultsOnInstantConvert": true,
"enableNaturalLanguageInput": true,
"nlpDefaultToScheduled": true,
"nlpLanguage": "en",
"uiLanguage": "system",
"statusSuggestionTrigger": "*",
"nlpTriggers": {
"triggers": [
{
"propertyId": "tags",
"trigger": "#",
"enabled": true
},
{
"propertyId": "contexts",
"trigger": "@",
"enabled": true
},
{
"propertyId": "projects",
"trigger": "+",
"enabled": true
},
{
"propertyId": "status",
"trigger": "*",
"enabled": true
},
{
"propertyId": "priority",
"trigger": "!",
"enabled": false
}
]
},
"singleClickAction": "edit",
"doubleClickAction": "openNote",
"projectAutosuggest": {
"enableFuzzy": false,
"rows": [
"{title|n(Title)}",
"{aliases|n(Aliases)}",
"{file.path|n(Path)}"
],
"showAdvanced": false,
"requiredTags": [],
"includeFolders": [],
"propertyKey": "",
"propertyValue": ""
},
"inlineTaskConvertFolder": "{{currentNotePath}}",
"disableNoteIndexing": false,
"suggestionDebounceMs": 0,
"fieldMapping": {
"title": "title",
"status": "status",
"priority": "priority",
"due": "due",
"scheduled": "scheduled",
"contexts": "contexts",
"projects": "projects",
"timeEstimate": "timeEstimate",
"completedDate": "completedDate",
"dateCreated": "dateCreated",
"dateModified": "dateModified",
"recurrence": "recurrence",
"recurrenceAnchor": "recurrence_anchor",
"archiveTag": "archived",
"timeEntries": "timeEntries",
"completeInstances": "complete_instances",
"skippedInstances": "skipped_instances",
"blockedBy": "blockedBy",
"pomodoros": "pomodoros",
"icsEventId": "icsEventId",
"icsEventTag": "ics_event",
"googleCalendarEventId": "googleCalendarEventId",
"reminders": "reminders"
},
"customStatuses": [
{
"id": "none",
"value": "none",
"label": "None",
"color": "#cccccc",
"isCompleted": false,
"order": 0,
"autoArchive": false,
"autoArchiveDelay": 5
},
{
"id": "open",
"value": "open",
"label": "Open",
"color": "#808080",
"isCompleted": false,
"order": 1,
"autoArchive": false,
"autoArchiveDelay": 5
},
{
"id": "in-progress",
"value": "in-progress",
"label": "In progress",
"color": "#0066cc",
"isCompleted": false,
"order": 2,
"autoArchive": false,
"autoArchiveDelay": 5
},
{
"id": "done",
"value": "done",
"label": "Done",
"color": "#00aa00",
"isCompleted": true,
"order": 3,
"autoArchive": false,
"autoArchiveDelay": 5
}
],
"customPriorities": [
{
"id": "none",
"value": "none",
"label": "None",
"color": "#cccccc",
"weight": 0
},
{
"id": "low",
"value": "low",
"label": "Low",
"color": "#00aa00",
"weight": 1
},
{
"id": "normal",
"value": "normal",
"label": "Normal",
"color": "#ffaa00",
"weight": 2
},
{
"id": "high",
"value": "high",
"label": "High",
"color": "#ff0000",
"weight": 3
}
],
"recurrenceMigrated": false,
"showReleaseNotesOnUpdate": true,
"showTrackedTasksInStatusBar": false,
"autoStopTimeTrackingOnComplete": true,
"autoStopTimeTrackingNotification": false,
"showRelationships": true,
"relationshipsPosition": "bottom",
"showTaskCardInNote": true,
"showExpandableSubtasks": true,
"subtaskChevronPosition": "right",
"viewsButtonAlignment": "right",
"hideCompletedFromOverdue": true,
"icsIntegration": {
"defaultNoteTemplate": "",
"defaultNoteFolder": "",
"icsNoteFilenameFormat": "title",
"customICSNoteFilenameTemplate": "{title}",
"enableAutoExport": false,
"autoExportPath": "tasknotes-calendar.ics",
"autoExportInterval": 60,
"useDurationForExport": false,
"useICSEndAsDue": false
},
"savedViews": [],
"enableNotifications": true,
"notificationType": "system",
"enableAPI": false,
"apiPort": 8080,
"apiAuthToken": "",
"enableMCP": false,
"webhooks": [],
"userFields": [],
"enableModalSplitLayout": true,
"defaultVisibleProperties": [
"status",
"priority",
"due",
"scheduled",
"projects",
"contexts",
"tags",
"blocked",
"blocking",
"timeEstimate",
"totalTrackedTime"
],
"inlineVisibleProperties": [
"status",
"priority",
"due",
"scheduled",
"recurrence"
],
"enableBases": true,
"enableMdbaseSpec": false,
"autoCreateDefaultBasesFiles": true,
"commandFileMapping": {
"open-calendar-view": "00 - Start/Views/mini-calendar-default.base",
"open-kanban-view": "00 - Start/Views/kanban-default.base",
"open-tasks-view": "00 - Start/Views/tasks-default.base",
"open-advanced-calendar-view": "00 - Start/Views/calendar-default.base",
"open-agenda-view": "00 - Start/Views/agenda-default.base",
"relationships": "00 - Start/Views/relationships.base"
},
"maintainDueDateOffsetInRecurring": false,
"resetCheckboxesOnRecurrence": false,
"useFrontmatterMarkdownLinks": false,
"oauthSetupMode": "advanced",
"lemonSqueezyLicenseKey": "",
"googleOAuthClientId": "",
"googleOAuthClientSecret": "",
"microsoftOAuthClientId": "",
"microsoftOAuthClientSecret": "",
"enableGoogleCalendar": false,
"enableMicrosoftCalendar": false,
"enabledGoogleCalendars": [],
"googleCalendarSyncTokens": {},
"enabledMicrosoftCalendars": [],
"microsoftCalendarSyncTokens": {},
"googleCalendarExport": {
"enabled": false,
"targetCalendarId": "",
"syncOnTaskCreate": true,
"syncOnTaskUpdate": true,
"syncOnTaskComplete": true,
"syncOnTaskDelete": true,
"eventTitleTemplate": "{{title}}",
"includeDescription": true,
"eventColorId": null,
"syncTrigger": "scheduled",
"createAsAllDay": true,
"defaultEventDuration": 60,
"includeObsidianLink": true,
"defaultReminderMinutes": null
},
"lastSeenVersion": "4.4.0",
"modalFieldsConfig": {
"version": 1,
"fields": [
{
"id": "title",
"fieldType": "core",
"group": "basic",
"displayName": "Title",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true,
"required": true
},
{
"id": "details",
"fieldType": "core",
"group": "basic",
"displayName": "Details",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "contexts",
"fieldType": "core",
"group": "metadata",
"displayName": "Contexts",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "tags",
"fieldType": "core",
"group": "metadata",
"displayName": "Tags",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "time-estimate",
"fieldType": "core",
"group": "metadata",
"displayName": "Time Estimate",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 2,
"enabled": true
},
{
"id": "projects",
"fieldType": "organization",
"group": "organization",
"displayName": "Projects",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "subtasks",
"fieldType": "organization",
"group": "organization",
"displayName": "Subtasks",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
},
{
"id": "blocked-by",
"fieldType": "dependency",
"group": "dependencies",
"displayName": "Blocked By",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 0,
"enabled": true
},
{
"id": "blocking",
"fieldType": "dependency",
"group": "dependencies",
"displayName": "Blocking",
"visibleInCreation": true,
"visibleInEdit": true,
"order": 1,
"enabled": true
}
],
"groups": [
{
"id": "basic",
"displayName": "Basic Information",
"order": 0,
"collapsible": false,
"defaultCollapsed": false
},
{
"id": "metadata",
"displayName": "Metadata",
"order": 1,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "organization",
"displayName": "Organization",
"order": 2,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "dependencies",
"displayName": "Dependencies",
"order": 3,
"collapsible": true,
"defaultCollapsed": false
},
{
"id": "custom",
"displayName": "Custom Fields",
"order": 4,
"collapsible": true,
"defaultCollapsed": false
}
]
},
"pomodoroState": {
"isRunning": false,
"timeRemaining": 1800
},
"lastPomodoroDate": "2026-04-02"
}

1209
.obsidian/plugins/tasknotes/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"id": "tasknotes",
"name": "TaskNotes",
"version": "4.4.0",
"minAppVersion": "1.10.1",
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
"author": "Callum Alpass",
"authorUrl": "https://github.com/callumalpass",
"isDesktopOnly": false
}

19585
.obsidian/plugins/tasknotes/styles.css vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,38 @@
{
"command_timeout": 5,
"templates_folder": "08_TEMPLATES",
"templates_pairs": [
[
"",
""
]
],
"trigger_on_file_creation": false,
"auto_jump_to_cursor": false,
"enable_system_commands": false,
"shell_path": "",
"user_scripts_folder": "",
"enable_folder_templates": true,
"folder_templates": [
{
"folder": "",
"template": ""
}
],
"enable_file_templates": false,
"file_templates": [
{
"regex": ".*",
"template": ""
}
],
"syntax_highlighting": true,
"syntax_highlighting_mobile": false,
"enabled_templates_hotkeys": [
""
],
"startup_templates": [
""
],
"intellisense_render": 1
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.18.1",
"description": "Create and use templates",
"minAppVersion": "1.5.0",
"author": "SilentVoid",
"authorUrl": "https://github.com/SilentVoid13",
"helpUrl": "https://silentvoid13.github.io/Templater/",
"isDesktopOnly": false
}

View File

@ -0,0 +1,226 @@
.templater_search {
width: calc(100% - 20px);
}
.templater_div {
border-top: 1px solid var(--background-modifier-border);
}
.templater_div > .setting-item {
border-top: none !important;
align-self: center;
}
.templater_div > .setting-item > .setting-item-control {
justify-content: space-around;
padding: 0;
width: 100%;
}
.templater_div
> .setting-item
> .setting-item-control
> .setting-editor-extra-setting-button {
align-self: center;
}
.templater_donating {
margin: 10px;
}
.templater_title {
margin: 0;
padding: 0;
margin-top: 5px;
text-align: center;
}
.templater_template {
align-self: center;
margin-left: 5px;
margin-right: 5px;
width: 70%;
}
.templater_cmd {
margin-left: 5px;
margin-right: 5px;
font-size: 14px;
width: 100%;
}
.templater_div2 > .setting-item {
align-content: center;
justify-content: center;
}
.templater-prompt-div,
.templater-multisuggester-div {
display: flex;
}
.templater-prompt-form {
display: flex;
flex-grow: 1;
}
.templater-prompt-input,
.templater-multisuggester-input {
flex-grow: 1;
}
.templater-button-div {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1rem;
}
textarea.templater-prompt-input {
height: 10rem;
}
textarea.templater-prompt-input:focus {
border-color: var(--interactive-accent);
}
.templater-multisuggester-list {
margin: 1.5em 0;
}
.cm-s-obsidian .templater-command-bg {
left: 0px;
right: 0px;
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command {
font-size: 0.85em;
font-family: var(--font-monospace);
line-height: 1.3;
}
.cm-s-obsidian .templater-inline .cm-templater-command {
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
color: var(--code-property, #008bff);
}
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
color: var(--code-function, #c0d700);
}
.cm-s-obsidian .cm-templater-command.cm-keyword {
color: var(--code-keyword, #00a7aa);
font-weight: normal;
}
.cm-s-obsidian .cm-templater-command.cm-atom {
color: var(--code-normal, #f39b35);
}
.cm-s-obsidian .cm-templater-command.cm-value,
.cm-s-obsidian .cm-templater-command.cm-number,
.cm-s-obsidian .cm-templater-command.cm-type {
color: var(--code-value, #a06fca);
}
.cm-s-obsidian .cm-templater-command.cm-def,
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
color: var(--code-normal, var(--text-normal));
}
.cm-s-obsidian .cm-templater-command.cm-property,
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
.cm-s-obsidian .cm-templater-command.cm-attribute {
color: var(--code-function, #98e342);
}
.cm-s-obsidian .cm-templater-command.cm-variable,
.cm-s-obsidian .cm-templater-command.cm-variable-2,
.cm-s-obsidian .cm-templater-command.cm-variable-3,
.cm-s-obsidian .cm-templater-command.cm-meta {
color: var(--code-property, #d4d4d4);
}
.cm-s-obsidian .cm-templater-command.cm-callee,
.cm-s-obsidian .cm-templater-command.cm-operator,
.cm-s-obsidian .cm-templater-command.cm-qualifier,
.cm-s-obsidian .cm-templater-command.cm-builtin {
color: var(--code-operator, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-tag {
color: var(--code-tag, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-comment,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
color: var(--code-comment, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-string,
.cm-s-obsidian .cm-templater-command.cm-string-2 {
color: var(--code-string, #e6db74);
}
.cm-s-obsidian .cm-templater-command.cm-header,
.cm-s-obsidian .cm-templater-command.cm-hr {
color: var(--code-keyword, #da7dae);
}
.cm-s-obsidian .cm-templater-command.cm-link {
color: var(--code-normal, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-error {
border-bottom: 1px solid #c42412;
}
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
white-space: pre;
color: black;
cursor: pointer;
}
li.CodeMirror-hint-active {
background: #08f;
color: white;
}

3
.obsidian/templates.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"folder": "11_TEMPLATES"
}

33
.obsidian/types.json vendored Normal file
View File

@ -0,0 +1,33 @@
{
"types": {
"aliases": "aliases",
"cssclasses": "multitext",
"tags": "tags",
"TQ_explain": "checkbox",
"TQ_extra_instructions": "text",
"TQ_short_mode": "checkbox",
"TQ_show_backlink": "checkbox",
"TQ_show_cancelled_date": "checkbox",
"TQ_show_created_date": "checkbox",
"TQ_show_depends_on": "checkbox",
"TQ_show_done_date": "checkbox",
"TQ_show_due_date": "checkbox",
"TQ_show_edit_button": "checkbox",
"TQ_show_id": "checkbox",
"TQ_show_on_completion": "checkbox",
"TQ_show_postpone_button": "checkbox",
"TQ_show_priority": "checkbox",
"TQ_show_recurrence_rule": "checkbox",
"TQ_show_scheduled_date": "checkbox",
"TQ_show_start_date": "checkbox",
"TQ_show_tags": "checkbox",
"TQ_show_task_count": "checkbox",
"TQ_show_tree": "checkbox",
"TQ_show_urgency": "checkbox",
"introduced": "date",
"status": "text",
"active": "checkbox",
"joined": "multitext",
"date": "date"
}
}

289
.obsidian/workspace.json vendored Normal file
View File

@ -0,0 +1,289 @@
{
"main": {
"id": "59652a61e0abec2e",
"type": "split",
"children": [
{
"id": "03c8806fdce05e1a",
"type": "tabs",
"children": [
{
"id": "9801fda21e2b99ab",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "00 - Start/Dashboard.md",
"mode": "preview",
"source": true
},
"pinned": true,
"icon": "lucide-file",
"title": "Dashboard"
}
},
{
"id": "9cfdc7e854df0861",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "13 - Meetings/2026/2026-05-07 3T ESC-P test.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "2026-05-07 3T ESC-P test"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "8ffe4c5e307b2deb",
"type": "split",
"children": [
{
"id": "0dac00d3944afd89",
"type": "tabs",
"dimension": 59.10290237467019,
"children": [
{
"id": "81fc2f07bac1e6ac",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "d1e53398667e98e6",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "initiali",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "e5c9456bc850e828",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
],
"currentTab": 1
},
{
"id": "d205cfc9affb8542",
"type": "tabs",
"dimension": 40.89709762532981,
"children": [
{
"id": "568c38b10646ade1",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "13 - Meetings/2026/2026-05-07 3T ESC-P test.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of 2026-05-07 3T ESC-P test"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "e914115302b6b1fe",
"type": "split",
"children": [
{
"id": "78083847d2e27bbf",
"type": "tabs",
"children": [
{
"id": "24ef28dcd6d81723",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "00 - Start/Dashboard.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Dashboard"
}
},
{
"id": "7379d6c62a99e41e",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links"
}
},
{
"id": "559d66b4cf281a2a",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "6c69b0a878e80dbe",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "13 - Meetings/2026/2026-05-07 3T ESC-P test.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of 2026-05-07 3T ESC-P test"
}
},
{
"id": "b30827f0729f3742",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "calendar-with-checkmark",
"title": "Calendar"
}
},
{
"id": "8ecb3e1feb63c231",
"type": "leaf",
"state": {
"type": "bases",
"state": {
"file": "00 - Start/Views/mini-calendar-default.base",
"viewName": "Due"
},
"icon": "tasknotes-simple",
"title": "mini-calendar-default"
}
}
],
"currentTab": 4
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false,
"omnisearch:Omnisearch": false,
"obsidian-kanban:Create new board": false,
"templater-obsidian:Templater": false,
"tasknotes:Open mini calendar": false,
"tasknotes:Open advanced calendar": false,
"tasknotes:Open task list": false,
"tasknotes:Open agenda": false,
"tasknotes:Open kanban board": false,
"tasknotes:Open pomodoro": false,
"tasknotes:Open pomodoro stats": false,
"tasknotes:Create new task": false,
"obsidian-git:Open Git source control": false
}
},
"active": "d1e53398667e98e6",
"lastOpenFiles": [
"00 - Start/Dashboard.md",
"Companies/3T.md",
"13 - Meetings/2026/2026-05-07 3T ESC-P test.md",
"Companies",
"Contactpersonen/Frank Hobelman.md",
"Frank Hobelman.md",
"Contactpersonen",
"07 - Projecten/2026/M4939 Nieuwe firmware.md",
"13 - Meetings/2026/2026-04-20 Holmatro M5089A Teststatistieken.md",
"00 - Start/Views/mini-calendar-default.base",
"13 - Meetings/2026/2026-04-15 Hittech testrapporten.md",
"13 - Meetings/2026/2026-04-15 API intranet endpoints.md",
"13 - Meetings/2026/2026-02-27 Holmatro ESC-P testadapter.md",
"00 - Start/Views/calendar-default.base",
"00 - Start/Views/agenda-default.base",
"00 - Start/Views/kanban-default.base",
"00 - Start/Views/relationships.base",
"00 - Start/Views/tasks-default.base",
"03 - Taken/2026/T4997A Calibration.md",
"07 - Projecten/2026/Hittech testrapporten uploaden.md",
"00_HOME/Views/kanban-default.base",
"00_HOME/Views/calendar-default.base",
"07 - Projecten/2026/RMA orders importeren in Test-OK.md",
"07 - Projecten/2026/T5089A Testontwerp.md",
"07 - Projecten/2026/T4912B Update.md",
"07 - Projecten/2026/T4166F wijziging.md",
"02 - Dagboek/2026-04-02.md",
"08_DOMAINS/Test-OK.md",
"07 - Projecten/Untitled.md",
"02 - Dagboek/2026-03-27.md",
"02 - Dagboek/2026-03-18.md",
"02 - Dagboek/2026-03-17.md",
"02 - Dagboek/2026-03-16.md",
"02 - Dagboek/2026-02-27.md",
"12 - Bijlagen/T5089A - 20260317 - Toevoeging 10uF condensators.jpg",
"IMG_2005.jpeg",
"02_TASKS/2026/Kap maken voor LEDs.md",
"06 - Testadapters/T4997A.md",
"07_TEMPLATES/Untitled.canvas"
]
}

26
00 - Start/Dashboard.md Normal file
View File

@ -0,0 +1,26 @@
# Next actions
```dataview
TASK
WHERE !completed
AND !contains(tags, "#wachten")
GROUP BY file.link
SORT due ASC
```
---
# Wachten op anderen
```dataview
TASK
WHERE !completed
AND contains(tags, "#wachten")
GROUP BY file.link
SORT due ASC
```
---
# Actieve projecten
```dataview
TABLE status, klant
FROM "07 - Projecten"
WHERE type = "project" AND actief = true
SORT file.ctime DESC
```

View File

@ -0,0 +1,65 @@
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: due && date(due) < today() && status != "done"
isDueToday: due && date(due).date() == today()
isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: timeEstimate && timeEstimate > 0
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: file.mtime.format("YYYY-MM")
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: due || scheduled
isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views:
- type: tasknotesCalendar
name: Agenda
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
options:
showPropertyBasedEvents: false
calendarView: listWeek
startDateProperty: file.ctime
listDayCount: 7
titleProperty: file.basename

View File

@ -0,0 +1,74 @@
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: due && date(due) < today() && status != "done"
isDueToday: due && date(due).date() == today()
isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: timeEstimate && timeEstimate > 0
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: file.mtime.format("YYYY-MM")
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: due || scheduled
isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views:
- type: tasknotesCalendar
name: Calendar
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
options:
showScheduled: true
showDue: true
showRecurring: true
showTimeEntries: true
showTimeblocks: true
showPropertyBasedEvents: true
calendarView: timeGridWeek
customDayCount: 3
firstDay: 0
slotMinTime: 06:00:00
slotMaxTime: 22:00:00
slotDuration: 00:30:00
calendarView: timeGridWeek
showTimeEntries: true

View File

@ -0,0 +1,65 @@
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: due && date(due) < today() && status != "done"
isDueToday: due && date(due).date() == today()
isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: timeEstimate && timeEstimate > 0
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: file.mtime.format("YYYY-MM")
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: due || scheduled
isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views:
- type: tasknotesKanban
name: Kanban Board
groupBy:
property: status
direction: ASC
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
options:
columnWidth: 280
hideEmptyColumns: false

View File

@ -0,0 +1,73 @@
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: due && date(due) < today() && status != "done"
isDueToday: due && date(due).date() == today()
isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: timeEstimate && timeEstimate > 0
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: file.mtime.format("YYYY-MM")
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: due || scheduled
isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views:
- type: tasknotesMiniCalendar
name: Due
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: due
direction: ASC
dateProperty: due
- type: tasknotesMiniCalendar
name: Scheduled
order: []
dateProperty: scheduled
- type: tasknotesMiniCalendar
name: Created
dateProperty: file.ctime
- type: tasknotesMiniCalendar
name: Modified
dateProperty: file.mtime

View File

@ -0,0 +1,122 @@
formulas:
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: due && date(due) < today() && status != "done"
isDueToday: due && date(due).date() == today()
isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: timeEstimate && timeEstimate > 0
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: file.mtime.format("YYYY-MM")
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: due || scheduled
isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views:
- type: tasknotesKanban
name: Subtasks
filters:
and:
- file.hasTag("task")
- note.projects.contains(this.file.asLink())
groupBy:
property: status
direction: ASC
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
- type: tasknotesTaskList
name: Projects
filters:
and:
- list(this.projects).contains(file.asLink())
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
- type: tasknotesTaskList
name: Blocked By
filters:
and:
- file.hasTag("task")
- list(this.note.blockedBy).map(value.uid).contains(file.asLink())
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
- type: tasknotesKanban
name: Blocking
filters:
and:
- file.hasTag("task")
- list(note.blockedBy).map(value.uid).contains(this.file.asLink())
groupBy:
property: status
direction: ASC
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks

View File

@ -0,0 +1,213 @@
filters:
and:
- file.hasTag("task")
formulas:
priorityWeight: if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,999))))
daysUntilDue: if(due, ((number(date(due)) - number(today())) / 86400000).floor(), null)
daysUntilScheduled: if(scheduled, ((number(date(scheduled)) - number(today())) / 86400000).floor(), null)
daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
isOverdue: due && date(due) < today() && status != "done"
isDueToday: due && date(due).date() == today()
isDueThisWeek: due && date(due) >= today() && date(due) <= today() + "7d"
isScheduledToday: scheduled && date(scheduled).date() == today()
isRecurring: recurrence && !recurrence.isEmpty()
hasTimeEstimate: timeEstimate && timeEstimate > 0
timeRemaining: if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries, list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
efficiencyRatio: if(timeEstimate && timeEstimate > 0 && timeEntries, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / timeEstimate * 100).round(), null)
timeTrackedThisWeek: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
timeTrackedToday: if(timeEntries, list(timeEntries).filter(value.endTime && date(value.startTime).date() == today()).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
dueMonth: if(due, date(due).format("YYYY-MM"), "No due date")
dueWeek: if(due, date(due).format("YYYY-[W]WW"), "No due date")
scheduledMonth: if(scheduled, date(scheduled).format("YYYY-MM"), "Not scheduled")
scheduledWeek: if(scheduled, date(scheduled).format("YYYY-[W]WW"), "Not scheduled")
dueDateCategory: if(!due, "No due date", if(date(due) < today(), "Overdue", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due) <= today() + "7d", "This week", "Later")))))
timeEstimateCategory: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120, "Medium (30m-2h)", "Long (>2h)")))
ageCategory: if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today", if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week", if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month", "Older")))
createdMonth: file.ctime.format("YYYY-MM")
modifiedMonth: file.mtime.format("YYYY-MM")
priorityCategory: if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No priority"))))
projectCount: if(!projects || list(projects).length == 0, "No projects", if(list(projects).length == 1, "Single project", "Multiple projects"))
contextCount: if(!contexts || list(contexts).length == 0, "No contexts", if(list(contexts).length == 1, "Single context", "Multiple contexts"))
trackingStatus: if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started", if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
nextDate: if(due && scheduled, if(date(due) < date(scheduled), due, scheduled), if(due, due, scheduled))
daysUntilNext: if(due && scheduled, min(formula.daysUntilDue, formula.daysUntilScheduled), if(due, formula.daysUntilDue, formula.daysUntilScheduled))
hasDate: due || scheduled
isToday: (due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today())
isThisWeek: (due && date(due) >= today() && date(due) <= today() + "7d") || (scheduled && date(scheduled) >= today() && date(scheduled) <= today() + "7d")
nextDateCategory: if(!due && !scheduled, "No date", if((due && date(due) < today()) || (scheduled && date(scheduled) < today()), "Overdue/Past", if((due && date(due).date() == today()) || (scheduled && date(scheduled).date() == today()), "Today", if((due && date(due).date() == today() + "1d") || (scheduled && date(scheduled).date() == today() + "1d"), "Tomorrow", if((due && date(due) <= today() + "7d") || (scheduled && date(scheduled) <= today() + "7d"), "This week", "Later")))))
nextDateMonth: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-MM"), date(scheduled).format("YYYY-MM")), if(due, date(due).format("YYYY-MM"), if(scheduled, date(scheduled).format("YYYY-MM"), "No date")))
nextDateWeek: if(due && scheduled, if(date(due) < date(scheduled), date(due).format("YYYY-[W]WW"), date(scheduled).format("YYYY-[W]WW")), if(due, date(due).format("YYYY-[W]WW"), if(scheduled, date(scheduled).format("YYYY-[W]WW"), "No date")))
urgencyScore: if(!due && !scheduled, formula.priorityWeight, formula.priorityWeight + max(0, 10 - formula.daysUntilNext))
timeTrackedFormatted: if(timeEntries, if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60, (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) / 60).floor() + "h " + (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0) % 60).round() + "m", list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round() + "m"), "0m")
dueDateDisplay: if(!due, "", if(date(due).date() == today(), "Today", if(date(due).date() == today() + "1d", "Tomorrow", if(date(due).date() == today() - "1d", "Yesterday", if(date(due) < today(), formula.daysUntilDue * -1 + "d ago", if(date(due) <= today() + "7d", date(due).format("ddd"), date(due).format("MMM D")))))))
views:
- type: tasknotesTaskList
name: All Tasks
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: due
direction: ASC
- type: tasknotesTaskList
name: Not Blocked
filters:
and:
- or:
- and:
- recurrence.isEmpty()
- status != "done"
- and:
- recurrence
- '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- or:
- blockedBy.isEmpty()
- list(blockedBy).filter(file(value.uid).properties.status != "done").isEmpty()
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: Today
filters:
and:
- or:
- and:
- recurrence.isEmpty()
- status != "done"
- and:
- recurrence
- '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- or:
- date(due) == today()
- date(scheduled) == today()
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: Overdue
filters:
and:
- or:
- and:
- recurrence.isEmpty()
- status != "done"
- and:
- recurrence
- '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- date(due) < today()
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: This Week
filters:
and:
- or:
- and:
- recurrence.isEmpty()
- status != "done"
- and:
- recurrence
- '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- or:
- and:
- date(due) >= today()
- date(due) <= today() + "7 days"
- and:
- date(scheduled) >= today()
- date(scheduled) <= today() + "7 days"
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: formula.urgencyScore
direction: DESC
- type: tasknotesTaskList
name: Unscheduled
filters:
and:
- or:
- and:
- recurrence.isEmpty()
- status != "done"
- and:
- recurrence
- '!complete_instances.contains(today().format("yyyy-MM-dd"))'
- date(due).isEmpty()
- date(scheduled).isEmpty()
order:
- status
- priority
- due
- scheduled
- projects
- contexts
- file.tags
- blockedBy
- file.name
- recurrence
- complete_instances
- file.tasks
sort:
- property: status
direction: ASC

View File

@ -0,0 +1,3 @@
## M5077A
Programmer binnen gekregen, werkt via een klem op de chip.
- [x] M5077A programmer setup klaarzetten, documenteren en testen 📅 2026-02-27 ⏫

View File

@ -0,0 +1,6 @@
T5089A:
- LED script eindelijk goed werkend gekregen, datasheet van de sensor niet goed gelezen, bij het lezen van de laatste byte moet er een NACK gestuurd worden. Nu werkt het zoals verwacht.
- Condensators van 10uF over beide batterij uitgangen geplaatst, aantekening op schematic geplaatst.![[T5089A - 20260317 - Toevoeging 10uF condensators.jpg]]
- OCP mode op externe voeding werkend
M4912:
- Testrapporten geüpload van gevraagde borden vanuit Hittech

View File

@ -0,0 +1,5 @@
- M4511C: Certificaten endpoint getest en bugs met Martijn eruit gehaald, reeds bestaande certificaten waren niet goed geïmporteerd
- M4511C: Testscript herschreven met gebruik van nieuwe functielibrary
- M4912B: Met Rob implementatie voor Test-OK intranet API afgestemd
- M3582/3583: Melding van Thom bekeken en uit lopen zoeken waarom het importeren niet goed gaat, geen directe oorzaak gevonden, Thom gemeld dat hij ICT en mij bij volgende order moet seinen zodat we kunnen meekijken
- [x] Goedkoop kleuren filament voor open dag (Lay3rs)

View File

@ -0,0 +1,2 @@
- Mail gestuurd naar ICT met nieuwe software architectuur opzet voor teststations
- M4511C test herschreven met gebruik van certificaat intranet API

View File

View File

@ -0,0 +1,4 @@
- T4166F: Script geüpdatet zodat het correct het serienummer programmeert en controleert of hij correct het board type herkent, daarvoor moet eerst de testfirmware geprogrammeerd worden, anders staat de debug UART niet aan. VM daarnaast geüpdatet met de nieuwste TestTrack en getest met de huidige setup.
- TestTrack bug: Kan geen RMA orders gebruiken, hij weigert het serienummer; mail naar Test-OK gestuurd
- T5089A: Mail gestuurd over de 6 borden die net niet binnen de limieten vallen, hier willen we graag akkoord op. Daarnaast statistieken van de batch meegestuurd, ik wil deze bespreken om te kijken of we limieten moeten wijzigen. Titian droeg aan dat het verstandig is om te wachten tot de 2e batch zodat er meer componentvariatie bij zit, echter is dat volgens Tamara niet zo, aangezien de componenten voor 1000 stuks in een keer zijn besteld. Mogelijk toch wel zinvol omdat er ook andere variabelen zijn zoals een pick and place machine die net iets anders is ingesteld, of andere variabelen in het proces.
- Testrapport tool: Statistieken toegevoegd

View File

@ -0,0 +1,14 @@
---
title: T4997A Calibration
status: in-progress
priority: normal
timeEstimate: 300
dateCreated: 2026-02-24T11:12:21.149+01:00
dateModified: 2026-04-03T11:16:43.305+02:00
tags:
- task
due: 2026-04-06
scheduled: 2026-04-04
---
Add calibration for the Bluebird EVSE test setup

View File

@ -0,0 +1,65 @@
---
type: Test-OK
fixture_id: T4893B
fixture_rev: B
stage: bed_of_nails
customer:
- - <Customer>
product_series:
- M4893
supported_products:
- M4893A
active: false
introduced: <YYYY-MM-DD>
design_files: <altium/mech path>
---
# What this fixture is (12 lines)
Bed-of-nails rig used to test M1234 series; Rev A test definition.
# Coverage
### Validated (allowed to run)
- M1234A: ✅ <conditions/notes>
- M1234B: ✅ <conditions/notes>
- M1234C: ✅ <conditions/notes>
### Not validated (do NOT run without sign-off)
- M1234D: ⚠️ why / what differs / what needed to validate
# Operator procedure (operator-proof)
1) Placement/alignment:
2) Clamp:
3) Start test:
4) Pass/fail handling:
5) Common operator mistakes (max 3):
# Interfaces (high level)
- Power rails + limits:
- Programming/debug access:
- Special nets / straps:
# Maintenance
- Wear items / spares (probes, cables):
- Periodic checks (interval + what “good” looks like):
- Cleaning / handling notes:
# Known issues (repeat offenders only)
- Symptom → likely cause → fix → evidence (worklog link)
# Change policy (prevents drift)
- Small fix (≤1 day, no behavior/coverage change): TaskNote linked here
- Coverage/behavior change OR hardware change: new project `PRJ - T1234A - Rev<next>`
- After change: update `supported_products` + add evidence link
# Active work (TaskNotes)
- Use TaskNotes/Bases view filtered by:
- `fixture = [[T1234A]]` AND `status != done` AND `status != cancelled`
# Links
- Customer hub: [[<Customer>]]
- Product series: [[M1234]]
- TestTrack suite: `<path>`
- Design files: `<path>`
- Photos/attachments: `12_ATTACHMENTS/<...>`
- Projects:
- [[PRJ - T1234A - Build]]
- [[PRJ - T1234A - RevB]] (when it happens)

View File

@ -0,0 +1,69 @@
---
type: Test-OK
fixture_id: T1234A
fixture_rev: A
stage: bed_of_nails
customer:
- - <Customer>
product_series:
- - M1234
supported_products:
- M1234A
- M1234B
- M1234C
active: false
introduced: <YYYY-MM-DD>
design_files: <altium/mech path>
---
# T1234A — BoN fixture for M1234 (Rev A)
## What this fixture is (12 lines)
Bed-of-nails rig used to test M1234 series; Rev A test definition.
## Coverage
### Validated (allowed to run)
- M1234A: ✅ <conditions/notes>
- M1234B: ✅ <conditions/notes>
- M1234C: ✅ <conditions/notes>
### Not validated (do NOT run without sign-off)
- M1234D: ⚠️ why / what differs / what needed to validate
## Operator procedure (operator-proof)
1) Placement/alignment:
2) Clamp:
3) Start test:
4) Pass/fail handling:
5) Common operator mistakes (max 3):
## Interfaces (high level)
- Power rails + limits:
- Programming/debug access:
- Special nets / straps:
## Maintenance
- Wear items / spares (probes, cables):
- Periodic checks (interval + what “good” looks like):
- Cleaning / handling notes:
## Known issues (repeat offenders only)
- Symptom → likely cause → fix → evidence (worklog link)
## Change policy (prevents drift)
- Small fix (≤1 day, no behavior/coverage change): TaskNote linked here
- Coverage/behavior change OR hardware change: new project `PRJ - T1234A - Rev<next>`
- After change: update `supported_products` + add evidence link
## Active work (TaskNotes)
- Use TaskNotes/Bases view filtered by:
- `fixture = [[T1234A]]` AND `status != done` AND `status != cancelled`
## Links
- Customer hub: [[<Customer>]]
- Product series: [[M1234]]
- TestTrack suite: `<path>`
- Design files: `<path>`
- Photos/attachments: `12_ATTACHMENTS/<...>`
- Projects:
- [[PRJ - T1234A - Build]]
- [[PRJ - T1234A - RevB]] (when it happens)

View File

@ -0,0 +1,16 @@
---
type: Test-OK
fixture_id: T5089A
fixture_rev: A
customer:
- Holmatro
product_series:
- M5089A
supported_products:
- M5089A
active: false
introduced: <YYYY-MM-DD>
design_files: <altium/mech path>
---
# T5089A — Holmatro DDCP

View File

@ -0,0 +1,18 @@
---
actief: true
status: lopend
testadapter:
- T4912B
- T5021A
- T5022A
- T5037A
type: project
productieorder:
klant: Hittech
---
# Beschrijving
De resultaten van de Hittech borden moeten geüpload worden naar de FTP server van Hittech. De resultaten van de gehele order moet in een excel file komen.
# Taken
- [ ] Tool maken voor opstellen Hittech testrapport #wachten
# Log
- 2026-04-02: Mail gestuurd naar Jan-Willem met de vraag of ze het testrapport nu in een excel of CSV willen, en per serienummer of per batch. Daarnaast gevraagd voor de reporting requirements voor de photosensor borden.

View File

@ -0,0 +1,25 @@
---
actief: true
status: lopend
testadapter:
- T4939C
type: project
productieorder:
klant: Holmatro
---
# Omschrijving
Holmatro heeft nieuwe firmware voor de WLC50. Stefan wil Dinsdagmiddag 7 April langskomen voor:
- Reparaties R4964 (BPR25-1040) 22 stuks
- Testrun nieuwe WLC50
- Eindtest voor testen bluetooth verbinden updaten zodat deze de juiste naam weergeeft
## Reparatie
Voor het herprogrammeren van de afgebouwde WLC50s betekent dit dat de volgende stappen moeten worden ondernomen :
- WLC50 moet worden opengeschroefd (alleen onderkap eraf).
- CPU moet worden geherprogrammeerd met validatie firmware die geen communicatie heeft met het modem. Dit via JTAG connector 1 (of bluetooth indien mogelijk).
- Modem firmware moet worden geherprogrammeerd via JTAG connector 2 met V0.1.0
- Extern flash geheugen moet worden geleegd via JTAG connector 1.
- CPU moet worden geherprogrammeerd met V7.4.5 via JTAG connector 1 (of bluetooth indien mogelijk).
- CPU moet oude keyvault terug krijgen via JTAG connector 1 (tenzij bluetooth herprogrammeren mogelijk is).
# Taken
- [x] 📅 2026-04-03 Huidige testsetup T4939C controleren
- [x] Programmeersetup met pogo ping voorbereiden 📅 2026-04-07

View File

@ -0,0 +1,15 @@
---
actief: true
status: lopend
testadapter:
type: project
productieorder:
---
# Omschrijving
Bij niet alle RMA orders (R-nummers) werkt het importeren van de Test-OK serienummers, dit is wel gewenst aangezien operators nu handmatig de oude order moeten openzetten.
Daarnaast kan dan bij de resultaten duidelijk verschil gemaakt worden tussen de resultaten tijdens de productie en de testresultaten bij de RMA, en de oude productieorder kan geblokkeerd worden voor verdere schrijfacties.
Voorbeeld BPR:
- BPR26-0191
# Taken
- [ ] API toevoegen #wachten

View File

@ -0,0 +1,11 @@
---
actief: false
testadapter:
- T4166F
type: project
productieorder:
---
# Omschrijving
Schleiffenbauer wil minder testen uitvoeren, echter is dit de vorige keer niet goed gegaan omdat er alleen productiefirmware is geprogrammeerd. Test moet nu gewijzigd worden zodat ook het serienummer geprogrammeerd wordt
## Taken
- [x] 📅 2026-04-07 T4166F Update testscript controleren

View File

@ -0,0 +1,18 @@
---
actief: true
status: lopend
testadapter:
- T4912B
type: project
klant: Hittech
---
# Beschrijving
De test slaat momenteel niet de resultaten op in de test-ok database en schrijft geen status weg naar FLX, daarnaast moet ook automatisch een rapport geüpload worden.
De interface moet ook intuïtiever en beter gemaakt worden.
De weerstandsmetingen lijken daarnaast niet altijd even betrouwbaar, dit moet anders aangepakt worden.
# Taken
- [ ] Testresultaten via Test-OK API opslaan #wachten
- [ ] Testtool herschrijven met OpenHTF en Web UI
- [ ] Weerstandsmeting herzien
# Log

View File

@ -0,0 +1,22 @@
---
actief: true
status: lopend
testadapter:
- T5089A
type: project
productieorder: BPR26-0064
klant: Holmatro
---
## Taken
- [x] Kap voor LEDs maken #wachten
- [x] Testscript voor LEDs maken ✅ 2026-03-16
- [x] OCP externe voeding testen ✅ 2026-03-16
- [x] Condensator op battery outputs plaatsen ✅ 2026-03-16
- [x] Kap testadapter plaatsen met label #wachten
- [x] Bevestiging printen voor HDQ adapters en programmer ⏳ 2026-04-07 #wachten
- [x] Testen met correcte en incorrecte firmware
- [ ] Documentatie maken
- [x] Foto wijziging 10uF condensators
- [x] Python code naar Holmatro sturen
- [x] Nieuwe programmer plaatsen

18
08_DOMAINS/Test-OK.md Normal file
View File

@ -0,0 +1,18 @@
# Revisiebeheer
- Test scripts: eigen releases (hash/gitlab releases?)
- Product: per M-nummer (+rev) wordt verwezen naar een test script
- BPR/SN: Moet dan eigenlijk opslaan welke test versie gebruikt is
# Bugs
- CONFIG_LIMITS: Ik wil graag een limiet in meerdere scripts gebruiken, echter gaat dit fout wanneer niet alle scripts opnieuw wordt gedraaid vanwege gedeeltelijk hertesten. Een betere oplossing zou zijn het defineren van limieten in een soort TSpreamble.
# Procedure
Reporting:
- Vooral duidelijk afspreken hoe data gerapporteerd moet worden, met technische details en voorbeelden.
- Duidelijk afspreken welke data opgeslagen moet worden
# Testing
DB_TESTOK_HOST=192.168.42.167
DB_TESTOK_DATABASE=testok
DB_TESTOK_USERNAME=root
DB_TESTOK_PASSWORD="|m-Ys2thoICiddWQ@3#M"

View File

@ -0,0 +1,69 @@
---
type: Test-OK
fixture_id: T1234A
fixture_rev: A
stage: bed_of_nails
customer:
- - <Customer>
product_series:
- - M1234
supported_products:
- M1234A
- M1234B
- M1234C
active: false
introduced: <YYYY-MM-DD>
design_files: <altium/mech path>
---
# T1234A — BoN fixture for M1234 (Rev A)
## What this fixture is (12 lines)
Bed-of-nails rig used to test M1234 series; Rev A test definition.
## Coverage
### Validated (allowed to run)
- M1234A: ✅ <conditions/notes>
- M1234B: ✅ <conditions/notes>
- M1234C: ✅ <conditions/notes>
### Not validated (do NOT run without sign-off)
- M1234D: ⚠️ why / what differs / what needed to validate
## Operator procedure (operator-proof)
1) Placement/alignment:
2) Clamp:
3) Start test:
4) Pass/fail handling:
5) Common operator mistakes (max 3):
## Interfaces (high level)
- Power rails + limits:
- Programming/debug access:
- Special nets / straps:
## Maintenance
- Wear items / spares (probes, cables):
- Periodic checks (interval + what “good” looks like):
- Cleaning / handling notes:
## Known issues (repeat offenders only)
- Symptom → likely cause → fix → evidence (worklog link)
## Change policy (prevents drift)
- Small fix (≤1 day, no behavior/coverage change): TaskNote linked here
- Coverage/behavior change OR hardware change: new project `PRJ - T1234A - Rev<next>`
- After change: update `supported_products` + add evidence link
## Active work (TaskNotes)
- Use TaskNotes/Bases view filtered by:
- `fixture = [[T1234A]]` AND `status != done` AND `status != cancelled`
## Links
- Customer hub: [[<Customer>]]
- Product series: [[M1234]]
- TestTrack suite: `<path>`
- Design files: `<path>`
- Photos/attachments: `12_ATTACHMENTS/<...>`
- Projects:
- [[PRJ - T1234A - Build]]
- [[PRJ - T1234A - RevB]] (when it happens)

View File

@ -0,0 +1,47 @@
---
type: product
product_id: M1234
customer:
- - <Customer>
active: false
variants:
- M1234A
- M1234B
- M1234C
primary_fixture:
- - T1234A
---
# M1234 — Product series (Customer: <Customer>)
## Definition of “good” (pass intent)
- <15 bullets only; what you actually guarantee>
## Variant differences (only what impacts test)
- M1234B: <difference that matters to test>
- M1234C: <difference that matters to test>
## Test ecosystem
### Fixtures
- BoN: [[T1234A]]
- (add more fixtures/stages as needed)
### Tooling / suites
- TestTrack suite: `<path>`
- Repo(s): `<path>`
## Top failure modes (max 5)
- Failure → likely cause → first check → evidence/worklog link
## Change control
- Small limit/teststep change: TaskNote + link MR/commit
- New variant support or major coverage change: new project `07_PROJECTS/PRJ - M1234 - <Change>.md`
## Active work (TaskNotes)
- Use TaskNotes/Bases view filtered by:
- `product = [[M1234]]` AND `status != done` AND `status != cancelled`
## Links
- Customer hub: [[<Customer>]]
- Worklog (key incidents): [[...]]
- Reference: [[08_REFERENCE/Products/<...>]]

View File

@ -0,0 +1,18 @@
---
type: project
status: active
customer: ""
area: ""
---
## Goal
## Definition of Done
## Next actions
## Open questions
## Decisions
## Links / Artifacts

View File

@ -0,0 +1 @@
- [ ]<verb> <thing> (<proof/result>) @<place/tool> #context/<debug|fixture|testtrack|ci|admin> 📅 <% tp.date.now("YYYY-MM-DD") %> 🔗 [[<project>]]

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 KiB

View File

@ -0,0 +1,36 @@
# Voorbereiding
Optimalisatie teststappen:
- TP04: Niet nodig. Wanneer het programmeren gelukt is binnen een testsessie zal Test-OK deze zelf overslaan, daarnaast wil je de operator de mogelijk geven het bord opnieuw te programmeren, dit kan niet bij de huidige test.
- TP03: Niet nodig, operator selecteert MOLD/PCA voor het starten van de test. Test faalt indien dit niet klopt
- Sommige testen hebben een marge van 1%, dit lijkt mij overdreven strak; met klant overleggen
- Voeding wordt op 4 ingangsspanningen gecontroleerd, kan mogelijk een minder: min, max, nominaal; met klant overleggen.
Vragen/opmerkingen:
- Is de SN van de PCA hetzelfde als bij de MOLD?
- Hardware revision wordt niet gecontroleerd, deze wordt ingesteld door middel van weerstanden op de PCB
- HDQ bus wordt niet goed gecontroleerd
- (Missende controle op knop motoraansturing)
Van 3T nodig:
- STEP 3D, zowel PCA als MOLD
- Elektrisch schema laatste versie
- Firmware: bootloader (JTAG), test programma (UART), hoofdprogramma (UART)
- Elektrisch schema testadapter
# Aantekeningen
De door Tariq gestuurde statistieken zijn niet duidelijk genoeg, we kunnen niet goed herleiden waar de meeste winst valt te behalen. Tariq gaat FPY statistieken opmaken.
# Beslissingen
# Acties
- [x] Overzicht maken wat we hebben en wat we nog nodig hebben, onderscheid maken tussen gewenst en vereist ⏫ 2026-02-27 📅 2026-02-27 ✅ 2026-02-27
# Referenties
- [[T4893B]]

View File

@ -0,0 +1,13 @@
# Nu in gebruik
- `/operations/track-through`
- `/employees/{empId}`
- `/isah/serial-nrs/${SerialNr}?with[]=productionHeader`
# Interessant
- Machine maintenance: test weigeren uit te voeren als testkast niet op tijd gecontroleerd is.
- Validatie mal: resultaat automatisch publiceren naar intranet
- Call registrations: Openstaande meldingen voor M-nummer bij test laten zien (alleen als deze op de testafdeling staat)
# Vragen
- Wat zijn ISAH call actions/registrations? Zijn dit de meldingen? -> ja
- De track-through endpoints zijn unauthenticated? Geen token nodig? -> klopt

View File

@ -0,0 +1,15 @@
Meeting met: Tomas Lindqvist
# Vragen
- Idealiter wil ik per testrun een rapport uploaden
- Dan moet er een timestamp aan de filename toegevoegd worden
- Per serienummer uploaden
- CSV
- Ik probeer nu elke keer te verzamelen welke testdata geüpload moet worden, het lijkt me makkelijker als er voorbeelden aangeleverd worden.
- Hoe staat het met het aanpassen van 160-sheets van de photosensor/diagnostic boards?
- Het is enigszins onprettig dat we alleen maar preliminary data hebben van de 160-sheet
# Antwoorden
- wk 19/20: share new tdp
- Let the wrong points in the 160-sheets know
- BID in ASML portal can create with mass upload from excel sheet
- Statistics reports Diagnostics opsturen -> target waarden van ASML kunnen fout zijn

View File

@ -0,0 +1,28 @@
Doel: Het bespreken van de teststatistieken van de eerste batch en het aanpassen/aanscherpen van testlimieten.
Limieten verscherpen:
- IDLE_CURRENT: max 100mA, korte delay (500ms) toevoegen
- DDCP_TEMPERATURE: min 15, target 23, max 40
- LED_TEMPERATURE: min 22, target 24, max 26
- MOTOR_TEMPERATURE: min 24, target 27, max 32
- LED_GREEN_RATIO: min 0.8, target 0.9
- LED_RED_RATIO: min 0.8, target 0.85
- LED_BLUE_RATIO: min 0.8
- POWER_LED_BLUE_INTENSITY: min 12000, target 14500, max 18000
- POWER_LED_GREEN_INTENSITY: min 25000, target 30000
- POWER_LED_RED_INTENSITY: min 14000, target 17000
- BAT1_RTIM: min naar 35?
- 5V_OTC: al aangepast
- VBOOST: al aangepast
- VBUS_OTC: al aangepast
- ESC_RTIM: min 17ms
- VBUS: min 23400mV, max 23,9V, target 23600mV
- LED Intensiteiten strakker zetten om overcurrent te voorkomen
- K3 K4 contactweerstand nameten
- BAT_VTOP: max 24000mV, min 22800mV
- OTC: settling time omhoog naar 1000ms
- OTC_CURRENT: max 35, min 20mA -> mag niet te hoog zijn vanwege limieten in de lader!
- VBAT_ON: min 23,5 max 24,2
- ESC_VSTEADY: min 23400, max 23800mV
- ESC_VTOP: min 21500mV
- IDLE_CURRENT: stabilisatietijd verhogen naar 3000ms, limiet max 60mA, bij falen terugkoppelen

View File

@ -0,0 +1,37 @@
---
type: phonecall
joined:
- Marco van Zijl
- "[[Frank Hobelman]]"
date: 2026-05-07
---
# Doel
[[3T]] moet een indicatie gaan opstellen voor hoeveel uren support zij gaan leveren voor de nieuwe testontwikkeling van de M4893A testadapter door Matas.
# Pre-meeting notes
- Holmatro heeft al akkoord gegeven voor het laten maken van een Test-OK test door Matas
- De PCB is ontworpen door [[3T]]
- Matas heeft het 3T testplan, echter staan de digitale interfaces daar niet beschreven
- Nog benodigde documenten:
- Beschrijving digitale interfaces
- Elektrisch schema ESC-P
- Firmware: Bootloader, testfirmware, productiefirmware
- STEP 3D: PCA+MOLD
- Design proces:
- Matas: opstellen eerste versie testspecificatie aan de hand van het 3T testplan
- 3T: vragen beantwoorden over werking hardware en firmware
- 3T: evaluatie testspecificatie
- Matas: feedback verwerken in nieuwe testspecificatie
- 3T: opnieuw evaluatie testspecificatie
- Matas: ontwerpen testadapter/pennenbed
- 3T: evaluatie testadapter/pennenbed
- Matas: bouwen testadapter en testscripting maken
- 3T: ondersteunen bij debuggen testadapter
# Notities
- Frank is volgende week afwezig
- Half jaar geleden operatie gehad, nu langzaam weer aan het opschalen, zit nu op 3 dagen per week werken
- Afspraak gepland voor donderdag 21 mei 13:00
- Meeting request versturen
- Agenda meesturen
- Frank is projectleider, niet direct technisch, moet misschien mensen inschakelen bij de meeting die de technische kennis wel hebben

0
Companies/3T.md Normal file
View File

View File

@ -0,0 +1,7 @@
---
company: 3T
function: Project Manager
email: frank.hobelman@kendrion.com
phone: 088-3343321
mobile: 06-30266909
---