axis-crm 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -0
  3. package/cli/index.js +106 -0
  4. package/package.json +36 -0
  5. package/template/CLAUDE.md +38 -0
  6. package/template/CRM Dashboard.md +53 -0
  7. package/template/automations/README.md +62 -0
  8. package/template/automations/client-research.json +383 -0
  9. package/template/automations/fireflies-to-crm.json +306 -0
  10. package/template/clients/acme-consulting/README.md +43 -0
  11. package/template/clients/acme-consulting/communication/2026-03-01-cena-dohodnuta.md +24 -0
  12. package/template/clients/acme-consulting/contacts/jana-novakova.md +17 -0
  13. package/template/clients/acme-consulting/contacts/tomas-dvorak.md +16 -0
  14. package/template/clients/acme-consulting/files/faktury/.gitkeep +0 -0
  15. package/template/clients/acme-consulting/files/nabidky/.gitkeep +0 -0
  16. package/template/clients/acme-consulting/files/smlouvy/.gitkeep +0 -0
  17. package/template/clients/acme-consulting/meetings/2026-02-10-kickoff.md +25 -0
  18. package/template/clients/acme-consulting/meetings/2026-03-15-progress-review.md +25 -0
  19. package/template/clients/acme-consulting/projects/web-redesign/README.md +53 -0
  20. package/template/clients/acme-consulting/projects/web-redesign/deliverables/.gitkeep +0 -0
  21. package/template/clients/acme-consulting/projects/web-redesign/notes/.gitkeep +0 -0
  22. package/template/clients/acme-consulting/projects/web-redesign/zadani.md +33 -0
  23. package/template/dashboards/client-overview.md +25 -0
  24. package/template/dashboards/hot-leads.md +23 -0
  25. package/template/dashboards/pipeline.md +52 -0
  26. package/template/leads/bytovy-architekt-kovar.md +22 -0
  27. package/template/leads/green-energy-as.md +22 -0
  28. package/template/leads/nova-digital-sro.md +22 -0
  29. package/template/leads/restaurace-u-zlateho-lva.md +23 -0
  30. package/template/leads/techpro-solutions.md +23 -0
  31. package/template/rules/fields.md +45 -0
  32. package/template/rules/lifecycle.md +51 -0
  33. package/template/rules/scoring.md +43 -0
  34. package/template/rules/structure.md +82 -0
  35. package/template/scripts/convert-to-client.sh +133 -0
  36. package/template/scripts/new-lead.sh +68 -0
  37. package/template/scripts/new-project.sh +69 -0
  38. package/template/scripts/validate.sh +149 -0
  39. package/template/templates/client/README.md +31 -0
  40. package/template/templates/client/communication/.gitkeep +0 -0
  41. package/template/templates/client/contacts/.gitkeep +0 -0
  42. package/template/templates/client/files/.gitkeep +0 -0
  43. package/template/templates/client/files/faktury/.gitkeep +0 -0
  44. package/template/templates/client/files/nabidky/.gitkeep +0 -0
  45. package/template/templates/client/files/smlouvy/.gitkeep +0 -0
  46. package/template/templates/client/meetings/.gitkeep +0 -0
  47. package/template/templates/client/projects/.gitkeep +0 -0
  48. package/template/templates/communication.md +17 -0
  49. package/template/templates/contact.md +14 -0
  50. package/template/templates/lead.md +20 -0
  51. package/template/templates/meeting.md +17 -0
  52. package/template/templates/project/README.md +34 -0
  53. package/template/templates/project/deliverables/.gitkeep +0 -0
  54. package/template/templates/project/notes/.gitkeep +0 -0
  55. package/template/templates/project/zadani.md +19 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Patrik Schick
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # Axis CRM
2
+
3
+ A git-based CRM for freelancers and small teams.
4
+
5
+ Axis CRM stores all your client data as Markdown files with YAML frontmatter. It works in any text editor, is optimized for [Obsidian](https://obsidian.md) with the Dataview plugin, and supports automation through n8n workflows. All data is versioned in git — no database, no vendor lock-in.
6
+
7
+ ## Why
8
+
9
+ Most CRMs are built for sales teams of 50+. If you're a freelancer or a small agency, you don't need Salesforce — you need a system that's fast, local, and doesn't cost $50/month per seat.
10
+
11
+ Axis CRM gives you:
12
+ - **Full ownership** — your data lives in a git repo, not someone else's server
13
+ - **Version history** — every change is a commit, every deleted lead is recoverable
14
+ - **Markdown-native** — works with Obsidian, VS Code, Vim, or any editor
15
+ - **Automation-ready** — n8n workflows for meeting transcripts and client research
16
+ - **AI-friendly** — CLAUDE.md included, works with Claude Code and other AI tools out of the box
17
+
18
+ ## Structure
19
+
20
+ ```
21
+ axis-crm/
22
+ clients/ # each client = a folder
23
+ acme-consulting/ # demo client
24
+ README.md # client overview (status, contacts, rates)
25
+ contacts/ # people at the company
26
+ meetings/ # meeting notes (auto-filled from Fireflies)
27
+ projects/ # project folders (scope, briefs, deliverables)
28
+ communication/ # key decisions and agreements
29
+ files/ # contracts, proposals, invoices
30
+ leads/ # each lead = a single .md file
31
+ templates/ # templates for all record types
32
+ rules/ # lifecycle, scoring, field definitions
33
+ scripts/ # shell scripts for common operations
34
+ automations/ # n8n workflow exports (JSON)
35
+ dashboards/ # Obsidian Dataview dashboards
36
+ CRM Dashboard.md # main dashboard
37
+ ```
38
+
39
+ ## Quick Start
40
+
41
+ ```bash
42
+ npx axis-crm init
43
+ cd crm
44
+ git init && git add -A && git commit -m "init: axis-crm"
45
+ ```
46
+
47
+ That's it. You have a working CRM.
48
+
49
+ Open in [Obsidian](https://obsidian.md) (install [Dataview](https://github.com/blacksmithgu/obsidian-dataview) plugin) and open `CRM Dashboard.md` to see your pipeline.
50
+
51
+ Create your first lead:
52
+ ```bash
53
+ ./scripts/new-lead.sh "Acme Corp"
54
+ ```
55
+
56
+ Or clone manually:
57
+ ```bash
58
+ git clone https://github.com/PatrikSchick-AI/axis-crm.git
59
+ ```
60
+
61
+ ## Scripts
62
+
63
+ | Script | Description | Usage |
64
+ | --- | --- | --- |
65
+ | `new-lead.sh` | Create a new lead from template | `./scripts/new-lead.sh "Company Name"` |
66
+ | `convert-to-client.sh` | Convert a lead to a full client folder | `./scripts/convert-to-client.sh company-slug` |
67
+ | `new-project.sh` | Create a new project for a client | `./scripts/new-project.sh client-slug "Project Name"` |
68
+ | `validate.sh` | Validate all leads and clients | `./scripts/validate.sh` |
69
+
70
+ All scripts support `--help` or will prompt interactively when run without flags.
71
+
72
+ ## Lead Lifecycle
73
+
74
+ ```
75
+ new → enriched → qualified → contacted → responded → opportunity → client
76
+ ```
77
+
78
+ Each stage has required fields and a score threshold. Leads are scored 0-100 based on data completeness, industry fit, and engagement. Details in `rules/lifecycle.md` and `rules/scoring.md`.
79
+
80
+ ## Automations
81
+
82
+ Two n8n workflows are included as importable JSON:
83
+
84
+ - **Meeting to CRM** — Fireflies webhook triggers automatic meeting notes saved to the client folder. Uses AI (Claude) to identify the client, extract action items, and generate a summary. Supports upsert (won't fail on duplicate meetings).
85
+
86
+ - **Client Research** — Send a company name + URL, get back a full client profile with web scrape, AI analysis, and ARES verification (Czech business registry). Calculates a lead score automatically.
87
+
88
+ Setup instructions in [`automations/README.md`](automations/README.md).
89
+
90
+ ## Dashboards
91
+
92
+ Requires Obsidian + [Dataview plugin](https://github.com/blacksmithgu/obsidian-dataview).
93
+
94
+ | Dashboard | Shows |
95
+ | --- | --- |
96
+ | `CRM Dashboard.md` | Active clients, hot leads, pipeline summary, recent meetings |
97
+ | `dashboards/pipeline.md` | Leads grouped by lifecycle stage |
98
+ | `dashboards/hot-leads.md` | Leads with score > 60 |
99
+ | `dashboards/client-overview.md` | All clients with status and priority |
100
+
101
+ ## Client Rates
102
+
103
+ Each client can track billing rates in their frontmatter:
104
+
105
+ ```yaml
106
+ hourly_rate: 100
107
+ manday_rate: 800
108
+ currency: 'USD'
109
+ ```
110
+
111
+ This makes it easy to query across clients with Dataview (e.g., "show me all clients sorted by hourly rate").
112
+
113
+ ## Rules
114
+
115
+ - A lead is a file. A client is a folder. Conversion is one-way.
116
+ - Lead scoring: 0-100, thresholds define when a lead is ready for outreach.
117
+ - All records use YAML frontmatter. Required fields depend on the lifecycle stage.
118
+ - Details: [`rules/`](rules/)
119
+
120
+ ## License
121
+
122
+ MIT
package/cli/index.js ADDED
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+
6
+ const TEMPLATE_DIR = path.join(__dirname, "..", "template");
7
+ const args = process.argv.slice(2);
8
+ const command = args[0] || "init";
9
+
10
+ const HELP = `
11
+ axis-crm — Git-based CRM for freelancers and small teams
12
+
13
+ Usage:
14
+ npx axis-crm init [directory] Create a new CRM in the given directory (default: ./crm)
15
+ npx axis-crm --help Show this help message
16
+
17
+ Examples:
18
+ npx axis-crm init Creates ./crm with full CRM structure
19
+ npx axis-crm init my-business Creates ./my-business with full CRM structure
20
+
21
+ After init:
22
+ cd crm
23
+ git init
24
+ ./scripts/new-lead.sh "First Lead Inc"
25
+ # Open in Obsidian for dashboards (install Dataview plugin)
26
+
27
+ More info: https://github.com/PatrikSchick-AI/axis-crm
28
+ `;
29
+
30
+ if (command === "--help" || command === "-h" || command === "help") {
31
+ console.log(HELP);
32
+ process.exit(0);
33
+ }
34
+
35
+ if (command === "--version" || command === "-v") {
36
+ const pkg = require("../package.json");
37
+ console.log(pkg.version);
38
+ process.exit(0);
39
+ }
40
+
41
+ if (command !== "init") {
42
+ console.error(`Unknown command: ${command}`);
43
+ console.error('Run "npx axis-crm --help" for usage.');
44
+ process.exit(1);
45
+ }
46
+
47
+ const targetName = args[1] || "crm";
48
+ const targetDir = path.resolve(process.cwd(), targetName);
49
+
50
+ if (fs.existsSync(targetDir) && fs.readdirSync(targetDir).length > 0) {
51
+ console.error(
52
+ `Error: Directory "${targetName}" already exists and is not empty.`,
53
+ );
54
+ process.exit(1);
55
+ }
56
+
57
+ function copyDir(src, dest) {
58
+ fs.mkdirSync(dest, { recursive: true });
59
+ const entries = fs.readdirSync(src, { withFileTypes: true });
60
+
61
+ for (const entry of entries) {
62
+ const srcPath = path.join(src, entry.name);
63
+ const destPath = path.join(dest, entry.name);
64
+
65
+ if (entry.isDirectory()) {
66
+ copyDir(srcPath, destPath);
67
+ } else {
68
+ fs.copyFileSync(srcPath, destPath);
69
+ // Preserve executable permissions for scripts
70
+ if (entry.name.endsWith(".sh")) {
71
+ fs.chmodSync(destPath, 0o755);
72
+ }
73
+ }
74
+ }
75
+ }
76
+
77
+ console.log(`\n Creating Axis CRM in ./${targetName}...\n`);
78
+
79
+ copyDir(TEMPLATE_DIR, targetDir);
80
+
81
+ // Count created files
82
+ let fileCount = 0;
83
+ function countFiles(dir) {
84
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
85
+ for (const entry of entries) {
86
+ if (entry.isDirectory()) {
87
+ countFiles(path.join(dir, entry.name));
88
+ } else {
89
+ fileCount++;
90
+ }
91
+ }
92
+ }
93
+ countFiles(targetDir);
94
+
95
+ console.log(` Done! ${fileCount} files created.\n`);
96
+ console.log(" Next steps:\n");
97
+ console.log(` cd ${targetName}`);
98
+ console.log(" git init");
99
+ console.log(' git add -A && git commit -m "init: axis-crm"');
100
+ console.log(' ./scripts/new-lead.sh "First Lead Inc"');
101
+ console.log("");
102
+ console.log(" Open in Obsidian for dashboards (install Dataview plugin).");
103
+ console.log(" Open CLAUDE.md to use with AI coding agents.");
104
+ console.log("");
105
+ console.log(" Docs: https://github.com/PatrikSchick-AI/axis-crm");
106
+ console.log("");
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "axis-crm",
3
+ "version": "1.0.0",
4
+ "description": "A git-based CRM for freelancers and small teams. Markdown + YAML + Obsidian + n8n.",
5
+ "bin": {
6
+ "axis-crm": "./cli/index.js"
7
+ },
8
+ "files": [
9
+ "cli/",
10
+ "template/",
11
+ "LICENSE",
12
+ "README.md"
13
+ ],
14
+ "keywords": [
15
+ "crm",
16
+ "markdown",
17
+ "obsidian",
18
+ "freelancer",
19
+ "git",
20
+ "n8n",
21
+ "automation",
22
+ "lead-management",
23
+ "yaml",
24
+ "cli"
25
+ ],
26
+ "author": "Patrik Schick <info@patrikschick.com> (https://patrikschick.com)",
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/PatrikSchick-AI/axis-crm.git"
31
+ },
32
+ "homepage": "https://github.com/PatrikSchick-AI/axis-crm",
33
+ "bugs": {
34
+ "url": "https://github.com/PatrikSchick-AI/axis-crm/issues"
35
+ }
36
+ }
@@ -0,0 +1,38 @@
1
+ # CLAUDE.md
2
+
3
+ Axis CRM — git-based CRM system. Markdown files with YAML frontmatter, versioned in git.
4
+
5
+ ## Structure
6
+
7
+ - `clients/` — each client = a folder (README.md, contacts/, meetings/, projects/, communication/, files/)
8
+ - `leads/` — each lead = a single .md file
9
+ - `templates/` — templates for all record types
10
+ - `rules/` — lifecycle, scoring, field definitions, folder structure
11
+ - `scripts/` — new-lead.sh, convert-to-client.sh, new-project.sh, validate.sh
12
+ - `automations/` — n8n workflow JSON exports
13
+ - `dashboards/` — Obsidian Dataview dashboards
14
+
15
+ ## Conventions
16
+
17
+ - Code, commits, branches: English
18
+ - Commit messages: `feat:`, `fix:`, `docs:`, `chore:`
19
+ - YAML frontmatter on every .md file
20
+ - Never use emoji as icons — use SVG icons (Lucide, Heroicons)
21
+
22
+ ## Rules
23
+
24
+ - A lead is a file. A client is a folder.
25
+ - Convert lead to client: `scripts/convert-to-client.sh slug`
26
+ - Create new lead: `scripts/new-lead.sh "Company Name"`
27
+ - Validate data: `scripts/validate.sh`
28
+ - Lead lifecycle: new → enriched → qualified → contacted → responded → opportunity → client
29
+ - Scoring: 0-100, thresholds in `rules/scoring.md`
30
+ - Client rates: `hourly_rate`, `manday_rate`, `currency` fields in client README.md
31
+
32
+ ## Build & Check
33
+
34
+ ```bash
35
+ ./scripts/validate.sh # Validate all leads + clients
36
+ ./scripts/validate.sh leads # Leads only
37
+ ./scripts/validate.sh clients # Clients only
38
+ ```
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: CRM Dashboard
3
+ type: dashboard
4
+ tags: [dashboard, crm]
5
+ ---
6
+
7
+ # CRM Dashboard
8
+
9
+ ## Quick links
10
+
11
+ - [[dashboards/pipeline|Lead Pipeline]]
12
+ - [[dashboards/hot-leads|Hot Leads]]
13
+ - [[dashboards/client-overview|Client Overview]]
14
+ - [[rules/lifecycle|Lifecycle Rules]]
15
+ - [[rules/scoring|Scoring Rules]]
16
+
17
+ ## Active Clients
18
+
19
+ ```dataview
20
+ TABLE status, priority, industry
21
+ FROM "clients"
22
+ WHERE type = "client" AND (status = "active" OR status = "active-partnership" OR status = "in-progress")
23
+ SORT priority DESC
24
+ ```
25
+
26
+ ## Hot Leads (score > 60)
27
+
28
+ ```dataview
29
+ TABLE status, email, score, source, campaign
30
+ FROM "leads"
31
+ WHERE type = "lead" AND score > 60
32
+ SORT score DESC
33
+ ```
34
+
35
+ ## Lead Pipeline Summary
36
+
37
+ ```dataview
38
+ TABLE WITHOUT ID status AS "Status", length(rows) AS "Count"
39
+ FROM "leads"
40
+ WHERE type = "lead"
41
+ GROUP BY status
42
+ SORT status ASC
43
+ ```
44
+
45
+ ## Recent Meetings
46
+
47
+ ```dataview
48
+ TABLE date, attendees
49
+ FROM "clients"
50
+ WHERE type = "meeting"
51
+ SORT date DESC
52
+ LIMIT 10
53
+ ```
@@ -0,0 +1,62 @@
1
+ # Automations
2
+
3
+ Axis CRM supports two n8n workflows for CRM process automation.
4
+
5
+ ## Workflows
6
+
7
+ ### 1. Meeting to CRM (`fireflies-to-crm.json`)
8
+
9
+ Automatically saves meeting notes to the client folder in the repo.
10
+
11
+ **Flow:** Fireflies webhook → fetch transcript → data extraction → AI client identification → build Markdown → upsert to GitHub (SHA strategy) → notification
12
+
13
+ - 14 nodes
14
+ - Uses upsert strategy (SHA check before writing) — safe for repeated execution
15
+ - Automatically creates the client folder if it doesn't exist
16
+
17
+ ### 2. Client Research (`client-research.json`)
18
+
19
+ Automatically performs company research — web scrape, AI analysis, ARES verification.
20
+
21
+ **Flow:** webhook → web scrape → text and contact extraction → AI analysis → ARES lookup (Czech companies) → build CRM output → GitHub commit → notification
22
+
23
+ - 13 nodes
24
+ - For Czech companies, automatically verifies ICO in ARES
25
+ - Result is saved as README.md in the client folder
26
+
27
+ ## Setup
28
+
29
+ 1. Import the JSON file into n8n (Settings → Import Workflow)
30
+ 2. Create credentials (see below)
31
+ 3. In each workflow node, update:
32
+ - Repo name: `your-username/axis-crm`
33
+ - Branch: `main` (or your CRM branch)
34
+ - Webhook URL in Fireflies settings
35
+ 4. For Meeting to CRM: set the webhook URL in Fireflies (Settings → Webhooks → Transcription Complete)
36
+ 5. Activate the workflow
37
+
38
+ ## Required credentials
39
+
40
+ | Credential | Type in n8n | Where to get |
41
+ | -------------- | ---------------- | ----------------------------------- |
42
+ | Fireflies API | Fireflies API | https://app.fireflies.ai/integrations |
43
+ | Anthropic API | Anthropic API | https://console.anthropic.com |
44
+ | GitHub API | GitHub API | https://github.com/settings/tokens |
45
+
46
+ ## Testing
47
+
48
+ ### Meeting to CRM
49
+
50
+ ```bash
51
+ curl -X POST https://YOUR_N8N_URL/webhook/axis-crm-meeting \
52
+ -H "Content-Type: application/json" \
53
+ -d '{"meetingId": "your-fireflies-meeting-id"}'
54
+ ```
55
+
56
+ ### Client Research
57
+
58
+ ```bash
59
+ curl -X POST https://YOUR_N8N_URL/webhook/axis-crm-research \
60
+ -H "Content-Type: application/json" \
61
+ -d '{"company": "Firma s.r.o.", "website": "https://firma.cz"}'
62
+ ```