New Context: PolicyEngine is also implementing CiviCRM for constituent relationship management. This significantly changes the landscape for non-technical work (grants, papers, partnerships).
Key Insight: CiviCRM has built-in grant tracking, potentially eliminating the need for separate grant management tools!
PolicyEngine needs a system for:
- β Bug tracking across repos (policyengine-app, policyengine-api, etc.)
- β Feature requests and enhancements
- β Code-related tasks and refactoring
- β Fast triage and prioritization
- β GitHub integration (PRs, commits, branches)
- β API access for AI agents (check deadlines, query issues)
- β Grant applications and tracking
- β Paper submissions (journals, conferences)
- β Financial reports and compliance
- β Blog post planning and publishing
- β Research project coordination
- β Partnership and outreach tracking
Current Setup: GitHub Projects v2 + ad-hoc in policyengine/issues repo
Problem: GitHub Projects API can't efficiently filter by due date, limiting AI agent automation
Major Discovery: CiviCRM (your planned CRM) has built-in grant management!
CiviCRM is purpose-built for nonprofits and includes:
- β Grant Applications: Track applications with custom fields
- β Grant Types: Different categories (foundation, government, corporate)
- β Grant Status: Submitted, Approved, Rejected, Paid, etc.
- β Amount Tracking: Requested amount, awarded amount, budget
- β Funder Relationships: Link grants to funder contacts in CRM
- β Deadlines: Application deadlines, report due dates
- β Reporting: Grant pipeline dashboards, success rates
- β Attachments: Store proposals, budgets, reports
- β Financial Reports: Track disbursements, spending
- β Paper Tracking: Can track as "Cases" or custom entity
- β Multi-currency: For international grants
REST API v4 (modern):
// Query grants with upcoming deadlines
const response = await fetch('https://policyengine.org/civicrm/ajax/api4/Grant/get', {
method: 'POST',
headers: {
'X-Civi-Auth': 'Bearer ' + process.env.CIVICRM_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
select: ['id', 'grant_type_id', 'amount_total', 'application_received_date', 'contact_id'],
where: [
['application_received_date', '<=', addDays(new Date(), 30)],
['status_id:name', 'NOT IN', ['Awarded', 'Rejected']]
],
orderBy: { application_received_date: 'ASC' },
limit: 50
})
});
const grants = await response.json();PHP API (alternative):
$result = civicrm_api3('Grant', 'get', [
'application_received_date' => ['<=' => date('Y-m-d', strtotime('+30 days'))],
'status_id' => ['!=' => 'Awarded'],
'options' => ['limit' => 50, 'sort' => 'application_received_date ASC'],
]);Excellent for:
- β Grant applications and pipeline tracking
- β Funder/foundation relationship management
- β Partner organization contacts
- β Paper co-author contacts
- β Donor/supporter tracking
- β Financial compliance reporting
- β Event management (conferences, workshops)
- β Email campaigns to stakeholders
Not good for:
- β Engineering bug tracking
- β Code-related tasks
- β GitHub integration
- β Fast developer triage
- Software: Free (open source)
- Hosting options:
- Self-hosted: $0 + server costs (~$20-50/month)
- Managed hosting: $50-200/month (CiviHosting, Tadpole, etc.)
- Typical total: $50-100/month for managed hosting
If using CiviCRM for grants:
- β Don't need Notion/Jira/Monday for grant tracking
- β Don't need custom grant database
- β Focus tool selection on engineering work only
- β Save money - one less tool to pay for
Alternative: Build your own grant/paper tracker integrated with PolicyEngine
# models.py
from django.db import models
class Grant(models.Model):
name = models.CharField(max_length=200)
funder = models.ForeignKey('Funder', on_delete=models.CASCADE)
amount_requested = models.DecimalField(max_digits=10, decimal_places=2)
amount_awarded = models.DecimalField(max_digits=10, decimal_places=2, null=True)
deadline = models.DateField()
status = models.CharField(max_length=20, choices=STATUS_CHOICES)
probability = models.IntegerField(default=50) # 0-100
grant_type = models.CharField(max_length=50)
@property
def expected_value(self):
return float(self.amount_requested) * (self.probability / 100)
class Paper(models.Model):
title = models.CharField(max_length=500)
conference = models.CharField(max_length=200)
submission_deadline = models.DateField()
authors = models.ManyToManyField('Author')
status = models.CharField(max_length=20, choices=PAPER_STATUS)
related_grants = models.ManyToManyField(Grant, blank=True)
# API endpoint optimized for Claude Code
from rest_framework.decorators import api_view
from rest_framework.response import Response
from datetime import date, timedelta
@api_view(['GET'])
def upcoming_deadlines(request):
days = int(request.GET.get('days', 30))
end_date = date.today() + timedelta(days=days)
grants = Grant.objects.filter(
deadline__lte=end_date,
status__in=['draft', 'submitted', 'under_review']
).order_by('deadline')
papers = Paper.objects.filter(
submission_deadline__lte=end_date,
status__in=['draft', 'in_review']
).order_by('submission_deadline')
return Response({
'grants': GrantSerializer(grants, many=True).data,
'papers': PaperSerializer(papers, many=True).data
})- β Full control - exactly your data model
- β PolicyEngine integration - same codebase, shared models
- β Custom API - designed for Claude Code from day one
- β Your infrastructure - already have Django/PostgreSQL
- β Open source - your code
- β No external service - no additional hosting
- β Build time - 1-2 weeks initial development
- β Maintenance - ongoing updates and bug fixes
- β Feature development - CiviCRM has years of features
- β Opportunity cost - why build when CiviCRM exists?
- β Missing CRM features - contact management, email campaigns
Build if:
- You want tight PolicyEngine integration (shared models, calculations)
- You have specific requirements CiviCRM doesn't meet
- You prefer full control over data model
- You have development capacity
Use CiviCRM if:
- You need full CRM (contacts, donors, email campaigns)
- You want proven grant management out-of-box
- You prefer not maintaining another codebase
- You value established nonprofit tool
New recommended approach: Separate concerns
- Engineering tool (Linear, Jira, or GitHub Projects) for technical work
- CiviCRM for grants, funders, papers, financial reports
- Aggregator service to query both APIs for "all deadlines"
// Claude Code integration: query all deadlines
async function getAllDeadlines(daysAhead = 30) {
const endDate = addDays(new Date(), daysAhead);
const [technical, grants, papers] = await Promise.all([
// Option A: Linear API
linear.issues({
filter: {
dueDate: { lte: endDate.toISOString().split('T')[0] },
state: { type: { nin: ['completed', 'canceled'] } }
},
orderBy: 'dueDate'
}),
// CiviCRM API - grants
fetch('https://policyengine.org/civicrm/ajax/api4/Grant/get', {
method: 'POST',
headers: { 'X-Civi-Auth': 'Bearer ' + process.env.CIVICRM_TOKEN },
body: JSON.stringify({
where: [
['application_received_date', '<=', endDate.toISOString().split('T')[0]],
['status_id:name', 'NOT IN', ['Awarded', 'Rejected']]
],
orderBy: { application_received_date: 'ASC' }
})
}).then(r => r.json()),
// Could also query papers from CiviCRM as Cases or custom entity
// Or from your custom database if built
]);
return {
technical: technical.nodes.map(formatTechnical),
grants: grants.values.map(formatGrant),
all: [...technical.nodes, ...grants.values].sort(byDate)
};
}Result for Claude Code:
π
All Upcoming Deadlines (Next 30 Days):
Oct 5 [Bug] Fix authentication error (@Sarah)
Oct 6 [Grant] NSF POSE Phase 2 - $1.5M (@Max)
Oct 7 [Feature] Add UK carbon tax analysis (@Mike)
Oct 8 [Paper] AEA Conference submission (@Max, @Nikhil)
Oct 9 [Financial] Q3 Foundation Report (@Finance)
Oct 12 [Bug] API timeout on large simulations (@Pavel)
Oct 15 [Grant] Ford Foundation - $250K (@Nikhil)
Given CiviCRM for non-technical work:
Engineering: Plane (self-hosted, Linear-like UX) Non-Technical: CiviCRM (grants, funders, papers)
Cost:
- Plane: $20-50/month (infrastructure)
- CiviCRM: $50-100/month (managed hosting)
- Total: $70-150/month ($840-1,800/year)
Pros:
- β Fully open source (both tools)
- β Linear-like UX (fast, clean)
- β Good APIs for Claude Code
- β Data sovereignty (self-hosted)
- β Low cost (saves $1,200-2,200/year vs Linear)
- β Aligns with OSS values
Cons:
- β DevOps burden (manage two systems)
β οΈ Less polished than Linear (newer project)β οΈ Two APIs to integrate
Engineering: Jira (if free OSS license) Non-Technical: CiviCRM
Cost:
- Jira: $0 (if OSS approved)
- CiviCRM: $50-100/month
- Total: $50-100/month ($600-1,200/year)
Pros:
- β Lowest cost (Jira free + cheap CiviCRM)
- β Both APIs work for deadline queries
- β Open source CRM
- β Saves $1,500-2,000/year vs Linear + CiviCRM
Cons:
- β Jira slow for engineering daily use
β οΈ JQL learning curve
Engineering: Linear (proprietary, best-in-class) Non-Technical: CiviCRM
Cost:
- Linear: $120-150/month
- CiviCRM: $50-100/month (managed hosting)
- Total: $170-250/month ($2,000-3,000/year)
Pros:
- β Best engineering UX (fastest, most polished)
- β Best API for Claude Code
- β No self-hosting (fully managed)
- β Clean separation (tech vs non-tech)
Cons:
- β Proprietary (not open source)
- β Highest cost ($1,200-2,200/year more than Plane)
β οΈ Two APIs to integrate
Engineering: GitHub Projects (free, already using) Non-Technical: CiviCRM
Cost:
- GitHub: $0
- CiviCRM: $50-100/month
- Total: $50-100/month ($600-1,200/year)
Pros:
- β Lowest cost
- β No migration (already on GitHub)
- β CiviCRM solves non-tech needs
Cons:
- β GitHub API problem remains (can't filter deadlines)
- β Doesn't solve your core issue (AI agent deadline queries)
| Option | Cost/Year | Engineering | Non-Tech | API Quality | Open Source | Recommended |
|---|---|---|---|---|---|---|
| Plane + CiviCRM | $840-1,800 | ββββ | βββββ | βββββ | β Both | π Best Overall |
| Jira + CiviCRM (OSS) | $600-1,200 | ββ | βββββ | ββββ | β Both | Best Value |
| Linear + CiviCRM | $2,000-3,000 | βββββ | βββββ | βββββ | Best UX | |
| GitHub + CiviCRM | $600-1,200 | βββ | βββββ | ββ | Cheapest |
Previous options (Linear + Notion, Monday, Asana) are less relevant now that CiviCRM handles non-technical work.
Since you value open source and are using CiviCRM (OSS), consider Plane:
- Open source Linear clone - MIT licensed
- Nearly identical UX to Linear (built by ex-Jira users)
- Self-hosted or cloud options
- Active development - growing community
- GitHub: https://github.com/makeplane/plane (20k+ stars)
- β Linear-like speed - fast, keyboard-driven interface
- β Issues & projects - same concepts as Linear
- β Cycles (sprints) - iteration planning
- β GitHub integration - bi-directional sync
- β API - GraphQL and REST
- β Multiple views - List, Kanban, Calendar, Spreadsheet
- β Custom properties - extend issue metadata
Plane API (similar to Linear):
// REST API
const response = await fetch('https://plane.policyengine.org/api/v1/workspaces/pe/projects/eng/issues/', {
headers: {
'X-Api-Key': process.env.PLANE_API_KEY
},
params: {
target_date__lte: '2025-10-09',
state__group__in: 'started,unstarted'
}
});
const issues = await response.json();Supports date filtering:
- β Query by target_date (due date)
- β Filter by state, assignee, labels
- β Order by any field
- β Pagination
Option 1: Self-Hosted (Free)
# Docker Compose (easiest)
git clone https://github.com/makeplane/plane
cd plane
docker-compose up -d
# Or Kubernetes for productionCost:
- Software: $0 (open source)
- Infrastructure: $20-50/month (DigitalOcean/AWS)
- Total: $20-50/month
Option 2: Plane Cloud (Paid)
- Free tier: 5 users, 1 workspace
- Pro: $8/user/month (same as Linear)
- Cost for 15 users: $120/month
Engineering: Plane (self-hosted) Non-Technical: CiviCRM
Total Cost:
- Plane: $20-50/month (infrastructure)
- CiviCRM: $50-100/month (managed hosting)
- Total: $70-150/month ($840-1,800/year)
Saves $1,000-1,500/year vs Linear + CiviCRM
Pros:
- β Open source (aligns with your values)
- β Linear-like UX (fast, clean)
- β Good API for deadline queries
- β Self-hosted (full control, data privacy)
- β Much cheaper than Linear ($20-50 vs $120-150/month)
- β Active community and development
Cons:
- β Self-hosting overhead - need to manage server
- β Less polished than Linear (newer project)
- β Smaller ecosystem - fewer integrations
- β DevOps required - updates, backups, monitoring
β οΈ Less mature - may have bugs
| Feature | Linear | Plane (Self-Hosted) | Plane Cloud |
|---|---|---|---|
| Cost (15 users) | $120-150/mo | $20-50/mo | $120/mo |
| UX Speed | βββββ | ββββ | ββββ |
| API Quality | βββββ | ββββ | ββββ |
| GitHub Integration | βββββ | ββββ | ββββ |
| Deadline API | β Yes | β Yes | β Yes |
| Open Source | β No | β Yes | β Yes |
| Self-Hosted | β No | β Yes | β No |
| Maintenance | None | High | None |
| Polish/Stability | βββββ | βββ | ββββ |
Use Plane if:
- β You have DevOps capacity to self-host
- β You want open source for engineering tools too
- β You want to save $1,000+/year vs Linear
- β You value data sovereignty (self-hosted)
Use Linear if:
- β You don't want to manage infrastructure
- β You want maximum polish and stability
- β $100/month difference isn't significant
- β You prefer SaaS simplicity
Engineering: Plane (self-hosted, open source) Non-Technical: CiviCRM (open source)
Cost: $70-150/month ($840-1,800/year)
Pros:
- β Fully open source stack
- β Good APIs for Claude Code
- β Low cost (saves $1,200-2,200/year vs Linear + CiviCRM)
- β Data sovereignty (self-hosted)
- β Linear-like UX for engineering
Cons:
- β DevOps burden (two systems to maintain)
β οΈ Less mature than Linear
This might be your ideal setup: Open source everything, good APIs, reasonable cost.
| Option | Cost/Year | Open Source | API Quality | DevOps | Best For |
|---|---|---|---|---|---|
| Plane + CiviCRM | $840-1,800 | β Both | βββββ | High | OSS advocates |
| Jira + CiviCRM (OSS) | $600-1,200 | β Both | ββββ | Low | Free/cheap |
| Linear + CiviCRM | $2,000-3,000 | βββββ | Low | Best UX | |
| GitHub + CiviCRM | $600-1,200 | ββ | None | Simplest |
Previous options (Linear + Notion, Monday, Asana) are less relevant now that CiviCRM handles non-technical work.
- β API: Powerful JQL for deadline queries
- β GitHub Integration: Bi-directional sync available
- β Issue Tracking: Excellent for bugs, features
β οΈ Speed: Notoriously slow UIβ οΈ Developer UX: Complex, frustrating for daily use
- β
Custom Workflows: Perfect for grant processes
- Grant stages: Draft β Review β Submit β Under Review β Awarded/Rejected
- Paper pipeline: Draft β Internal Review β Submission β Revision β Published
- Financial reports: Pending β In Progress β Review β Submitted
- β Custom Issue Types: Create "Grant Application", "Paper Submission", "Financial Report"
- β Custom Fields: Track grant amounts, deadlines, review stages, submission dates
- β Confluence Integration: Write grant proposals, papers, documentation
- β Advanced Permissions: Control who sees financial/sensitive information
- β Dashboard & Reporting: Track grant pipeline, publication status
- β Calendar View: See all grant deadlines, paper submissions
- β Attachments: Store grant docs, financial reports, paper PDFs
Querying deadlines (works well):
// All grants due in next 30 days
const grants = await jira.searchJira(
'issuetype = "Grant Application" AND duedate <= 30d AND status != Awarded ORDER BY duedate',
{ fields: ['summary', 'duedate', 'customfield_10001'] } // amount
);
// Papers awaiting review
const papers = await jira.searchJira(
'issuetype = "Paper Submission" AND status = "Under Review"'
);
// All deadlines across all types
const allDeadlines = await jira.searchJira(
'duedate >= now() AND duedate <= 7d AND status not in (Done, Awarded, Published) ORDER BY duedate'
);Strengths:
- β Server-side filtering for deadlines
- β Can query across different work types
- β Powerful for complex queries
β οΈ JQL learning curveβ οΈ More verbose than Linear
- Free if approved for open source license (likely eligible)
- Includes Jira + Confluence + unlimited users
- $0/month potential cost
Pros:
- β Handles both technical and non-technical work well
- β Free if OSS approved (huge savings)
- β Confluence for documentation, grant writing, papers
- β Mature workflows for complex processes (grants)
- β Good API for deadline automation
- β Advanced reporting for grant pipeline tracking
- β One tool for everything (less context switching)
Cons:
- β Slow UI - frustrating for daily engineering work
- β Complex setup - 4-8 hours initial configuration
- β JQL learning curve - 1-2 weeks to master
- β Not optimized for engineers - feels heavy
- β Approval wait - 1-2 weeks for OSS license
Best for: Teams that want one tool for everything and get the free OSS license
- β API: Best-in-class for deadline queries
- β GitHub Integration: Seamless, native
- β Speed: 5-10x faster than Jira
- β Developer UX: Built for engineers
- β Issue Tracking: Excellent for rapid triage
- β
Grant Database: Track applications with custom properties
- Properties: Grant name, Amount, Deadline, Status, Probability
- Views: Pipeline (Kanban), Calendar, Table, Timeline
- Formulas: Calculate expected value, days until deadline
- β
Paper Tracker: Conference/journal submission pipeline
- Properties: Title, Conference, Deadline, Status, Authors
- Views: By deadline, By conference, By status
- Linked databases: Connect papers to related grants
- β Financial Reports: Calendar with report deadlines
- β Long-Form Writing: Draft grant proposals, papers, blog posts
- β Documentation: All-in-one wiki for research, methodology
- β Templates: Reusable grant application, paper submission templates
- β Collaboration: Comments, mentions, real-time editing
Linear API (Technical deadlines):
// Engineering deadlines
const techDeadlines = await linear.issues({
filter: {
dueDate: { lte: addDays(new Date(), 7) },
state: { type: { nin: ['completed', 'canceled'] } }
},
orderBy: 'dueDate'
});Notion API (Non-technical deadlines):
// Grant deadlines from Notion database
const grantDeadlines = await notion.databases.query({
database_id: grantsDatabaseId,
filter: {
and: [
{ property: 'Deadline', date: { on_or_before: addDays(new Date(), 30) } },
{ property: 'Status', select: { does_not_equal: 'Awarded' } }
]
},
sorts: [{ property: 'Deadline', direction: 'ascending' }]
});
// Paper submission deadlines
const paperDeadlines = await notion.databases.query({
database_id: papersDatabaseId,
filter: {
property: 'Submission Deadline',
date: { next_week: {} }
}
});
// Combined view for all upcoming deadlines
const allDeadlines = {
technical: techDeadlines.nodes,
grants: grantDeadlines.results,
papers: paperDeadlines.results
};Strengths:
- β Both have excellent APIs
- β Can query each separately or combine
- β Notion API supports date filtering
β οΈ Requires combining data from two sources
- Linear: $120-150/month (15 users @ $8-10/user)
- Notion: $120/month (15 users @ $8/user)
- Total: ~$240-270/month
Pros:
- β Linear speed for engineering work (best UX)
- β Notion flexibility for grants, papers, documentation
- β Best APIs for both use cases
- β Each tool excels at its purpose
- β Great for writing (grant proposals, papers in Notion)
- β Databases in Notion perfect for grant/paper tracking
- β Fast setup - 2-3 hours total
Cons:
- β Two tools - context switching
- β Higher cost - $240-270/month
- β Two integrations to maintain
- β Split data - technical vs non-technical in different places
Best for: Teams willing to pay for best-in-class tools for each use case
- β API: Best-in-class
- β GitHub: Seamless
- β Speed: Fastest
- β Developer UX: Best
β οΈ Can work but awkward:- Create "Grant" team or project
- Use issues for grant applications, papers
- Custom labels: "grant", "paper", "financial"
- Due dates work fine
- β Missing:
- No long-form writing (grant proposals)
- No rich databases (just issue lists)
- No templates for grant applications
- Limited custom fields
- Not designed for non-technical stakeholders
Works for both, but limited for non-technical:
// Can query all deadlines including grants/papers
const allDeadlines = await linear.issues({
filter: {
dueDate: { lte: addDays(new Date(), 30) }
},
orderBy: 'dueDate'
});
// Filter by label for grants
const grants = await linear.issues({
filter: {
labels: { name: { eq: 'grant' } },
dueDate: { lte: addDays(new Date(), 90) }
}
});- $120-150/month (15 users @ $8-10/user)
Pros:
- β Best technical workflow
- β Best API for deadline queries
- β Single tool (less complexity)
- β Lower cost than dual setup
Cons:
- β Poor for grant writing (no long-form docs)
- β Limited for complex workflows (grant stages)
- β Not designed for non-technical work
- β Missing database features for tracking grants/papers
Best for: If non-technical work is <10% and simple
β οΈ Can work but not optimal:- Bug database instead of issue tracker
- Not as fast as Linear for triage
- GitHub integration via third-party (Notion2GitHub)
- β Missing:
- Not optimized for rapid issue triage
- Slower than Linear/GitHub Projects
- Weaker GitHub integration
- β
Excellent:
- Perfect for grant tracking, paper pipelines
- Long-form writing (proposals, papers)
- All-in-one workspace
- Rich databases with relations
Notion API supports date filtering:
// Query all databases for upcoming deadlines
const bugDeadlines = await notion.databases.query({
database_id: bugsDatabaseId,
filter: { property: 'Due Date', date: { next_week: {} } }
});
const grantDeadlines = await notion.databases.query({
database_id: grantsDatabaseId,
filter: { property: 'Deadline', date: { next_month: {} } }
});
// Combine all deadlines
const allDeadlines = [...bugDeadlines.results, ...grantDeadlines.results]
.sort((a, b) => new Date(a.properties.DueDate) - new Date(b.properties.DueDate));- $120/month (15 users @ $8/user)
Pros:
- β Great for non-technical work (best option)
- β All-in-one workspace
- β Lower cost than dual setup
- β Flexible databases for any use case
- β Great for documentation and writing
Cons:
- β Not optimized for engineering workflows
- β Slower than Linear for daily triage
- β Weaker GitHub integration
- β Not built for developers
Best for: Research-heavy teams with lighter engineering needs
β οΈ Can work but not optimal:- Bug tracking boards
- Feature request pipelines
- GitHub integration available (third-party)
- Not as fast as Linear for engineering triage
β οΈ Missing:- Not built for developers
- Slower than Linear/GitHub Projects
- Less technical feel
- β
Excellent:
- Grant tracking: Visual pipeline with columns (Draft β Review β Submit β Awarded)
- Paper submissions: Timeline view for conference deadlines
- Financial reports: Calendar and Gantt views
- Custom boards: Unlimited flexibility for any workflow
- Automations: Auto-assign, send reminders, status changes
- Dashboards: High-level view of all projects
- Multiple views: Kanban, Gantt, Calendar, Timeline, Map
- Dependencies: Link grants to related projects
- Budget tracking: Track grant amounts, expenses
Monday.com API (GraphQL):
# Query all items with upcoming deadlines
query {
boards(ids: [123456, 789012]) {
items(
limit: 100
query_params: {
rules: [
{
column_id: "deadline"
compare_value: ["2025-10-02", "2025-10-09"]
operator: between
},
{
column_id: "status"
compare_value: ["Done", "Awarded"]
operator: not_any_of
}
]
}
) {
id
name
column_values {
id
text
}
}
}
}JavaScript SDK:
const mondayClient = require('monday-sdk-js')();
mondayClient.setToken(process.env.MONDAY_API_TOKEN);
// Query deadlines across all boards
const query = `query {
boards(ids: [${bugBoardId}, ${grantBoardId}, ${paperBoardId}]) {
name
items(query_params: {
rules: [{
column_id: "deadline",
compare_value: ["${today}", "${nextWeek}"],
operator: between
}]
}) {
name
column_values(ids: ["deadline", "person", "status"]) {
text
}
}
}
}`;
const response = await mondayClient.api(query);Strengths:
- β Server-side date filtering (GraphQL)
- β Can query across multiple boards
- β Rich metadata in columns
β οΈ More complex than Linear APIβ οΈ Need to know board IDs and column IDs
- Free: Up to 2 seats (not viable)
- Basic: $9/seat/month = $135/month for 15 users (3 seat minimum)
- Standard: $12/seat/month = $180/month (recommended - has automations)
- Pro: $19/seat/month = $285/month (advanced features)
- Typical cost: $180/month for Standard
Pros:
- β Highly visual - great for stakeholder communication
- β Flexible - can model any workflow
- β Great for non-technical - grants, papers, financial tracking
- β Automations - auto-reminders for deadlines
- β Multiple views - see data many ways (Kanban, Gantt, Calendar)
- β Good API - GraphQL with date filtering
- β Dashboards - high-level overview of all work
- β Integrations - connects to many tools
Cons:
- β Not for developers - feels slow for engineering work
- β Can get expensive - $180-285/month
- β Overwhelming - too many features, complex
- β GitHub integration weak - third-party, not native
- β Slower than Linear for rapid issue triage
β οΈ Previous experience - you tried it before (why did you stop?)
Best for: Teams wanting visual project management for both technical and non-technical work
β οΈ Can work but not ideal:- Bug tracking projects
- Feature development tracking
- GitHub integration available (Unito, Zapier)
- Not built for developers
- β Missing:
- Slow for engineering triage
- Not developer-focused
- Weaker GitHub integration than Linear
- β
Good:
- Grant tracking: Projects for each grant application
- Paper submissions: Tasks with subtasks for each submission
- Portfolio view: See all grants/papers in one place
- Timeline: Gantt-style view of deadlines
- Forms: Intake forms for new grant applications
- Templates: Reusable grant, paper submission workflows
- Goals: Track OKRs, grant targets
- Workload: See who's overloaded with grant work
Asana API (REST):
const asana = require('asana');
const client = asana.Client.create().useAccessToken(process.env.ASANA_TOKEN);
// Query tasks with upcoming deadlines
const tasks = await client.tasks.findAll({
workspace: workspaceId,
assignee: 'me',
completed_since: 'now',
opt_fields: 'name,due_on,assignee,projects'
});
// Filter by due date (client-side - API doesn't support date filtering!)
const upcomingDeadlines = tasks.data.filter(task => {
if (!task.due_on) return false;
const dueDate = new Date(task.due_on);
const daysUntil = (dueDate - new Date()) / (1000 * 60 * 60 * 24);
return daysUntil >= 0 && daysUntil <= 7;
}).sort((a, b) => new Date(a.due_on) - new Date(b.due_on));
// Advanced search (supports date filtering)
const results = await client.workspaces.tasks.typeahead({
workspace: workspaceId,
resource_subtype: 'default_task',
query: 'due_on:2025-10-02..2025-10-09'
});Strengths:
β οΈ Limited date filtering in main API- β Advanced search supports dates but complex
β οΈ REST only (no GraphQL)β οΈ Need to query by workspace/project- β Weaker API than Linear/Jira/Monday
- Free: Basic features, unlimited tasks (limited for teams)
- Premium: $10.99/user/month = $165/month for 15 users
- Business: $24.99/user/month = $375/month (advanced features)
- Typical cost: $165/month for Premium
Pros:
- β Familiar - widely used, intuitive
- β Good for project management - tasks, subtasks, dependencies
- β Templates - reusable workflows
- β Multiple views - List, Board, Timeline, Calendar
- β Good for non-technical - grants, papers work well
- β Moderate cost - cheaper than Monday Pro
Cons:
- β API limitations - date filtering awkward
- β Not for developers - feels slow for engineering
- β GitHub integration weak - third-party only
- β Client-side filtering needed for deadline queries
- β Not optimized for either technical or non-technical (jack of all trades)
Best for: Traditional project managers comfortable with Asana, lighter deadline automation needs
- β Free
- β Native GitHub integration
- β Poor API for deadline queries (your current pain)
- β Perfect for grants, papers
- β $120/month
Still limited by GitHub Projects API:
- Engineering deadlines remain problematic
- Notion API works well for non-technical deadlines
- Doesn't solve your core problem (AI agents querying technical deadlines)
- $120/month (Notion only)
Pros:
- β Lower cost than Linear + Notion
- β Solves non-technical needs well
Cons:
- β Doesn't solve API problem you're trying to fix
- β Still can't query engineering deadlines efficiently
Best for: If budget is tight and you can live with GitHub Projects limitations
| Criterion | Jira + Confluence | Linear + Notion | Monday.com | Asana | Linear Only | Notion Only | GitHub + Notion |
|---|---|---|---|---|---|---|---|
| Cost (15 users/mo) | $0 (if OSS) | $240-270 | $180 | $165 | $120-150 | $120 | $120 |
| Engineering Speed | ββ | βββββ | ββ | ββ | βββββ | βββ | βββ |
| GitHub Integration | βββ | βββββ | ββ | ββ | βββββ | ββ | βββββ |
| Tech Deadline API | ββββ | βββββ | ββββ | βββ | βββββ | βββ | ββ |
| Grant Tracking | βββββ | βββββ | βββββ | ββββ | ββ | βββββ | βββββ |
| Paper Submissions | ββββ | βββββ | ββββ | ββββ | ββ | βββββ | βββββ |
| Long-Form Writing | βββββ | βββββ | ββ | ββ | β | βββββ | βββββ |
| Financial Reports | βββββ | ββββ | βββββ | ββββ | ββ | βββββ | βββββ |
| Visual/Dashboard | ββββ | ββββ | βββββ | ββββ | βββ | βββ | βββ |
| Automations | ββββ | βββ | βββββ | βββ | βββ | βββ | ββ |
| Setup Time | 6-8 hours | 2-3 hours | 3-4 hours | 3-4 hours | 2 hours | 2 hours | 1 hour |
| Learning Curve | High (JQL) | Low | Medium | Low | Low | Low | Low |
| Context Switching | None | Some | None | None | None | None | Some |
| Developer Experience | ββ | βββββ | ββ | ββ | βββββ | βββ | βββ |
| Non-Tech Stakeholders | ββββ | ββββ | βββββ | ββββ | ββ | βββββ | βββββ |
| AI Agent Integration | ββββ | βββββ | ββββ | βββ | βββββ | ββββ | ββ |
1. Create "Grant Application" issue type
2. Custom fields: Amount, Funder, Deadline, Probability
3. Workflow: Draft β Review β Submit β Under Review β Awarded/Rejected
4. Write proposal in Confluence (linked to Jira issue)
5. Track all grants in Jira dashboard
6. Query via API: "All grants due in next 60 days with >50% probability"
Experience: β Professional, structured, good for compliance
1. Notion database: Grants
2. Properties: Amount, Funder, Deadline, Probability, Status
3. Write proposal as Notion page (linked to database entry)
4. Track in Kanban view: Draft β Review β Submit β Under Review β Awarded
5. Query via Notion API for deadlines
6. Linear used only for technical work
Experience: β Flexible, visual, great for writing proposals
1. Create issue with label "grant"
2. Title: "Grant: [Funder Name] - [Amount]"
3. Description: Grant details (but no rich formatting)
4. Due date: Application deadline
5. No good place for proposal draft
6. Query via API works but limited metadata
Experience:
1. "Paper Submission" issue type
2. Fields: Conference, Deadline, Authors, Status
3. Write paper in external tool (Overleaf, Google Docs)
4. Track submission status in Jira
5. Confluence for notes, reviews, revision tracking
Experience: β Good tracking, weak for actual writing
1. Notion database: Papers
2. Properties: Conference, Deadline, Authors, Status, Review Stage
3. Draft paper in Notion or link to Overleaf
4. Track reviews and revisions in Notion
5. Visual pipeline view
Experience: β Excellent, especially if drafting in Notion
1. Issue with label "paper"
2. Track submission deadline
3. No good place for paper content or reviews
Experience:
// Single query across all types
const allDeadlines = await jira.searchJira(
`duedate >= now() AND duedate <= 7d
AND status not in (Done, Awarded, Published)
ORDER BY duedate ASC`,
{
fields: ['summary', 'duedate', 'issuetype', 'status', 'assignee']
}
);
// Returns: bugs, features, grants, papers, financial reports
// All in one query, with type metadataResult:
π
Upcoming Deadlines (Next 7 Days):
Oct 5: Bug - Fix authentication error (Sarah)
Oct 6: Grant - NSF POSE Phase 2 Application ($1.5M)
Oct 7: Feature - Add UK carbon tax analysis (Mike)
Oct 8: Paper - AEA submission "UBI Microsimulation" (Max, Nikhil)
Oct 9: Financial Report - Q3 Foundation Report
Experience: β Single source of truth, unified view
// Query Linear for technical deadlines
const techDeadlines = await linear.issues({
filter: {
dueDate: {
gte: new Date().toISOString().split('T')[0],
lte: addDays(new Date(), 7).toISOString().split('T')[0]
},
state: { type: { nin: ['completed', 'canceled'] } }
},
orderBy: 'dueDate'
});
// Query Notion for grants
const grantDeadlines = await notion.databases.query({
database_id: grantsDatabaseId,
filter: {
and: [
{ property: 'Deadline', date: { next_week: {} } },
{ property: 'Status', select: { does_not_equal: 'Awarded' } }
]
}
});
// Query Notion for papers
const paperDeadlines = await notion.databases.query({
database_id: papersDatabaseId,
filter: { property: 'Deadline', date: { next_week: {} } }
});
// Combine and sort
const combined = [
...techDeadlines.nodes.map(i => ({ type: 'tech', ...i })),
...grantDeadlines.results.map(g => ({ type: 'grant', ...g })),
...paperDeadlines.results.map(p => ({ type: 'paper', ...p }))
].sort((a, b) => new Date(a.dueDate) - new Date(b.dueDate));Result: Same as above
Experience: β Works perfectly, just more code
const allDeadlines = await linear.issues({
filter: {
dueDate: { lte: addDays(new Date(), 7) }
},
orderBy: 'dueDate'
});
// Returns bugs, features, AND grants/papers if tracked as issues
// But missing rich metadata (grant amount, conference name, etc.)Experience:
| Tool | Lines of Code | Server Filtering | Rich Metadata | Complexity | API Quality |
|---|---|---|---|---|---|
| Linear | 5-10 | β Yes (GraphQL) | Low | βββββ | |
| Jira | 5-10 | β Yes (JQL) | β Full | Medium (JQL) | ββββ |
| Monday.com | 10-20 | β Yes (GraphQL) | β Full | Medium | ββββ |
| Linear + Notion | 30-40 | β Yes (both) | β Full | Medium (2 APIs) | βββββ |
| Notion | 30-40 | β Yes | β Full | Medium (multiple DBs) | ββββ |
| Asana | 40-50 | β Full | High (client-side) | βββ | |
| GitHub Projects | 100+ | β No | High | ββ |
Jira (Simplest for unified data):
const deadlines = await jira.searchJira(
'duedate <= 30d AND status not in (Done, Awarded) ORDER BY duedate',
{ fields: ['summary', 'duedate', 'issuetype', 'customfield_10001'] }
);Linear + Notion (Best APIs, need to combine):
const [tech, grants, papers] = await Promise.all([
linear.issues({ filter: { dueDate: { lte: '2025-11-01' } } }),
notion.databases.query({
database_id: grants,
filter: { property: 'Deadline', date: { next_month: {} } }
}),
notion.databases.query({
database_id: papers,
filter: { property: 'Deadline', date: { next_month: {} } }
})
]);
const all = [...tech.nodes, ...grants.results, ...papers.results].sort(...);Linear Only (Cleanest code, limited metadata):
const deadlines = await linear.issues({
filter: { dueDate: { lte: '2025-11-01' } },
orderBy: 'dueDate'
});Do this first (10 minutes):
- https://www.atlassian.com/software/views/open-source-license-request
- Likely to be approved (public repos, nonprofit, open source)
- No downside to applying
If approved (1-2 weeks): Get Jira + Confluence free If denied: Continue to Step 2
β Linear + Notion ($240/month)
- Best engineering workflow
- Best non-technical project management
- Best APIs (but need to combine)
- Worth the cost for daily velocity
β Jira + Confluence (if OSS approved, $0)
- Can't beat free
- Handles both use cases well
- Accept slower UI for savings
- Good enough for everything
β Notion Only (if Jira denied, $120/month)
- If engineering needs are lighter
- Excellent for grants/papers
- Acceptable for technical work
β Jira + Confluence (if free)
- Single source of truth
- No context switching
- Professional workflows
β Notion Only ($120/month)
- If Jira denied
- Flexible for everything
- Better for non-technical
β Linear + Notion ($240/month)
- Each tool excels
- Worth paying for quality
- AI agent integration perfect
Given your specific situation:
- 80% technical, 20% non-technical (but non-technical is critical)
- Want AI agents to query deadlines
- Currently using GitHub Projects + policyengine/issues repo
- Hitting API limitations
Why:
- Free saves $1,500-3,000/year
- Solves API problem (JQL handles deadlines well)
- Perfect for grants (custom workflows, Confluence for proposals)
- One tool for everything (less complexity)
- Professional (good for grant applications, partnerships)
Accept:
- Slower UI (but you're used to GitHub Projects)
- JQL learning curve (1-2 weeks, worth it for free)
- Setup time (6-8 hours)
Timeline:
- Apply now (10 min)
- Wait 1-2 weeks for approval
- If approved: Migrate (2-3 days of work)
- ROI: Immediate ($1,500+/year saved)
Why:
- Best APIs for AI agents (both excellent)
- Best engineering UX (Linear)
- Best for grants/papers (Notion databases)
- Each excels at its purpose
Accept:
- $240-270/month cost
- Two tools (some context switching)
- Need to combine APIs for unified deadlines
Timeline:
- Sign up immediately (free trials)
- Migrate Linear: 2-4 hours
- Set up Notion: 2-3 hours
- Build combined deadline query: 1-2 hours
- Apply for Jira OSS license (10 minutes)
- Start Linear trial (14 days free)
- Start Notion trial (free tier or trial)
- Test APIs for deadline queries
- Test Linear with policyengine-app issues
- Test Notion with grants/papers database
- Build deadline query combining both APIs
- Wait for Jira response
- If Jira approved: Go with Jira + Confluence (free wins)
- If Jira denied: Choose Linear + Notion (best experience)
- If budget tight: Choose Notion only (good enough)
| Option | Cost/Year | Best For | API Quality | Solves Your Problems | Notes |
|---|---|---|---|---|---|
| Jira + Confluence | $0 (if OSS) | Unified, free | ββββ | β Yes | Apply for OSS license |
| Linear + Notion | $2,900-3,200 | Best-in-class | βββββ | β Yes | Best UX, higher cost |
| Monday.com | $2,160 | Visual workflows | ββββ | β Yes | You tried before - why stop? |
| Asana | $1,980 | Traditional PM | βββ | Familiar but limited API | |
| Linear Only | $1,440-1,800 | Pure engineering | βββββ | Missing grant/paper features | |
| Notion Only | $1,440 | Research-heavy | ββββ | Good for grants, slow for bugs | |
| GitHub + Notion | $1,440 | Budget option | ββ (GitHub) | β No | Doesn't fix API problem |
Important question: Why did you stop using Monday.com?
Common reasons teams abandon Monday.com:
- π Too slow for daily engineering work (Kanban feels sluggish)
- π΅ Too complex for simple needs (overwhelming features)
- π° Cost creep (started cheap, got expensive with features needed)
- π Weak GitHub integration (couldn't sync issues/PRs well)
- π¨βπ» Engineers hated it (felt like "management tool" not "dev tool")
- π¨ Too visual, not technical (engineers want speed, not pretty boards)
If this was your experience: Monday.com probably isn't the answer. It's excellent for non-technical work (grants, papers) but engineers typically find it frustrating.
If you stopped for other reasons (team changes, didn't set it up right, etc.): It's worth reconsidering for the non-technical half of your work.
Key insight: Monday.com is like Jira - handles both technical and non-technical work, but engineers find it slow. The difference is Jira might be free (OSS license), while Monday.com costs $180/month.
Game-changer: You're getting CiviCRM anyway, which has built-in grant tracking!
This changes everything:
- β Grant tracking solved - CiviCRM does this out-of-box
- β Non-technical work handled - Grants, funders, papers in CRM
- β Focus decision on engineering tools only
- β Save money - don't need Notion/Monday for grants
Your actual decision: Pick an engineering tool
1. Plane + CiviCRM (Open Source Everything) π
- Cost: $840-1,800/year
- Why: Fully open source, good APIs, Linear-like UX
- Accept: Self-hosting two systems
- Best if: You have DevOps capacity and value OSS
2. Jira (OSS) + CiviCRM (Free)
- Cost: $600-1,200/year (just CiviCRM hosting)
- Why: Both free, both have APIs
- Accept: Jira slower than Linear/Plane
- Best if: OSS approved and budget matters
3. Linear + CiviCRM (Best UX)
- Cost: $2,000-3,000/year
- Why: Best engineering experience, best APIs
- Accept: Higher cost, proprietary tool
- Best if: You value speed over open source
Week 1:
- β Apply for Jira OSS license (10 min, free to try)
- β Trial Plane (docker-compose up, test for 1-2 days)
- β Trial Linear (14-day free trial)
- β Set up CiviCRM (you're doing this anyway)
Week 2-3: 5. Test each with real issues 6. Build test deadline query integrating with CiviCRM 7. Get team feedback (especially engineers) 8. Wait for Jira OSS response
Week 4: Decide
- If Jira approved: Jira + CiviCRM (free wins)
- If strong OSS preference: Plane + CiviCRM (open source stack)
- If speed critical: Linear + CiviCRM (best UX)
- β Linear + Notion - CiviCRM replaces Notion need
- β Monday.com - You tried it, didn't work, CiviCRM better for grants
- β Asana - Weaker API, CiviCRM better for grants
- β GitHub Projects alone - API can't filter deadlines
- β Custom grant DB - CiviCRM already has this
Plane + CiviCRM might be perfect for you:
Engineering: Plane (OSS, self-hosted, Linear-like)
+ CRM/Grants: CiviCRM (OSS, nonprofit-focused)
+ Infrastructure: Your own servers
+ Cost: $70-150/month
+ Philosophy: Fully open source, data sovereignty
+ APIs: Both excellent for Claude Code
This gives you:
- β Open source everything
- β Linear-like speed for engineering
- β Purpose-built grant tracking (CiviCRM)
- β Full control and data sovereignty
- β Saves $1,200-2,200/year vs Linear
The only cost is DevOps time. If you have capacity, this might be ideal.
Want me to help you:
- Set up Plane locally for testing?
- Draft the Jira OSS application?
- Build a prototype deadline aggregator (Plane/Linear/Jira + CiviCRM)?
- Create a CiviCRM grant tracking demo?