---
title: "doo.environment"
url: "https://help.tabidoo.cloud/en/article/dooenvironment"
language: "en"
last_updated: "2026-09-01T11:38:16.504Z"
---

# doo.environment

Information about the Tabidoo environment.

## currentApplication

Information about the current application. It contains the application ID, name, header, parameters, and information about the currently opened table.

#### **doo.environment.currentApplication**  
 

```typescript
const currentApplication = doo.environment.currentApplication;
console.log(currentApplication);
```

You can use it to get basic information about the current application.

**Get the current application ID:**

```typescript
const appId = doo.environment.currentApplication.id;
console.log(appId); // "11111-0612-476b-b211-5512f49b1111"
```

**Get the current application name:**

```typescript
const appName = doo.environment.currentApplication.name;
console.log(appName); // tabidoo
```

**Get the current application header:**

```typescript
const appHeader = doo.environment.currentApplication.header;
console.log(appHeader); // "Tabidoo"
```

**Get application parameters:**

```typescript
const params = doo.environment.currentApplication.params;
console.log(params); // {parameters: {name: "Test app",number: 1000}}
```

**Get a specific application parameter:**

```typescript
const parameterName = doo.environment.currentApplication.params.parameters.name;
const parameterNumber = doo.environment.currentApplication.params.parameters.number;
console.log(parameterName); // "Test app"
console.log(parameterNumber); // 1000
```

The `currentApplication` object also contains information about the table that is currently opened in the application.

#### doo.environment.currentApplication.currentTable

```typescript
const currentTable = doo.environment.currentApplication.currentTable;
console.log(currentTable);
```

You can use the current table to get its I**D, name, header, currently selected records, and the current user data filter.**

**Get the current table ID:**

```typescript
const tableId = doo.environment.currentApplication.currentTable.id;
console.log(tableId); // "xxx39972-0762-4913-97cb-a93db2a2xxxx"
```

**Get the current table name:**

```typescript
const tableName = doo.environment.currentApplication.currentTable.name;
console.log(tableName); // company
```

**Get the current table header:**

```typescript
const tableHeader = doo.environment.currentApplication.currentTable.header;
console.log(tableHeader); // Company
```

On the currently opened table, you can get a list of currently selected records in the grid view or card view.

#### doo.environment.currentApplication.currentTable.selectedRecords

```typescript
const selectedRecords = doo.environment.currentApplication.currentTable.selectedRecords;

console.log(selectedRecords); // [{id: "xxx670b8-1480-4340-9551-05b72bfb9xxx",ver: 0,number: {value: 3000},date:value: "2026-06-17"}}]
```

**Get the number of selected records:**

```typescript
const selectedRecords = doo.environment.currentApplication.currentTable.selectedRecords ?? [];

console.log(selectedRecords.length); // 1
```

You can also get the current user data filter from the currently opened table.

#### doo.environment.currentApplication.currentTable.dataConditions

```typescript
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

console.log(dataConditions); // {filter: [{field: "number",operator: "gt",value: "1000",values: null}],filterOperator: "and",fullText: undefined}
```

The current user data filter can be used to retrieve filtered table data using methods such as `doo.table.getData`, `doo.table.getCount`, `doo.table.getDataSummary`, and other methods supporting data conditions.

**Get the number of records matching the current user data filter:**

```typescript
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const count = await doo.table.getCount(tableId, dataConditions);

console.log(count); // {data: {count: 2}}
```

**Get only the count value:**

```typescript
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const count = await doo.table.getCount(tableId, dataConditions);

console.log(count.data.count); // 2
```

**Get records matching the current user data filter:**

```typescript
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const records = await doo.table.getData(tableId, {
  filter: dataConditions
});

console.log(records); // {data: [{id: "xxx670b8-1480-4340-9551-05b72bfb9xxx",created: "2026-06-01T06:51:12.878Z",modified: "2026-06-01T06:51:12.878Z",ver: 0,fields: {number: 3000,date: "2026-06-17"}}
```

**Get only returned records:**

```typescript
const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const records = await doo.table.getData(tableId, {
  filter: dataConditions
});

console.log(records.data);
```

* * *

## isPublicDashboard

The Tabidoo app can publish a dashboard without the need to log in. For example, to a company website. With this property, you can easily detect this state and modify the behavior in the code.

* * *

## isPublicForm

The Tabidoo app can also use a [public form](https://help.tabidoo.cloud/en/article/publish-form) to collect data. Without the need to log in. For example, from a public company website. With this property, you can easily detect this state and modify the behavior on the form.

* * *

## queryParam

If the [public form](https://help.tabidoo.cloud/en/article/publish-form) was run with parameters in the query string, here are their keys and values.

* * *

## isServer

Whether the JavaScript code is running on the client side or on the server side.

* * *

## getCurrentUserTechnicalLimits

```javascript
await doo.environment.getCurrentUserTechnicalLimits();
```

returns information about the **technical limits** that the current user (as the application **owner**) has consumed.

-   Limits that have not been touched are **not included** in the response list.
-   For example, if no workflow has run on a given day, workflow-related limits will not appear.
-   If a limit is reported as `0`, it is currently **not actively enforced** — the value is only logged and may be evaluated in the future.

* * *

### Example Response

```javascript
[
  {
    "value": 61183,
    "limit": 1800000,
    "type": "workflowRunsMs",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "milliseconds"
  },
  {
    "value": 876,
    "limit": 10000,
    "type": "getDataResponseCharsMB",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "count"
  },
  {
    "value": 122077,
    "limit": 0,
    "type": "getDataResponseElapsedMs",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "milliseconds"
  },
  {
    "value": 27,
    "limit": 10000,
    "type": "workflowRunsCount",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "count"
  },
  {
    "value": 158872,
    "limit": 0,
    "type": "aiTokensCount",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "count"
  },
  {
    "value": 158872,
    "limit": 1000000,
    "type": "aiTokensCount",
    "userLimitTimeUnit": "month",
    "userLimitValueUnit": "count"
  }
]
```

* * *

Field Descriptions

-   **value** – the current consumption for the given metric.
-   **limit** – the allowed maximum for that metric. (`0` = not enforced, only tracked).
-   **type** – the type of operation being measured (e.g., `workflowRunsMs`, `workflowRunsCount`, ,`aiTokensCount, getDataResponseElapsedMs`).
-   **userLimitTimeUnit** – the time window for the limit (e.g., `day`, `hour`).
-   **userLimitValueUnit** – the unit of measurement (e.g., `milliseconds`, `count`).
-     
     

* * *

Possible Limit Types

The method may return different types of limits depending on what features are used.  
Each limit can be tracked in different **time windows** – most commonly *daily* and *hourly*, in some cases even *per minute*.

Workflow

-   **workflowRunsMs** – total workflow execution time (milliseconds).
-   **workflowRunsCount** – number of workflow executions.

API / Data

-   **getDataResponseCharsMB** – total size of data returned by `getData` requests (megabytes).
-   **getDataResponseElapsedMs** – total response time for `getData` requests (milliseconds).
-   **getAttachmentResponseCharsMB** – total size of attachments returned by API requests (megabytes).

Email

-   **emailsPerRecipientCount** – number of emails sent per recipient.

> The same limit type may appear multiple times with different time windows (e.g. `day`, `hour`, or `minute`).

* * *

Example Use Cases

-   **Quick Inspection**  
    Run the method directly in any script to see the current usage values.
-   **Daily Logging**  
    Create a workflow that calls this method every hour and stores results in a table.  
    This allows you to build **graphs, alerts, or daily summaries**.
-   **Logging on Workflow Completion**  
    After a workflow finishes, log the values together with metadata (e.g., which workflow has completed).
-   **Alerting on Threshold Breach**  
    Build a workflow that checks limits hourly.  
    If consumption is close to the threshold (e.g., 80%), send yourself an email alert.  
    This gives you time to upgrade your Tabidoo plan before limits are exceeded.
