diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 8f84309dbe..12328a0cb9 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -4,9 +4,6 @@ "trailingComma": "all", "arrowParens": "avoid", "printWidth": 80, - "ignorePatterns": [ - "packages/docs/*" // TOOD: fixme; temporary - ], "experimentalSortImports": { "groups": [ "react", diff --git a/packages/docs/blog/2025-12-20-roadmap-for-2026.md b/packages/docs/blog/2025-12-20-roadmap-for-2026.md index bbf2da280e..926f9eddfb 100644 --- a/packages/docs/blog/2025-12-20-roadmap-for-2026.md +++ b/packages/docs/blog/2025-12-20-roadmap-for-2026.md @@ -15,11 +15,14 @@ Let's look back over the year and also look at what's to come. ## 2025 in review + It's always fun to look back and see all the progress made in Actual over the course of a year. It's easy to forget how many of the features we love weren't available back at the beginning of the year. ### New features + My favorites in approximately chronological order are: + - OIDC and multi-user support - Adjustable upcoming time frame for schedules - Multiple new report types @@ -34,7 +37,7 @@ My favorites in approximately chronological order are: - Budget Currencies (still experimental) - Quickly add single schedules from the account view -**Note on Translations:** Translations are a never-ending project. +**Note on Translations:** Translations are a never-ending project. Every month there are new or modified strings that need to be translated. We could use as many contributors to translation as we can get. If you are interested in helping translate Actual into other languages see [our translation guide]. @@ -43,6 +46,7 @@ If you remember our roadmap from last year, you will see that we were able to ac I will touch on that more below. ### Maintainer and contributor payments + This year we started paying small stipends to the core maintainer team, and giving out SWAG items to other contributors. The maintainer stipends are based on points received for doing the necessary, but not very exciting, parts of maintaining Actual. This is only possible because of the generous donations from you the users. @@ -65,9 +69,9 @@ Multiple prospective providers have reached out to us in just the last few month We plan on getting a proper GUI put together for these to make adding and editing templates less prone to error. This would also include the ability to predict the total needed to meet all set budget goals, see all active goals, and easily modify fill order. -**Mobile view feature parity**: The mobile view has received many updates this year but it still lacks a number of features that are available on desktop. We would like to bring that disparity down to close to 0 this year. +**Mobile view feature parity**: The mobile view has received many updates this year but it still lacks a number of features that are available on desktop. We would like to bring that disparity down to close to 0 this year. -**Rewrite the transaction table**: The transaction table is probably the most important feature of the app, even more so than the budget itself. +**Rewrite the transaction table**: The transaction table is probably the most important feature of the app, even more so than the budget itself. The code for the transaction table is complicated, and not conducive to new features. We plan to rewrite this code to be more maintainable, more accessible to new contributors, and more extendable for new features such as resizing columns. @@ -80,7 +84,6 @@ We will look at what other account types would make sense for the base app, but **Better and faster code tests**: We have stared work on upgrading our CI/CD to use Rust based tooling. This speeds up the tests immensely and makes development and testing faster. - (Remember to vote on the features you would like to see get added to Actual. Use this link to see [all open feature requests] and vote by reacting with πŸ‘) @@ -91,7 +94,6 @@ Happy Budgeting and have a happy new year! youngcw - #### How can I support the project? 1. contribute - fix issues, add features, write documentation, assist with support queries in discord, etc. diff --git a/packages/docs/docs/config/reverse-proxies.md b/packages/docs/docs/config/reverse-proxies.md index 6d3c558bef..10d2927a42 100644 --- a/packages/docs/docs/config/reverse-proxies.md +++ b/packages/docs/docs/config/reverse-proxies.md @@ -28,8 +28,8 @@ services: - ./caddy/data:/data - ./caddy/config:/config ports: - - "80:80" - - "443:443" + - '80:80' + - '443:443' actual-server: image: actualbudget/actual-server:latest @@ -58,21 +58,21 @@ services: image: traefik:latest restart: unless-stopped ports: - - "80:80" - - "443:443" + - '80:80' + - '443:443' volumes: - - "./traefik.yaml:/etc/traefik/traefik.yaml" - - "./traefik/data:/data" - - "/var/run/docker.sock:/var/run/docker.sock" + - './traefik.yaml:/etc/traefik/traefik.yaml' + - './traefik/data:/data' + - '/var/run/docker.sock:/var/run/docker.sock' actual-server: image: actualbudget/actual-server:latest restart: unless-stopped labels: - - "traefik.enable=true" - - "traefik.http.routers.actual-server.rule=Host(`budget.example.org`)" - - "traefik.http.routers.actual-server.entrypoints=websecure" - - "traefik.http.services.actual-server.loadbalancer.server.port=5006" + - 'traefik.enable=true' + - 'traefik.http.routers.actual-server.rule=Host(`budget.example.org`)' + - 'traefik.http.routers.actual-server.entrypoints=websecure' + - 'traefik.http.services.actual-server.loadbalancer.server.port=5006' volumes: - ./actual-data:/data ``` @@ -80,7 +80,7 @@ services: ```yaml title="traefik.yaml" entryPoints: web: - address: ":80" + address: ':80' http: redirections: entryPoint: @@ -88,7 +88,7 @@ entryPoints: scheme: https permanent: true websecure: - address: ":443" + address: ':443' http: tls: certResolver: le @@ -129,11 +129,12 @@ location / { add_header Cross-Origin-Embedder-Policy "require-corp" always; add_header Cross-Origin-Opener-Policy "same-origin" always; add_header Origin-Agent-Cluster "?1" always; - + proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } ``` + The SSL certificate is issued by Let's Encrypt. The [Certbot](https://certbot.eff.org/instructions) tool provides options for automatic updating upon expiration. At the very least you will need to adapt `server_name` and the `ssl_certificate/ssl_certificate_key` paths to match your setup. Please refer to their [official documentation](https://nginx.org/en/docs/) for further details. diff --git a/packages/docs/docs/contributing/i18n.md b/packages/docs/docs/contributing/i18n.md index 62d5399f32..77977f697f 100644 --- a/packages/docs/docs/contributing/i18n.md +++ b/packages/docs/docs/contributing/i18n.md @@ -90,13 +90,9 @@ Handling placeholder variables and pluralization within the `` React comp import { Trans } from 'react-i18next'; function MyComponent() { - const person = { name: "Pedro" }; + const person = { name: 'Pedro' }; // You can use an object literal within ! - return ( - - Your name is {{ name: person.name }}. - - ); + return Your name is {{ name: person.name }}.; // This will result in the translation string: // "Your name is {{name}}." } diff --git a/packages/docs/docs/contributing/writing-docs.md b/packages/docs/docs/contributing/writing-docs.md index cdb344595e..0ee1beeea1 100644 --- a/packages/docs/docs/contributing/writing-docs.md +++ b/packages/docs/docs/contributing/writing-docs.md @@ -61,7 +61,9 @@ It is important to note that both level 1 and level 2 headings are prominently d ```markdown ## Level 2 Markdown Heading: Main Section Headings are used to split the document into main sections + ### Level 3 Markdown Heading: Subsections Headings are used to split each section + #### Level 4 Markdown Heading: Use this if you need to split the Subsection further ``` diff --git a/packages/docs/docs/experimental/formulas.md b/packages/docs/docs/experimental/formulas.md index b5564abff0..2b5888363f 100644 --- a/packages/docs/docs/experimental/formulas.md +++ b/packages/docs/docs/experimental/formulas.md @@ -49,127 +49,127 @@ This list documents the functions that appear in the in-app **autocomplete/hover If a function isn’t listed here, it still might work. Actual uses HyperFormula under the hood, so you can also refer to [HyperFormula’s built-in functions list](https://hyperformula.handsontable.com/guide/built-in-functions.html). ::: -| Function | Available in | Description | Syntax example | Optional params | -|---|---|---|---|---| -| `ABS` | Query, Rules | Returns the absolute value of a number. | `=ABS(-42)` | β€” | -| `AND` | Query, Rules | Returns TRUE if all arguments are TRUE. | `=AND(1=1, 2=2)` | Accepts more than 2 conditions | -| `AVERAGE` | Query | Returns the average of all numbers in a range. | `=AVERAGE(1, 2, 3)` | Accepts more than 2 values | -| `AVERAGEA` | Query | Returns the average, including text and logical values. | `=AVERAGEA(1, TRUE, "2")` | Accepts more than 2 values | -| `CEILING` | Query, Rules | Rounds up to nearest multiple of significance. | `=CEILING(10.2, 1)` | β€” | -| `CHAR` | Query, Rules | Converts number to character. | `=CHAR(65)` | β€” | -| `CHOOSE` | Query | Returns value from list based on index. | `=CHOOSE(2, "A", "B", "C")` | Accepts more than 2 values | -| `CLEAN` | Rules | Removes non-printable characters from text. | `=CLEAN(notes)` | β€” | -| `CODE` | Query, Rules | Returns numeric code for first character. | `=CODE("A")` | β€” | -| `CONCATENATE` | Query, Rules | Combines several text strings into one. | `=CONCATENATE("Paid ", payee_name)` | Accepts more than 2 texts | -| `COS` | Query | Returns the cosine of an angle. | `=COS(1)` | β€” | -| `COUNT` | Query | Counts the number of numeric values. | `=COUNT(1, 2, "x")` | Accepts more than 2 values | -| `COUNTA` | Query | Counts non-empty values. | `=COUNTA(1, "", "x")` | Accepts more than 2 values | -| `COUNTBLANK` | Query | Counts empty cells. | `=COUNTBLANK(A1:A10)` | β€” | -| `COUNTIF` | Query | Counts cells that meet a criteria. | `=COUNTIF(A1:A10, ">0")` | β€” | -| `COUNTIFS` | Query | Counts cells that meet multiple criteria. | `=COUNTIFS(A1:A10, ">0", B1:B10, "<=5")` | Repeat `(range, criteria)` pairs | -| `DATE` | Query, Rules | Returns date as number of days since null date. | `=DATE(2025, 12, 16)` | β€” | -| `DATEDIF` | Query, Rules | Calculates distance between dates. | `=DATEDIF("2025-01-01", "2025-12-31", "D")` | β€” | -| `DATEVALUE` | Rules | Parses a date string and returns it as a number. | `=DATEVALUE("2025-12-16")` | β€” | -| `DAY` | Query, Rules | Returns the day from a date. | `=DAY(date)` | β€” | -| `DAYS` | Query, Rules | Calculates difference between dates in days. | `=DAYS("2025-12-31", "2025-12-01")` | β€” | -| `EDATE` | Query, Rules | Returns date shifted by specified months. | `=EDATE(date, 1)` | β€” | -| `EOMONTH` | Query, Rules | Returns last day of month after specified months. | `=EOMONTH(date, 0)` | β€” | -| `EXACT` | Query, Rules | Returns TRUE if texts are exactly the same. | `=EXACT("A", "a")` | β€” | -| `EXP` | Query | Returns e raised to the power of number. | `=EXP(1)` | β€” | -| `FALSE` | Query, Rules | Returns the logical value FALSE. | `=FALSE()` | β€” | -| `FIND` | Query, Rules | Finds text within text (case-sensitive). | `=FIND("foo", notes)` | β€” | -| `FLOOR` | Query, Rules | Rounds down to nearest multiple of significance. | `=FLOOR(10.8, 1)` | β€” | -| `FV` | Query | Calculates future value of investment. | `=FV(0.05/12, 12, -100)` | β€” | -| `HLOOKUP` | Query | Searches horizontally in first row and returns value. | `=HLOOKUP("key", A1:D10, 2, TRUE)` | β€” | -| `IF` | Query, Rules | Returns one value if condition is TRUE, another if FALSE. | `=IF(amount<0, "Expense", "Income")` | β€” | -| `IFERROR` | Query, Rules | Returns value if no error, otherwise returns alternative. | `=IFERROR(1/0, 0)` | β€” | -| `IFNA` | Query, Rules | Returns value if not #N/A error, otherwise returns alternative. | `=IFNA(VLOOKUP("x", A1:B10, 2, FALSE), 0)` | β€” | -| `IFS` | Query, Rules | Checks multiple conditions and returns corresponding values. | `=IFS(amount<0, "Expense", amount>0, "Income")` | Repeat `(condition, value)` pairs | -| `INDEX` | Query | Returns value at specified row and column. | `=INDEX(A1:C10, 2, 3)` | β€” | -| `INTEGER_TO_AMOUNT` | Query, Rules | Converts integer amount to decimal amount (e.g., 1234 -> 12.34). | `=INTEGER_TO_AMOUNT(amount, 2)` | `decimal_places` (default: 2) | -| `INT` | Rules | Rounds down to nearest integer. | `=INT(10.9)` | β€” | -| `IRR` | Query | Calculates internal rate of return. | `=IRR(A1:A12)` | β€” | -| `ISEVEN` | Rules | Returns TRUE if number is even. | `=ISEVEN(10)` | β€” | -| `ISODD` | Rules | Returns TRUE if number is odd. | `=ISODD(11)` | β€” | -| `ISBLANK` | Query, Rules | Returns TRUE if value is blank. | `=ISBLANK(notes)` | β€” | -| `ISERROR` | Query, Rules | Returns TRUE if value is any error. | `=ISERROR(1/0)` | β€” | -| `ISLOGICAL` | Query, Rules | Returns TRUE if value is logical (TRUE/FALSE). | `=ISLOGICAL(TRUE())` | β€” | -| `ISNA` | Query, Rules | Returns TRUE if value is #N/A error. | `=ISNA(NA())` | β€” | -| `ISNUMBER` | Query, Rules | Returns TRUE if value is a number. | `=ISNUMBER(amount)` | β€” | -| `ISOWEEKNUM` | Rules | Returns ISO week number. | `=ISOWEEKNUM(date)` | β€” | -| `ISREF` | Query, Rules | Returns TRUE if value is a reference. | `=ISREF(A1)` | β€” | -| `ISTEXT` | Query, Rules | Returns TRUE if value is text. | `=ISTEXT(notes)` | β€” | -| `LEFT` | Query, Rules | Returns leftmost characters from text. | `=LEFT(imported_payee, 10)` | β€” | -| `LEN` | Query, Rules | Returns length of text. | `=LEN(notes)` | β€” | -| `LN` | Query | Returns the natural logarithm. | `=LN(10)` | β€” | -| `LOG` | Query | Returns the logarithm to specified base. | `=LOG(100, 10)` | β€” | -| `LOG10` | Query | Returns the base-10 logarithm. | `=LOG10(1000)` | β€” | -| `LOOKUP` | Query | Looks up values in a vector or array. | `=LOOKUP("x", A1:A10)` | β€” | -| `LOWER` | Query, Rules | Converts text to lowercase. | `=LOWER(notes)` | β€” | -| `MATCH` | Query | Returns position of value in array. | `=MATCH("x", A1:A10, 0)` | β€” | -| `MAX` | Query | Returns the maximum value. | `=MAX(1, 2, 3)` | Accepts more than 2 values | -| `MAXA` | Query | Returns the maximum value, including text and logical values. | `=MAXA(1, TRUE, "2")` | Accepts more than 2 values | -| `MEDIAN` | Query | Returns the median value. | `=MEDIAN(1, 2, 100)` | Accepts more than 2 values | -| `MID` | Query, Rules | Returns substring from specified position. | `=MID(notes, 1, 10)` | β€” | -| `MIN` | Query | Returns the minimum value. | `=MIN(1, 2, 3)` | Accepts more than 2 values | -| `MINA` | Query | Returns the minimum value, including text and logical values. | `=MINA(1, TRUE, "2")` | Accepts more than 2 values | -| `MOD` | Query, Rules | Returns the remainder of division. | `=MOD(10, 3)` | β€” | -| `MODE` | Query | Returns the most frequently occurring value. | `=MODE(1, 1, 2)` | Accepts more than 2 values | -| `MONTH` | Query, Rules | Returns the month from a date. | `=MONTH(date)` | β€” | -| `N` | Rules | Converts value to a number. | `=N(TRUE())` | β€” | -| `NETWORKDAYS` | Query | Returns number of working days between dates. | `=NETWORKDAYS("2025-12-01", "2025-12-31")` | β€” | -| `NOT` | Query, Rules | Reverses the logical value. | `=NOT(amount<0)` | β€” | -| `NOW` | Query, Rules | Returns current date and time. | `=NOW()` | β€” | -| `NPV` | Query | Calculates net present value. | `=NPV(0.1, -1000, 200, 300)` | Accepts more than 2 values | -| `OR` | Query, Rules | Returns TRUE if any argument is TRUE. | `=OR(amount<0, amount>0)` | Accepts more than 2 conditions | -| `PERCENTILE` | Query | Returns the k-th percentile. | `=PERCENTILE(A1:A100, 0.9)` | β€” | -| `PI` | Query | Returns the value of PI. | `=PI()` | β€” | -| `PMT` | Query | Calculates payment for a loan. | `=PMT(0.05/12, 60, 10000)` | β€” | -| `POWER` | Query, Rules | Returns base raised to the power of exponent. | `=POWER(2, 8)` | β€” | -| `PROPER` | Query, Rules | Capitalizes first letter of each word. | `=PROPER(notes)` | β€” | -| `PRODUCT` | Query | Returns the product of all numbers. | `=PRODUCT(2, 3, 4)` | Accepts more than 2 values | -| `PV` | Query | Calculates present value of investment. | `=PV(0.05/12, 12, -100)` | β€” | -| `QUARTILE` | Query | Returns the quartile of a dataset. | `=QUARTILE(A1:A100, 1)` | β€” | -| `QUERY` | Query | Execute a query and return the result. | `=QUERY("expenses")` | β€” | -| `QUERY_COUNT` | Query | Execute a query and return the number of matching rows. | `=QUERY_COUNT("expenses")` | β€” | -| `RANK` | Query | Returns the rank of a number in a list. | `=RANK(10, A1:A10, 0)` | β€” | -| `RATE` | Query | Calculates interest rate per period. | `=RATE(60, -200, 10000)` | β€” | -| `REPLACE` | Query, Rules | Replaces substring at specified position. | `=REPLACE(notes, 1, 5, "")` | β€” | -| `REPT` | Query, Rules | Repeats text specified number of times. | `=REPT("*", 10)` | β€” | -| `RIGHT` | Query, Rules | Returns rightmost characters from text. | `=RIGHT(imported_payee, 4)` | β€” | -| `ROUND` | Query, Rules | Rounds a number to specified decimals. | `=ROUND(amount/100, 2)` | β€” | -| `ROUNDDOWN` | Query, Rules | Rounds down to specified decimals. | `=ROUNDDOWN(amount/100, 0)` | β€” | -| `ROUNDUP` | Query, Rules | Rounds up to specified decimals. | `=ROUNDUP(amount/100, 0)` | β€” | -| `SEARCH` | Query, Rules | Finds text within text (case-insensitive, supports wildcards). | `=SEARCH("foo", notes)` | β€” | -| `SIGN` | Rules | Returns -1 for negative, 0 for zero, 1 for positive. | `=SIGN(amount)` | β€” | -| `SIN` | Query | Returns the sine of an angle. | `=SIN(1)` | β€” | -| `SPLIT` | Rules | Splits text by space and returns part at index. | `=SPLIT(imported_payee, 0)` | β€” | -| `SQRT` | Query, Rules | Returns the square root. | `=SQRT(9)` | β€” | -| `STDEV` | Query | Returns the standard deviation of a sample. | `=STDEV(A1:A10)` | β€” | -| `STDEVP` | Query | Returns the standard deviation of a population. | `=STDEVP(A1:A10)` | β€” | -| `SUBSTITUTE` | Query, Rules | Replaces occurrences of text. | `=SUBSTITUTE(imported_payee, " 12345", "")` | β€” | -| `SUM` | Query, Rules | Returns the sum of all numbers in a range. | `=SUM(1, 2, 3)` | Accepts more than 2 values | -| `SUMIF` | Query | Sums cells that meet a criteria. | `=SUMIF(A1:A10, ">0", B1:B10)` | β€” | -| `SUMIFS` | Query | Sums cells that meet multiple criteria. | `=SUMIFS(B1:B10, A1:A10, ">0", C1:C10, "X")` | Repeat `(range, criteria)` pairs | -| `SUMPRODUCT` | Query | Multiplies corresponding elements and returns the sum. | `=SUMPRODUCT(A1:A10, B1:B10)` | Accepts more arrays | -| `SUMSQ` | Query | Returns the sum of the squares. | `=SUMSQ(1, 2, 3)` | Accepts more than 2 values | -| `SWITCH` | Query, Rules | Matches expression against values and returns corresponding result. | `=SWITCH(category_name, "Groceries", "Food", "Fuel", "Transport")` | Repeat `(value, result)` pairs; default supported | -| `T` | Rules | Returns text if value is text, empty string otherwise. | `=T(notes)` | β€” | -| `TAN` | Query | Returns the tangent of an angle. | `=TAN(1)` | β€” | -| `TEXT` | Query, Rules | Converts number to text with format. | `=TEXT(date, "MMMM yyyy")` | β€” | -| `TODAY` | Query, Rules | Returns current date. | `=TODAY()` | β€” | -| `TRIM` | Query, Rules | Removes extra spaces from text. | `=TRIM(notes)` | β€” | -| `TRUNC` | Rules | Truncates number to specified decimals. | `=TRUNC(amount/100, 0)` | β€” | -| `TRUE` | Query, Rules | Returns the logical value TRUE. | `=TRUE()` | β€” | -| `UPPER` | Query, Rules | Converts text to uppercase. | `=UPPER(notes)` | β€” | -| `VALUE` | Rules | Converts text to a number. | `=VALUE("123.45")` | β€” | -| `VAR` | Query | Returns the variance of a sample. | `=VAR(A1:A10)` | β€” | -| `VARP` | Query | Returns the variance of a population. | `=VARP(A1:A10)` | β€” | -| `VLOOKUP` | Query | Searches vertically in first column and returns value. | `=VLOOKUP("key", A1:D10, 2, TRUE)` | β€” | -| `WEEKDAY` | Query, Rules | Returns day of week (1-7). | `=WEEKDAY(date, 1)` | β€” | -| `WEEKNUM` | Query, Rules | Returns week number of year. | `=WEEKNUM(date, 1)` | β€” | -| `XOR` | Query, Rules | Returns TRUE if odd number of arguments are TRUE. | `=XOR(TRUE(), FALSE())` | Accepts more than 2 conditions | -| `YEAR` | Query, Rules | Returns the year from a date. | `=YEAR(date)` | β€” | +| Function | Available in | Description | Syntax example | Optional params | +| ------------------- | ------------ | ------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------- | +| `ABS` | Query, Rules | Returns the absolute value of a number. | `=ABS(-42)` | β€” | +| `AND` | Query, Rules | Returns TRUE if all arguments are TRUE. | `=AND(1=1, 2=2)` | Accepts more than 2 conditions | +| `AVERAGE` | Query | Returns the average of all numbers in a range. | `=AVERAGE(1, 2, 3)` | Accepts more than 2 values | +| `AVERAGEA` | Query | Returns the average, including text and logical values. | `=AVERAGEA(1, TRUE, "2")` | Accepts more than 2 values | +| `CEILING` | Query, Rules | Rounds up to nearest multiple of significance. | `=CEILING(10.2, 1)` | β€” | +| `CHAR` | Query, Rules | Converts number to character. | `=CHAR(65)` | β€” | +| `CHOOSE` | Query | Returns value from list based on index. | `=CHOOSE(2, "A", "B", "C")` | Accepts more than 2 values | +| `CLEAN` | Rules | Removes non-printable characters from text. | `=CLEAN(notes)` | β€” | +| `CODE` | Query, Rules | Returns numeric code for first character. | `=CODE("A")` | β€” | +| `CONCATENATE` | Query, Rules | Combines several text strings into one. | `=CONCATENATE("Paid ", payee_name)` | Accepts more than 2 texts | +| `COS` | Query | Returns the cosine of an angle. | `=COS(1)` | β€” | +| `COUNT` | Query | Counts the number of numeric values. | `=COUNT(1, 2, "x")` | Accepts more than 2 values | +| `COUNTA` | Query | Counts non-empty values. | `=COUNTA(1, "", "x")` | Accepts more than 2 values | +| `COUNTBLANK` | Query | Counts empty cells. | `=COUNTBLANK(A1:A10)` | β€” | +| `COUNTIF` | Query | Counts cells that meet a criteria. | `=COUNTIF(A1:A10, ">0")` | β€” | +| `COUNTIFS` | Query | Counts cells that meet multiple criteria. | `=COUNTIFS(A1:A10, ">0", B1:B10, "<=5")` | Repeat `(range, criteria)` pairs | +| `DATE` | Query, Rules | Returns date as number of days since null date. | `=DATE(2025, 12, 16)` | β€” | +| `DATEDIF` | Query, Rules | Calculates distance between dates. | `=DATEDIF("2025-01-01", "2025-12-31", "D")` | β€” | +| `DATEVALUE` | Rules | Parses a date string and returns it as a number. | `=DATEVALUE("2025-12-16")` | β€” | +| `DAY` | Query, Rules | Returns the day from a date. | `=DAY(date)` | β€” | +| `DAYS` | Query, Rules | Calculates difference between dates in days. | `=DAYS("2025-12-31", "2025-12-01")` | β€” | +| `EDATE` | Query, Rules | Returns date shifted by specified months. | `=EDATE(date, 1)` | β€” | +| `EOMONTH` | Query, Rules | Returns last day of month after specified months. | `=EOMONTH(date, 0)` | β€” | +| `EXACT` | Query, Rules | Returns TRUE if texts are exactly the same. | `=EXACT("A", "a")` | β€” | +| `EXP` | Query | Returns e raised to the power of number. | `=EXP(1)` | β€” | +| `FALSE` | Query, Rules | Returns the logical value FALSE. | `=FALSE()` | β€” | +| `FIND` | Query, Rules | Finds text within text (case-sensitive). | `=FIND("foo", notes)` | β€” | +| `FLOOR` | Query, Rules | Rounds down to nearest multiple of significance. | `=FLOOR(10.8, 1)` | β€” | +| `FV` | Query | Calculates future value of investment. | `=FV(0.05/12, 12, -100)` | β€” | +| `HLOOKUP` | Query | Searches horizontally in first row and returns value. | `=HLOOKUP("key", A1:D10, 2, TRUE)` | β€” | +| `IF` | Query, Rules | Returns one value if condition is TRUE, another if FALSE. | `=IF(amount<0, "Expense", "Income")` | β€” | +| `IFERROR` | Query, Rules | Returns value if no error, otherwise returns alternative. | `=IFERROR(1/0, 0)` | β€” | +| `IFNA` | Query, Rules | Returns value if not #N/A error, otherwise returns alternative. | `=IFNA(VLOOKUP("x", A1:B10, 2, FALSE), 0)` | β€” | +| `IFS` | Query, Rules | Checks multiple conditions and returns corresponding values. | `=IFS(amount<0, "Expense", amount>0, "Income")` | Repeat `(condition, value)` pairs | +| `INDEX` | Query | Returns value at specified row and column. | `=INDEX(A1:C10, 2, 3)` | β€” | +| `INTEGER_TO_AMOUNT` | Query, Rules | Converts integer amount to decimal amount (e.g., 1234 -> 12.34). | `=INTEGER_TO_AMOUNT(amount, 2)` | `decimal_places` (default: 2) | +| `INT` | Rules | Rounds down to nearest integer. | `=INT(10.9)` | β€” | +| `IRR` | Query | Calculates internal rate of return. | `=IRR(A1:A12)` | β€” | +| `ISEVEN` | Rules | Returns TRUE if number is even. | `=ISEVEN(10)` | β€” | +| `ISODD` | Rules | Returns TRUE if number is odd. | `=ISODD(11)` | β€” | +| `ISBLANK` | Query, Rules | Returns TRUE if value is blank. | `=ISBLANK(notes)` | β€” | +| `ISERROR` | Query, Rules | Returns TRUE if value is any error. | `=ISERROR(1/0)` | β€” | +| `ISLOGICAL` | Query, Rules | Returns TRUE if value is logical (TRUE/FALSE). | `=ISLOGICAL(TRUE())` | β€” | +| `ISNA` | Query, Rules | Returns TRUE if value is #N/A error. | `=ISNA(NA())` | β€” | +| `ISNUMBER` | Query, Rules | Returns TRUE if value is a number. | `=ISNUMBER(amount)` | β€” | +| `ISOWEEKNUM` | Rules | Returns ISO week number. | `=ISOWEEKNUM(date)` | β€” | +| `ISREF` | Query, Rules | Returns TRUE if value is a reference. | `=ISREF(A1)` | β€” | +| `ISTEXT` | Query, Rules | Returns TRUE if value is text. | `=ISTEXT(notes)` | β€” | +| `LEFT` | Query, Rules | Returns leftmost characters from text. | `=LEFT(imported_payee, 10)` | β€” | +| `LEN` | Query, Rules | Returns length of text. | `=LEN(notes)` | β€” | +| `LN` | Query | Returns the natural logarithm. | `=LN(10)` | β€” | +| `LOG` | Query | Returns the logarithm to specified base. | `=LOG(100, 10)` | β€” | +| `LOG10` | Query | Returns the base-10 logarithm. | `=LOG10(1000)` | β€” | +| `LOOKUP` | Query | Looks up values in a vector or array. | `=LOOKUP("x", A1:A10)` | β€” | +| `LOWER` | Query, Rules | Converts text to lowercase. | `=LOWER(notes)` | β€” | +| `MATCH` | Query | Returns position of value in array. | `=MATCH("x", A1:A10, 0)` | β€” | +| `MAX` | Query | Returns the maximum value. | `=MAX(1, 2, 3)` | Accepts more than 2 values | +| `MAXA` | Query | Returns the maximum value, including text and logical values. | `=MAXA(1, TRUE, "2")` | Accepts more than 2 values | +| `MEDIAN` | Query | Returns the median value. | `=MEDIAN(1, 2, 100)` | Accepts more than 2 values | +| `MID` | Query, Rules | Returns substring from specified position. | `=MID(notes, 1, 10)` | β€” | +| `MIN` | Query | Returns the minimum value. | `=MIN(1, 2, 3)` | Accepts more than 2 values | +| `MINA` | Query | Returns the minimum value, including text and logical values. | `=MINA(1, TRUE, "2")` | Accepts more than 2 values | +| `MOD` | Query, Rules | Returns the remainder of division. | `=MOD(10, 3)` | β€” | +| `MODE` | Query | Returns the most frequently occurring value. | `=MODE(1, 1, 2)` | Accepts more than 2 values | +| `MONTH` | Query, Rules | Returns the month from a date. | `=MONTH(date)` | β€” | +| `N` | Rules | Converts value to a number. | `=N(TRUE())` | β€” | +| `NETWORKDAYS` | Query | Returns number of working days between dates. | `=NETWORKDAYS("2025-12-01", "2025-12-31")` | β€” | +| `NOT` | Query, Rules | Reverses the logical value. | `=NOT(amount<0)` | β€” | +| `NOW` | Query, Rules | Returns current date and time. | `=NOW()` | β€” | +| `NPV` | Query | Calculates net present value. | `=NPV(0.1, -1000, 200, 300)` | Accepts more than 2 values | +| `OR` | Query, Rules | Returns TRUE if any argument is TRUE. | `=OR(amount<0, amount>0)` | Accepts more than 2 conditions | +| `PERCENTILE` | Query | Returns the k-th percentile. | `=PERCENTILE(A1:A100, 0.9)` | β€” | +| `PI` | Query | Returns the value of PI. | `=PI()` | β€” | +| `PMT` | Query | Calculates payment for a loan. | `=PMT(0.05/12, 60, 10000)` | β€” | +| `POWER` | Query, Rules | Returns base raised to the power of exponent. | `=POWER(2, 8)` | β€” | +| `PROPER` | Query, Rules | Capitalizes first letter of each word. | `=PROPER(notes)` | β€” | +| `PRODUCT` | Query | Returns the product of all numbers. | `=PRODUCT(2, 3, 4)` | Accepts more than 2 values | +| `PV` | Query | Calculates present value of investment. | `=PV(0.05/12, 12, -100)` | β€” | +| `QUARTILE` | Query | Returns the quartile of a dataset. | `=QUARTILE(A1:A100, 1)` | β€” | +| `QUERY` | Query | Execute a query and return the result. | `=QUERY("expenses")` | β€” | +| `QUERY_COUNT` | Query | Execute a query and return the number of matching rows. | `=QUERY_COUNT("expenses")` | β€” | +| `RANK` | Query | Returns the rank of a number in a list. | `=RANK(10, A1:A10, 0)` | β€” | +| `RATE` | Query | Calculates interest rate per period. | `=RATE(60, -200, 10000)` | β€” | +| `REPLACE` | Query, Rules | Replaces substring at specified position. | `=REPLACE(notes, 1, 5, "")` | β€” | +| `REPT` | Query, Rules | Repeats text specified number of times. | `=REPT("*", 10)` | β€” | +| `RIGHT` | Query, Rules | Returns rightmost characters from text. | `=RIGHT(imported_payee, 4)` | β€” | +| `ROUND` | Query, Rules | Rounds a number to specified decimals. | `=ROUND(amount/100, 2)` | β€” | +| `ROUNDDOWN` | Query, Rules | Rounds down to specified decimals. | `=ROUNDDOWN(amount/100, 0)` | β€” | +| `ROUNDUP` | Query, Rules | Rounds up to specified decimals. | `=ROUNDUP(amount/100, 0)` | β€” | +| `SEARCH` | Query, Rules | Finds text within text (case-insensitive, supports wildcards). | `=SEARCH("foo", notes)` | β€” | +| `SIGN` | Rules | Returns -1 for negative, 0 for zero, 1 for positive. | `=SIGN(amount)` | β€” | +| `SIN` | Query | Returns the sine of an angle. | `=SIN(1)` | β€” | +| `SPLIT` | Rules | Splits text by space and returns part at index. | `=SPLIT(imported_payee, 0)` | β€” | +| `SQRT` | Query, Rules | Returns the square root. | `=SQRT(9)` | β€” | +| `STDEV` | Query | Returns the standard deviation of a sample. | `=STDEV(A1:A10)` | β€” | +| `STDEVP` | Query | Returns the standard deviation of a population. | `=STDEVP(A1:A10)` | β€” | +| `SUBSTITUTE` | Query, Rules | Replaces occurrences of text. | `=SUBSTITUTE(imported_payee, " 12345", "")` | β€” | +| `SUM` | Query, Rules | Returns the sum of all numbers in a range. | `=SUM(1, 2, 3)` | Accepts more than 2 values | +| `SUMIF` | Query | Sums cells that meet a criteria. | `=SUMIF(A1:A10, ">0", B1:B10)` | β€” | +| `SUMIFS` | Query | Sums cells that meet multiple criteria. | `=SUMIFS(B1:B10, A1:A10, ">0", C1:C10, "X")` | Repeat `(range, criteria)` pairs | +| `SUMPRODUCT` | Query | Multiplies corresponding elements and returns the sum. | `=SUMPRODUCT(A1:A10, B1:B10)` | Accepts more arrays | +| `SUMSQ` | Query | Returns the sum of the squares. | `=SUMSQ(1, 2, 3)` | Accepts more than 2 values | +| `SWITCH` | Query, Rules | Matches expression against values and returns corresponding result. | `=SWITCH(category_name, "Groceries", "Food", "Fuel", "Transport")` | Repeat `(value, result)` pairs; default supported | +| `T` | Rules | Returns text if value is text, empty string otherwise. | `=T(notes)` | β€” | +| `TAN` | Query | Returns the tangent of an angle. | `=TAN(1)` | β€” | +| `TEXT` | Query, Rules | Converts number to text with format. | `=TEXT(date, "MMMM yyyy")` | β€” | +| `TODAY` | Query, Rules | Returns current date. | `=TODAY()` | β€” | +| `TRIM` | Query, Rules | Removes extra spaces from text. | `=TRIM(notes)` | β€” | +| `TRUNC` | Rules | Truncates number to specified decimals. | `=TRUNC(amount/100, 0)` | β€” | +| `TRUE` | Query, Rules | Returns the logical value TRUE. | `=TRUE()` | β€” | +| `UPPER` | Query, Rules | Converts text to uppercase. | `=UPPER(notes)` | β€” | +| `VALUE` | Rules | Converts text to a number. | `=VALUE("123.45")` | β€” | +| `VAR` | Query | Returns the variance of a sample. | `=VAR(A1:A10)` | β€” | +| `VARP` | Query | Returns the variance of a population. | `=VARP(A1:A10)` | β€” | +| `VLOOKUP` | Query | Searches vertically in first column and returns value. | `=VLOOKUP("key", A1:D10, 2, TRUE)` | β€” | +| `WEEKDAY` | Query, Rules | Returns day of week (1-7). | `=WEEKDAY(date, 1)` | β€” | +| `WEEKNUM` | Query, Rules | Returns week number of year. | `=WEEKNUM(date, 1)` | β€” | +| `XOR` | Query, Rules | Returns TRUE if odd number of arguments are TRUE. | `=XOR(TRUE(), FALSE())` | Accepts more than 2 conditions | +| `YEAR` | Query, Rules | Returns the year from a date. | `=YEAR(date)` | β€” | ### Use queries with `QUERY("name")` and `QUERY_COUNT("name")` @@ -223,10 +223,12 @@ In **More -> Rules -> edit a rule**, on a **Set** action: Rule formulas evaluate with named variables from the transaction context, including: **Date variables:** + - `today` β€” Current date in YYYY-MM-DD format (e.g., `"2025-12-19"`) - `date` β€” Transaction date in YYYY-MM-DD format (e.g., `"2025-01-15"`) **Numeric variables (stored in cents):** + - `amount` β€” Transaction amount as an integer in cents (e.g., `12345` represents $123.45) - Positive for income, negative for expenses - To convert to dollars: `=amount / 100` @@ -235,6 +237,7 @@ Rule formulas evaluate with named variables from the transaction context, includ - To convert to dollars: `=balance / 100` **Text variables:** + - `notes` β€” Transaction notes/memo field (string, may be empty) - `imported_payee` β€” Original payee name from import before any rules applied (string) - `payee_name` β€” Resolved payee name (string) @@ -242,6 +245,7 @@ Rule formulas evaluate with named variables from the transaction context, includ - `category_name` β€” Category name assigned to transaction (string) **Boolean variables:** + - `cleared` β€” Whether transaction is cleared (`TRUE` or `FALSE`) - `reconciled` β€” Whether transaction is reconciled (`TRUE` or `FALSE`) @@ -255,5 +259,3 @@ When a rule runs, Actual converts the formula result to the field type: - **date fields**: must produce a valid date - **boolean fields**: `TRUE`/`FALSE` (or a string that equals `"true"`/`"false"`) - **string fields**: converted with `String(...)` - - diff --git a/packages/docs/docs/experimental/goal-templates.md b/packages/docs/docs/experimental/goal-templates.md index 5d67e41edf..f2310861cd 100644 --- a/packages/docs/docs/experimental/goal-templates.md +++ b/packages/docs/docs/experimental/goal-templates.md @@ -175,10 +175,10 @@ With this style the template budgets whatever it takes to hit a "full" amount. Here is how it works: -| Syntax | Previous Balance | Budgeted Amount | New Balance | -| ---------------------- | :--------------: | :-------------: | :---------: | -| `#template up to 150` | $ 10 | $ 140 | $ 150 | -| `#template up to 150` | $ -20 | $ 170 | $ 150 | +| Syntax | Previous Balance | Budgeted Amount | New Balance | +| --------------------- | :--------------: | :-------------: | :---------: | +| `#template up to 150` | $ 10 | $ 140 | $ 150 | +| `#template up to 150` | $ -20 | $ 170 | $ 150 | Cool, right? This is another way to gracefully handle categories that have month-to-month variation. This will always give you the same amount available each month no matter what you spend the previous month and not ever build up more funds than you need. @@ -189,7 +189,7 @@ They are simple enough to use easily, but are robust enough to make budgeting mu - **No more than one** template that uses `up to` is allowed in any single category. - If a category contains an `up to X`, the whole category will be subject to that limit even if there are other templates and priorities. - + #### All Variations There is more flexibility with the limit part of the template. @@ -263,15 +263,15 @@ The table below shows how this works. Below is a table of the variations of the By template. -| Syntax | Description | Example Application | -| ------------------------------------------------------------------ | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| `#template 500 by 2027-03` | Break down large, less-frequent expenses into manageable monthly expenses | Saving for a replacement car in a few years | -| `#template 500 by 2025-03 repeat every 6 months` | Break down large, less-frequent expenses into manageable monthly expenses | Biannual credit card fees | -| `#template 500 by 2025-03 repeat every year` | Break down large, less-frequent expenses into manageable monthly expenses | Annual insurance premium | -| `#template 500 by 2025-03 repeat every 2 years` | Break down large, less-frequent expenses into manageable monthly expenses | Domain name renewal | -| `#template 500 by 2024-12 spend from 2024-03` | Budget 500 by December. Any spending between March and December is OK | Christmas presents, overseas holiday, or any other expenses where spending will start before the target period ends. | -| `#template 500 by 2024-12 spend from 2024-03 repeat every year` | Budget 500 by December. Any spending is OK starting in March and repeat this template every year | Christmas presents, etc. | -| `#template 500 by 2024-12 spend from 2024-03 repeat every 2 years` | Budget 500 by December. Any spending is OK starting in March and repeat this template in 2026 (skip 2025) | Christmas travel every other year | +| Syntax | Description | Example Application | +| ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `#template 500 by 2027-03` | Break down large, less-frequent expenses into manageable monthly expenses | Saving for a replacement car in a few years | +| `#template 500 by 2025-03 repeat every 6 months` | Break down large, less-frequent expenses into manageable monthly expenses | Biannual credit card fees | +| `#template 500 by 2025-03 repeat every year` | Break down large, less-frequent expenses into manageable monthly expenses | Annual insurance premium | +| `#template 500 by 2025-03 repeat every 2 years` | Break down large, less-frequent expenses into manageable monthly expenses | Domain name renewal | +| `#template 500 by 2024-12 spend from 2024-03` | Budget 500 by December. Any spending between March and December is OK | Christmas presents, overseas holiday, or any other expenses where spending will start before the target period ends. | +| `#template 500 by 2024-12 spend from 2024-03 repeat every year` | Budget 500 by December. Any spending is OK starting in March and repeat this template every year | Christmas presents, etc. | +| `#template 500 by 2024-12 spend from 2024-03 repeat every 2 years` | Budget 500 by December. Any spending is OK starting in March and repeat this template in 2026 (skip 2025) | Christmas travel every other year | ### Periodic Type @@ -352,13 +352,13 @@ The previous option is not available when using the percent of available funds t Below is a table of the variations of the Percent template. -| Syntax | Description | Example Application | -| -------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -| `#template 15% of all income` | Budget 15% of all income categories | Using a "pay yourself first" strategy | -| `#template 10% of Paycheck` | Budget 10% of the "Paycheck" income category | Using a "pay yourself first" strategy, ignoring other income categories | -| `#template 15% of previous all income` | Budget 15% of all income categories using last month's income | Using a "pay yourself first" strategy in conjunction with a "month ahead" strategy | -| `#template 10% of previous Paycheck` | Budget 10% of last month's "Paycheck" income category | Using a "pay yourself first" strategy in conjunction with a "month ahead" strategy, ignoring other income categories | -| `#template 12% of available funds` | Budget 12% of "To Budget" funds available at the current priority level | | +| Syntax | Description | Example Application | +| -------------------------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `#template 15% of all income` | Budget 15% of all income categories | Using a "pay yourself first" strategy | +| `#template 10% of Paycheck` | Budget 10% of the "Paycheck" income category | Using a "pay yourself first" strategy, ignoring other income categories | +| `#template 15% of previous all income` | Budget 15% of all income categories using last month's income | Using a "pay yourself first" strategy in conjunction with a "month ahead" strategy | +| `#template 10% of previous Paycheck` | Budget 10% of last month's "Paycheck" income category | Using a "pay yourself first" strategy in conjunction with a "month ahead" strategy, ignoring other income categories | +| `#template 12% of available funds` | Budget 12% of "To Budget" funds available at the current priority level | | ### Schedule Type @@ -367,9 +367,9 @@ This includes sub-monthly, month, and extra-monthly schedules. This is the most common template outside of the Simple template. Below is an example of the syntax for a $ 100 per month schedule called "Internet", and a $ 2,400 per year schedule called "Taxes". -| Syntax | Budgeted Amount | Note | -| ----------------------------- | :-------------: | :------------------------------------------------: | -| `#template schedule Internet` | $ 100 | Budget for the "Internet" schedule | +| Syntax | Budgeted Amount | Note | +| ----------------------------- | :-------------: | :--------------------------------------------------------: | +| `#template schedule Internet` | $ 100 | Budget for the "Internet" schedule | | `#template schedule Taxes` | $ 200 | Build up funds for the "Taxes" schedule that is a year out | The function of the schedule template is very similar to the By template, but you don't need to adjust both a schedule and a template individually. @@ -408,7 +408,7 @@ As an example, assume the amount Scheduled for 'Insurance' the prior year was $ | Category | Template line | Budgeted Amount | | --------- | --------------------------------------------- | :-------------: | -| Insurance | `#template schedule Insurance [increase 20%]` | $ 100 | +| Insurance | `#template schedule Insurance [increase 20%]` | $ 100 | When "Insurance" comes due at the end of the year, $1200 will be available. @@ -464,29 +464,29 @@ All of the examples below use the case of 100 leftover when the remainder pass i | Category | Template line | Amount applied | | -------- | --------------------- | :------------: | -| Savings | `#template remainder` | 100 | +| Savings | `#template remainder` | 100 | 2. Split funds evenly between two categories. | Category | Template line | Amount applied | | ------------- | --------------------- | :------------: | -| Savings | `#template remainder` | 50 | -| Vacation Fund | `#template remainder` | 50 | +| Savings | `#template remainder` | 50 | +| Vacation Fund | `#template remainder` | 50 | 3. Split funds with one category receiving extra. | Category | Template line | Amount applied | | ------------- | ----------------------- | :------------: | -| Savings | `#template remainder 2` | 66.66 | -| Vacation Fund | `#template remainder` | 33.34 | +| Savings | `#template remainder 2` | 66.66 | +| Vacation Fund | `#template remainder` | 33.34 | 4. Spread funds over many categories, but some have limits. | Category | Template line | Amount applied | | --------------- | -------------------------------- | :------------: | -| Snack Fund | `#template remainder 3 up to 40` | 40.00 | -| Vacation Fund | `#template remainder` | 21.66 | -| Investment Fund | `#template remainder 2` | 38.34 | +| Snack Fund | `#template remainder 3 up to 40` | 40.00 | +| Vacation Fund | `#template remainder` | 21.66 | +| Investment Fund | `#template remainder 2` | 38.34 | Notes on using the remainder template: @@ -517,13 +517,13 @@ If you run the template, you get the following: | Template Line(s) | Amount budgeted | Balance (color) | | :--------------- | :-------------: | :-------------: | -| `#goal 500` | 0 | 400 (yellow) | +| `#goal 500` | 0 | 400 (yellow) | If you were able to budget 100 this month, you would then hit your goal and get a green indication. | Template Line(s) | Amount budgeted | Balance (color) | | :--------------- | :-------------: | :-------------: | -| `#goal 500` | 100 | 500 (green) | +| `#goal 500` | 100 | 500 (green) | **2. I'm saving for a purchase, but I will budget 50 a month until I reach my goal.** In this example, a template is used to automatically budget 50 into the category when templates are run. @@ -532,7 +532,7 @@ If you run templates, you get the following: | Template Line(s) | Amount budgeted | Balance (color) | | :-------------------------------- | :-------------: | :-------------: | -| `#template 50`
`#goal 500` | 50 | 450 (yellow) | +| `#template 50`
`#goal 500` | 50 | 450 (yellow) | If you have some extra funds after templates are run and can budget that last 50, you get the following: diff --git a/packages/docs/docs/getting-started/tips-tricks.md b/packages/docs/docs/getting-started/tips-tricks.md index a9bdbbcdc0..6b520a2ecb 100644 --- a/packages/docs/docs/getting-started/tips-tricks.md +++ b/packages/docs/docs/getting-started/tips-tricks.md @@ -43,7 +43,7 @@ through the list of available commands. You can also quickly move to any of the - (zero) View the current month. - View the previous month. - View the next month. - + ### Account page shortcuts - Initiate bank sync. @@ -60,7 +60,7 @@ through the list of available commands. You can also quickly move to any of the - or With a transaction selected, move to the next transaction up. Hold to scroll up. #### Transaction shortcuts - + - when editing will move down. In a dropdown, this will save the value and close the dropdown. in either the Payment or Deposit columns this will add the transaction; the form remains open for the next addition. - when editing will move up. In a dropdown, this will save the value and close the dropdown. - will add the transaction and close the form regardless of where you are editing. diff --git a/packages/docs/docusaurus.config.js b/packages/docs/docusaurus.config.js index 8d87978154..a07330f684 100644 --- a/packages/docs/docusaurus.config.js +++ b/packages/docs/docusaurus.config.js @@ -196,7 +196,7 @@ module.exports = { max: 1030, // max resized image's size. min: 640, // min resized image's size. if original is lower, use that size. steps: 2, // the max number of images generated between min and max (inclusive) - disableInDev: false + disableInDev: false, }, ], [ diff --git a/packages/docs/src/pages/index.jsx b/packages/docs/src/pages/index.jsx index c40f70823f..73367215e1 100644 --- a/packages/docs/src/pages/index.jsx +++ b/packages/docs/src/pages/index.jsx @@ -8,10 +8,15 @@ import classes from './index.module.css'; export default function Hello() { const title = 'Your Finances β€” made simple'; - const pageDescription = 'Actual Budget is a super fast and privacy-focused app for managing your finances. At its heart is the well proven and much loved Envelope Budgeting methodology.'; + const pageDescription = + 'Actual Budget is a super fast and privacy-focused app for managing your finances. At its heart is the well proven and much loved Envelope Budgeting methodology.'; return ( - +
diff --git a/upcoming-release-notes/6720.md b/upcoming-release-notes/6720.md new file mode 100644 index 0000000000..2f98b4d9cb --- /dev/null +++ b/upcoming-release-notes/6720.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [MatissJanis] +--- + +lint: enable oxfmt on the docs package