Compare commits

..

No commits in common. "main" and "0.1.1" have entirely different histories.
main ... 0.1.1

17 changed files with 956 additions and 10196 deletions

View file

@ -1,50 +0,0 @@
name: Release
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+'
permissions:
contents: write
id-token: write
attestations: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build plugin
run: npm run build
- name: Attest build provenance
uses: actions/attest-build-provenance@v4
with:
subject-path: |
main.js
manifest.json
styles.css
- name: Create or update release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.ref_name }}
run: |
if gh release view "$TAG" >/dev/null 2>&1; then
gh release upload "$TAG" main.js manifest.json styles.css --clobber
else
gh release create "$TAG" \
--title "$TAG" \
--generate-notes \
main.js manifest.json styles.css
fi

1
.gitignore vendored
View file

@ -4,4 +4,3 @@ node_modules/
data.json
.env
.env.local
launch/

View file

@ -1,50 +0,0 @@
# Contributing to Notekeeper
Thanks for considering a contribution. This is a small project and the bar to merge is intentionally low — useful is more important than perfect.
## Project shape
- **`main.ts`** — the entire plugin source, single file by design. Includes the view, modals, settings tab, and helpers.
- **`styles.css`** — every visual style. Light-theme overrides live in a clearly-marked block at the bottom.
- **`manifest.json` / `versions.json`** — the Obsidian plugin manifest and per-version minimum-app-version map.
- **`main.js`** — esbuild output. Committed so manual installs work without a build step. Rebuild it before opening a PR.
## Build and dev
```bash
npm install
npm run dev # watch + rebuild on save
npm run build # type-check + production bundle
```
Local lint (matches the directory's automated scan, modulo the rules disabled in `eslint.config.mjs`):
```bash
npx eslint main.ts
```
## Opening a PR
- Make sure `npm run build` succeeds and `main.js` is up to date in the commit.
- Run `npx eslint main.ts` — should be clean.
- Test the change in a real vault. The `Documents/Obsidian Vault` pattern works, or any vault you don't mind experimenting on; just symlink or copy `main.js`, `manifest.json`, and `styles.css` into `<vault>/.obsidian/plugins/notekeeper/` and reload.
- Keep the diff narrow. If you find adjacent things to clean up, file a separate issue or PR.
## Filing an issue
Open one [on GitHub](https://github.com/PhilemonChiro/obsidian-notekeeper/issues). Helpful to include:
- Obsidian version and platform (desktop/mobile, OS)
- Notekeeper version (from settings)
- A short repro — ideally the smallest sequence of clicks that triggers the behaviour
- A screenshot or short clip if the bug is visual
Feature requests are very welcome. Even one-line ones.
## Releases
Releases ship through `.github/workflows/release.yml` on every `X.Y.Z` tag push. The workflow builds, signs `main.js` / `manifest.json` / `styles.css` with [GitHub build provenance attestation](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations), and either creates the release or uploads to an existing tag.
## Licence
Notekeeper is MIT. Contributions are accepted under the same licence.

View file

@ -1,16 +1,12 @@
# Notekeeper
A Google Keepstyle wall of sticky notes for your Obsidian vault. Browse, capture, pin, color, and curate your notes on a sticky-note wall — or switch to a denser card grid when you need more density.
A Google Keepstyle masonry of cards for your Obsidian vault. Browse, capture, pin, color, archive, and filter your notes from one screen — without leaving the grid.
![Wall view of notes as sticky notes with rotation, color tags, and pinned items at the top](docs/grid.png)
![Grid view of notes laid out as a masonry of cards, with PINNED and OTHERS sections, varied colors, tags, and inline lists](docs/grid.png)
Capture a note with a title, body, optional pin, and color — saved to the wall in one click:
Click any card to open a full markdown-rendered preview with one-click pin / edit / color / archive / open-in-tab actions:
![Capture box expanded with title, body, pin and color buttons, and a primary Save action](docs/capture.png)
Click any sticky for a full markdown-rendered preview that inherits the note's color:
![Note preview modal in a colored note showing live markdown rendering and inline action buttons](docs/modal.png)
![Note preview modal showing a Python code snippet with syntax highlighting](docs/modal.png)
## Features
@ -113,20 +109,6 @@ Open Obsidian → Settings → Community plugins → Browse, search "Notekeeper"
2. Copy them into `<vault>/.obsidian/plugins/notekeeper/`
3. Reload Obsidian and enable Notekeeper in Settings → Community plugins
## Development
Source lives in `main.ts`. The committed `main.js` is what Obsidian loads at runtime; rebuild it with esbuild after editing `main.ts`:
```bash
npm install
npm run build # type-check + bundle to main.js
npm run dev # rebuild on save
```
`main.ts`, `manifest.json`, and `styles.css` are the authored sources. The `main.js` artifact is produced by the build and committed alongside (so manual installs work without a build step).
PRs welcome. The codebase is single-file by design — keep it that way unless the addition is large enough to warrant its own module.
## License
MIT — see [LICENSE](./LICENSE).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 410 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 373 KiB

View file

@ -1,40 +0,0 @@
import esbuild from "esbuild";
import process from "process";
import { builtinModules } from "node:module";
const prod = process.argv[2] === "production";
const ctx = await esbuild.context({
entryPoints: ["main.ts"],
bundle: true,
external: [
"obsidian",
"electron",
"@codemirror/autocomplete",
"@codemirror/collab",
"@codemirror/commands",
"@codemirror/language",
"@codemirror/lint",
"@codemirror/search",
"@codemirror/state",
"@codemirror/view",
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
...builtinModules,
],
format: "cjs",
target: "es2020",
logLevel: "info",
sourcemap: prod ? false : "inline",
treeShaking: true,
outfile: "main.js",
minify: false,
});
if (prod) {
await ctx.rebuild();
process.exit(0);
} else {
await ctx.watch();
}

View file

@ -1,34 +0,0 @@
import obsidianmd from 'eslint-plugin-obsidianmd';
import tsParser from '@typescript-eslint/parser';
const plugin = obsidianmd.default || obsidianmd;
export default [
...plugin.configs.recommended,
{
files: ['main.ts'],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
project: './tsconfig.json',
tsconfigRootDir: import.meta.dirname,
},
},
},
{
ignores: ['main.js', 'node_modules/**', 'docs/**', 'launch/**'],
},
{
files: ['main.ts'],
rules: {
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'@typescript-eslint/require-await': 'error',
},
},
];

2092
main.js

File diff suppressed because it is too large Load diff

2746
main.ts

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
{
"id": "notekeeper",
"name": "Notekeeper",
"version": "0.2.5",
"minAppVersion": "1.7.2",
"version": "0.1.1",
"minAppVersion": "1.4.0",
"description": "Browse your vault as a Google Keep-style masonry of cards. Quick capture, pin, color, archive, and filter notes by labels — sticky-note style.",
"author": "Philemon Chiro",
"authorUrl": "https://github.com/PhilemonChiro",

5099
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,25 +1,20 @@
{
"name": "obsidian-notekeeper",
"version": "0.2.5",
"version": "0.1.1",
"description": "Browse your vault as a Google Keep-style masonry of cards. Quick capture, pin, color, archive, and filter notes by labels.",
"author": "Philemon Chiro",
"license": "MIT",
"private": true,
"scripts": {
"dev": "node esbuild.config.mjs",
"build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production"
"build": "node esbuild.config.mjs production"
},
"devDependencies": {
"@types/node": "^20",
"@typescript-eslint/parser": "^8.59.1",
"builtin-modules": "^3.3.0",
"esbuild": "^0.21.0",
"eslint": "^9.39.4",
"eslint-plugin-obsidianmd": "^0.2.9",
"obsidian": "latest",
"tslib": "^2.6.0",
"typescript": "^5.4.0"
},
"pnpm": {
"onlyBuiltDependencies": ["esbuild"]
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,21 +0,0 @@
{
"compilerOptions": {
"baseUrl": ".",
"inlineSourceMap": true,
"inlineSources": true,
"module": "ESNext",
"target": "ES2020",
"allowJs": true,
"noImplicitAny": false,
"moduleResolution": "node",
"importHelpers": true,
"isolatedModules": true,
"strictNullChecks": false,
"lib": ["DOM", "ES2020"],
"esModuleInterop": true,
"skipLibCheck": true,
"downlevelIteration": true
},
"include": ["**/*.ts"],
"exclude": ["node_modules", "main.js"]
}

View file

@ -1,11 +1,4 @@
{
"0.1.0": "1.4.0",
"0.1.1": "1.4.0",
"0.1.2": "1.7.2",
"0.2.0": "1.7.2",
"0.2.1": "1.7.2",
"0.2.2": "1.7.2",
"0.2.3": "1.7.2",
"0.2.4": "1.7.2",
"0.2.5": "1.7.2"
"0.1.1": "1.4.0"
}