Skip to content

Instantly share code, notes, and snippets.

@benoitjadinon
Last active February 22, 2026 11:39
Show Gist options
  • Select an option

  • Save benoitjadinon/58616ddaa3b5480bedae761ed24c7447 to your computer and use it in GitHub Desktop.

Select an option

Save benoitjadinon/58616ddaa3b5480bedae761ed24c7447 to your computer and use it in GitHub Desktop.
Subscriptions obsidian base
model:
version: 1
kind: Table
columns: []
pluginVersion: 1.0.0
summaries:
Unique: values.unique().length
Total: values.reduce(number(acc)+number(value), 0).toFixed(2)
filters:
and:
- file.folder.endsWith('Subscriptions')
- file.ext == "md"
- file.basename != this.file.basename
- '!file.basename.endsWith("Template")'
- file.basename != "Subscriptions"
formulas:
icon: if (favicon || icon || url, image(if(favicon, favicon, if(icon, icon, "https://www.google.com/s2/favicons?domain="+url))))
enabled: endDate>=now().date() || formula.isRenewing
price-adjusted: (price+formula["shared-adjustment"]).toFixed(2)
shared-adjustment: (number(if(note["share-price"], -number(note["share-price"]) * shared, 0)))
cyclesStarted: |-
if(cycle.endsWith("d"),
(((if(endDate, endDate,today()))-startDate).days / number(cycle)).floor(),
if(cycle.endsWith("M"),
(((if(endDate, endDate,today()))-startDate).months / number(cycle)).floor(),
if(cycle.endsWith("y"),
(((if(endDate, endDate,today()))-startDate).years / number(cycle)).floor(),
((if(endDate, endDate,today()))-startDate).days
)
)
)
cyclesNext: |-
if(cycle.endsWith("d"),
(((if(endDate, endDate,today()))-startDate).days / number(cycle)).ceil(),
if(cycle.endsWith("M"),
(((if(endDate, endDate,today()))-startDate).months / number(cycle)).ceil(),
if(cycle.endsWith("y"),
(((if(endDate, endDate,today()))-startDate).years / number(cycle)).ceil(),
((if(endDate, endDate,today()))-startDate).days
)
)
)
cycleNextDuration: |-
if(cycle.endsWith("d"),
(formula.cyclesNext * number(cycle)).abs().ceil() + "d",
if(cycle.endsWith("M"),
(formula.cyclesNext * number(cycle)).abs().ceil() + "M",
if(cycle.endsWith("y"),
(formula.cyclesNext * number(cycle)).abs().ceil() + "y",
formula.cyclesNext + "d"
)
)
)
next-payment-date: |-
if(cycle == "lifetime", null,
if(startDate > now(), startDate,
if(endDate, endDate,
startDate + formula.cycleNextDuration
)
)
)
started: startDate.relative()
duration: if (endDate, endDate, now())-startDate
next-payment-duration: if (formula["next-payment-date"].date() == today(), "TODAY",date(formula["next-payment-date"]).relative())
isRenewing: endDate.isEmpty()
status: |-
if(cycle == "lifetime",
'lifetime',
if (startDate > now(),
"starts",
if (formula.isRenewing, "renews", if (endDate > now(), "ends", "ended"))
)+" "+formula["next-payment-duration"]
)
next-payment-days: |-
if(cycle == "lifetime", 0,
number((date(formula["next-payment-date"])-now()).days.toFixed(0))
)
cycleDays: |-
if(cycle == "lifetime", 'lifetime',
(date("1970-01-01")-formula.cycleDaysRounded-date("1970-01-01")).days.abs()
)
pricePerMonth: |-
if(cycle == "lifetime", (price / formula.duration.months).toFixed(2),
number((price/(formula.cycleDays)*31) + (if (shared, (formula["shared-adjustment"]),0))).toFixed(2)
)
priceInFuture: if(formula.willRenew && startDate < now(),formula.pricePerMonth,number(0).toFixed(2))
willRenew: |-
if(cycle == "lifetime", 'lifetime',
endDate == null || (endDate.relative() > now()+cycle)
)
totalCost: |-
if(cycle == "lifetime", price.toFixed(2),
if(startDate > now(),number(0).toFixed(2),(formula.cyclesStarted * number(price)).toFixed(2))
)
duration-precise: formula.duration.months.toFixed(2)
endDateOrForever: if (endDate, endDate, date('2099-01-01'))
cycleDaysRounded: duration(number(cycle).ceil().toString()+cycle.slice(-1))
durationSinceStart: (if(endDate, endDate,today()))-startDate
properties:
formula.enabled:
displayName: active
formula.price-adjusted:
displayName: price-adjusted
formula.next-payment-date:
displayName: next-payment-date
formula.started:
displayName: started
formula.cycleDays:
displayName: cycleDays
formula.priceInFuture:
displayName: priceThisMonth
views:
- type: table
name: Subscriptions
groupBy:
property: formula.enabled
direction: DESC
order:
- formula.icon
- file.name
- product
- formula.status
- formula.next-payment-date
- formula.cyclesStarted
- cycle
- price
- formula.pricePerMonth
- formula.priceInFuture
- formula.totalCost
- currency
- formula.started
- startDate
- endDate
- platform
- formula.duration
- formula.duration-precise
- account
- account-holder
- category
- tags
- shared
- share-price
- notes
- formula.cyclesNext
- formula.durationSinceStart
sort:
- property: formula.next-payment-date
direction: ASC
- property: cycle
direction: ASC
- property: file.name
direction: ASC
summaries:
price: Sum
formula.pricePerMonth: Total
formula.priceInFuture: Total
formula.totalCost: Total
columnSize:
formula.icon: 38
file.name: 204
note.product: 129
formula.status: 128
formula.next-payment-date: 106
formula.cyclesStarted: 51
note.cycle: 55
note.price: 62
formula.pricePerMonth: 61
formula.priceInFuture: 61
formula.totalCost: 73
note.currency: 55
note.endDate: 126
formula.duration-precise: 62
note.account: 172
note.account-holder: 53
note.category: 112
note.share-price: 67
note.notes: 204
- type: table
name: Subscriptions Active
filters:
and:
- formula.enabled == true
order:
- formula.icon
- file.name
- formula.status
- formula.next-payment-date
- cycle
- price
- formula.pricePerMonth
- currency
- formula.started
- endDate
- formula.duration
- account
- account-holder
- category
- tags
- shared
- share-price
- formula.price-adjusted
- notes
sort:
- property: formula.next-payment-date
direction: ASC
- property: file.name
direction: ASC
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.cycle: 47
formula.pricePerMonth: 58
note.currency: 55
note.endDate: 126
formula.duration_precise: 254
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
- type: table
name: Subscriptions Inactive
filters:
and:
- formula.enabled == false
order:
- formula.icon
- file.name
- endDate
- cycle
- price
- formula.pricePerMonth
- currency
- formula.started
- formula.duration
- account
- account-holder
- category
- tags
- shared
- share-price
- formula.price-adjusted
- notes
sort:
- property: endDate
direction: DESC
- property: formula.started
direction: ASC
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.cycle: 47
formula.pricePerMonth: 58
note.currency: 55
note.endDate: 126
formula.duration_precise: 254
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
- type: calendar
name: Renewals
filters:
and:
- formula.enabled == true
- formula.isRenewing == true
startDate: formula.next-payment-date
showICS_ics_q3765di1smf12p46b: false
showICS_ics_0k7qvgafnmghaso1i: false
- type: calendar
name: Ending
filters:
and:
- formula.isRenewing == false
startDate: formula.next-payment-date
- type: table
name: Subscriptions Soon
filters:
and:
- formula.enabled == true
order:
- formula.icon
- file.name
- formula.status
- formula.next-payment-date
- notes
sort:
- property: formula.next-payment-date
direction: ASC
limit: 4
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.currency: 55
note.cycle: 66
note.endDate: 126
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
- type: list
name: Subscriptions Soon List
filters:
and:
- formula.enabled == true
order:
- formula.icon
- file.name
- formula.status
- notes
- formula.next-payment-date
- price
sort:
- property: formula.next-payment-date
direction: ASC
limit: 3
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.currency: 55
note.cycle: 66
note.endDate: 126
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
separator: " "
markers: number
nestedProperties: false
indentProperties: false
- type: calendar
name: Opened Calendar
order:
- file.name
startDate: note.startDate
endDate: formula.endDateOrForever
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment