docs: lowercase goose in getting-started and guides topics (#5857)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
dianed-square
2025-11-24 10:17:22 -08:00
committed by GitHub
parent 3e9d9c7b2c
commit b357e99b30
26 changed files with 279 additions and 279 deletions
@@ -7,7 +7,7 @@ import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import { PanelLeft, Paperclip, Edit2, Send, GripVertical, X, ChevronUp, ChevronDown } from 'lucide-react';
Goose provides features you can use to manage conversations and share information during sessions.
goose provides features you can use to manage conversations and share information during sessions.
## Edit Message
@@ -18,7 +18,7 @@ Editing any message in the session gives you complete control over the conversat
This is useful when:
- You realize a prompt you sent was unclear or incomplete
- Goose misunderstood your intent and went in the wrong direction
- goose misunderstood your intent and went in the wrong direction
- You want to try different approaches to a problem without starting a new session
<Tabs groupId="interface">
@@ -27,12 +27,12 @@ This is useful when:
1. Hover over any of your previous messages to reveal the edit button
2. Click the <Edit2 className="inline" size={16} /> edit button that appears
3. Make your changes in the inline editor
4. Click `Save` to save your changes and reprompt Goose (or use `Cmd+Enter` (macOS) or `Ctrl+Enter` (Windows/Linux))
4. Click `Save` to save your changes and reprompt goose (or use `Cmd+Enter` (macOS) or `Ctrl+Enter` (Windows/Linux))
Goose removes all conversation history after the edited message and responds contextually from that point.
goose removes all conversation history after the edited message and responds contextually from that point.
:::warning Deleted Context
Subsequent conversation history is permanently deleted from the session and removed from Goose's context. Edit a message only if you don't need Goose to remember the context that follows it.
Subsequent conversation history is permanently deleted from the session and removed from goose's context. Edit a message only if you don't need goose to remember the context that follows it.
:::
#### Example Message Flow
@@ -53,43 +53,43 @@ This is useful when:
#### Editing Scenario Tips
- **Iterative Prompt Refinement**: Start with a basic prompt, then edit and refine based on Goose's response. This often works better than trying to craft the perfect prompt from the start.
- **Iterative Prompt Refinement**: Start with a basic prompt, then edit and refine based on goose's response. This often works better than trying to craft the perfect prompt from the start.
- **When to Edit vs. Interrupt**: Editing earlier messages when a conversation has gone off track can be more effective than trying to correct course using new messages or [interruptions](#interrupt-task). By editing messages, you rewrite history. With interruptions, you only affect the conversation from the current message onwards.
</TabItem>
<TabItem value="cli" label="goose CLI">
Message editing is not available in the Goose CLI.
Message editing is not available in the goose CLI.
</TabItem>
</Tabs>
## Queue Messages
Queue messages while Goose is processing a task to manage your workflow. This is useful when:
Queue messages while goose is processing a task to manage your workflow. This is useful when:
- You want to prepare next steps while Goose is working
- You want to prepare next steps while goose is working
- You have a sequence of related tasks to complete
- You're using [voice dictation](#voice-dictation) and need to capture thoughts quickly
:::tip
Goose may perform better when complex tasks are split into subtasks, a technique called [*prompt chaining*](https://www.promptingguide.ai/techniques/prompt_chaining). This structured approach can both improve accuracy and give you more control over the process.
goose may perform better when complex tasks are split into subtasks, a technique called [*prompt chaining*](https://www.promptingguide.ai/techniques/prompt_chaining). This structured approach can both improve accuracy and give you more control over the process.
:::
<Tabs groupId="interface">
<TabItem value="ui" label="goose Desktop" default>
Add a message to the queue:
1. While Goose is processing a response, type your next message
1. While goose is processing a response, type your next message
2. Press `Enter` to add it to the queue (or interrupts if using [interruption keywords](#interrupt-task))
Queued messages appear as numbered cards showing the queue order. The first message in the queue is automatically sent when Goose finishes each response.
Queued messages appear as numbered cards showing the queue order. The first message in the queue is automatically sent when goose finishes each response.
:::info Related Features
- In general, pressing `Enter` while Goose is processing a task queues the message, but clicking `Send` sends the task immediately and [interrupts the task](#interrupt-task)
- When you type common interrupt keywords like "stop", "wait", or "hold on" in a queued message, Goose pauses until you enter or send the next message and then continues processing the queue
- In general, pressing `Enter` while goose is processing a task queues the message, but clicking `Send` sends the task immediately and [interrupts the task](#interrupt-task)
- When you type common interrupt keywords like "stop", "wait", or "hold on" in a queued message, goose pauses until you enter or send the next message and then continues processing the queue
:::
#### Queue Management Controls
Queued messages run automatically in order as Goose finishes each task, but you can manage the queue:
Queued messages run automatically in order as goose finishes each task, but you can manage the queue:
- **Edit a message**: Click the message text to reveal the edit controls, then type your change and click `Save`
- **Reorder messages**: Hover over the message card to reveal the <GripVertical className="inline" size={16} /> button, then grab it and drag the message up or down
- **Send a message**: Click the <Send className="inline" size={16} /> button to send a message immediately and interrupt the current task
@@ -103,12 +103,12 @@ Goose may perform better when complex tasks are split into subtasks, a technique
You send: "Can you refactor our authentication code to support OAuth 2.0 and add proper error handling? Also include unit tests for the OAuth flow, update the API documentation to reflect these changes, and create a migration script to help existing users transition to the new system."
This approach might lead to overwhelming responses where important details get missed or tasks are handled superficially. Even sending a single prompt with clear sequential steps doesn't allow Goose to focus on each task individually or build context progressively.
This approach might lead to overwhelming responses where important details get missed or tasks are handled superficially. Even sending a single prompt with clear sequential steps doesn't allow goose to focus on each task individually or build context progressively.
**With queuing:**
1. You send: "Refactor the authentication code to support OAuth 2.0"
2. While Goose is working, you queue the following messages:
2. While goose is working, you queue the following messages:
- "And add proper error handling"
- "Add unit tests for the OAuth flow"
- "Update the API documentation"
@@ -118,15 +118,15 @@ Goose may perform better when complex tasks are split into subtasks, a technique
</TabItem>
<TabItem value="cli" label="goose CLI">
Message queuing is not available in the Goose CLI.
Message queuing is not available in the goose CLI.
</TabItem>
</Tabs>
## Interrupt Task
Interrupt Goose while it's processing a task to take control of the conversation. This is useful when:
Interrupt goose while it's processing a task to take control of the conversation. This is useful when:
- Goose is heading in the wrong direction
- goose is heading in the wrong direction
- You realize you need to add important context
- You want to switch to a completely different task
@@ -139,7 +139,7 @@ Interrupt Goose while it's processing a task to take control of the conversation
1. Type a prompt that includes common interruption keywords like `stop`, `wait`, `hold on`, `actually`, or `instead`. Using keywords alone or at the beginning of sentences works best for reliable detection.
2. Click `Send`
Goose stops processing the current task and asks for more information.
goose stops processing the current task and asks for more information.
#### Provide immediate redirection
1. Type a prompt with more context and clarification or that changes direction. For example:
@@ -147,11 +147,11 @@ Interrupt Goose while it's processing a task to take control of the conversation
- "Let's focus on React instead of TypeScript"
2. Click `Send`
Goose stops processing the current task and pivots to the new request context.
goose stops processing the current task and pivots to the new request context.
:::info Related features
- Clicking `Send` while Goose is processing a task interrupts the task but pressing `Enter` [queues the message](#queue-messages)
- Typing a stop or pause keyword in a queued message also stops Goose from processing the current task
- Clicking `Send` while goose is processing a task interrupts the task but pressing `Enter` [queues the message](#queue-messages)
- Typing a stop or pause keyword in a queued message also stops goose from processing the current task
- You can also [edit a sent message](#edit-message) to provide more context and clarification or change direction during a session
:::
@@ -189,13 +189,13 @@ Interrupt Goose while it's processing a task to take control of the conversation
2. Type your prompt that provides more context or changes direction
3. Press `Enter`
Goose responds contextually to your new request.
goose responds contextually to your new request.
</TabItem>
</Tabs>
## Voice Dictation
Speak to Goose directly instead of typing your prompts.
Speak to goose directly instead of typing your prompts.
<Tabs groupId="interface">
<TabItem value="ui" label="goose Desktop" default>
@@ -211,9 +211,9 @@ Speak to Goose directly instead of typing your prompts.
1. Return to the chat interface (click `Chat` in the sidebar)
2. Click the microphone on the right of the chat box and begin speaking
The first time you use voice dictation, Goose will request access to your microphone. While recording, you'll see a live waveform of your audio in the input field, a timer, and the current size of your recording. Click the microphone button again to finish recording.
The first time you use voice dictation, goose will request access to your microphone. While recording, you'll see a live waveform of your audio in the input field, a timer, and the current size of your recording. Click the microphone button again to finish recording.
**If you don't see the microphone**, check the [models you have configured](/docs/getting-started/providers.md). ElevenLabs can be used as a dictation provider alongside any LLM, but OpenAI Whisper requires that you have an OpenAI model configured in Goose, even if using another LLM provider for chat.
**If you don't see the microphone**, check the [models you have configured](/docs/getting-started/providers.md). ElevenLabs can be used as a dictation provider alongside any LLM, but OpenAI Whisper requires that you have an OpenAI model configured in goose, even if using another LLM provider for chat.
#### Important Notes
* You can record up to 10 minutes or 25MB of audio
@@ -223,17 +223,17 @@ Speak to Goose directly instead of typing your prompts.
</TabItem>
<TabItem value="cli" label="goose CLI">
Voice dictation is not available in the Goose CLI.
Voice dictation is not available in the goose CLI.
</TabItem>
</Tabs>
## Share Files in Session
Provide Goose with context from your codebase, documents, and other files to get more relevant and accurate assistance.
Provide goose with context from your codebase, documents, and other files to get more relevant and accurate assistance.
<Tabs groupId="interface">
<TabItem value="ui" label="goose Desktop" default>
Share files with Goose in several ways:
Share files with goose in several ways:
1. **Drag and Drop**: Simply drag files from your computer's file explorer/finder and drop them anywhere in the chat window. The file paths will be automatically added to your message.
+5 -5
View File
@@ -1,7 +1,7 @@
---
title: Managing Sessions
hide_title: true
description: Manage your session lifecycle and ongoing interactions with Goose
description: Manage your session lifecycle and ongoing interactions with goose
---
import Card from '@site/src/components/Card';
@@ -11,7 +11,7 @@ import TabItem from '@theme/TabItem';
<h1 className={styles.pageTitle}>Managing Sessions</h1>
<p className={styles.pageDescription}>
Sessions are your continuous interactions with Goose. Each session maintains context and conversation history, enabling Goose to understand your ongoing work and provide relevant assistance.
Sessions are your continuous interactions with goose. Each session maintains context and conversation history, enabling goose to understand your ongoing work and provide relevant assistance.
</p>
<div className={styles.categorySection}>
@@ -24,7 +24,7 @@ import TabItem from '@theme/TabItem';
/>
<Card
title="In-Session Actions"
description="Discover features you can use to share information and communicate with Goose during sessions."
description="Discover features you can use to share information and communicate with goose during sessions."
link="/docs/guides/sessions/in-session-actions"
/>
<Card
@@ -38,7 +38,7 @@ import TabItem from '@theme/TabItem';
<h2 className={styles.categoryTitle}>📝 Featured Blog Posts</h2>
<div className={styles.cardGrid}>
<Card
title="6 Essential Tips for Working with Goose"
title="6 Essential Tips for Working with goose"
description="Learn how focused sessions, step-by-step guidance, and refining your prompts can lead to more productive sessions."
link="/blog/2025/03/06/goose-tips"
/>
@@ -49,7 +49,7 @@ import TabItem from '@theme/TabItem';
/>
<Card
title="The AI Skeptics Guide to Context Windows"
description="Learn how context windows, tokens, and Goose help you manage memory and long conversations."
description="Learn how context windows, tokens, and goose help you manage memory and long conversations."
link="/blog/2025/08/18/understanding-context-windows"
/>
</div>
@@ -9,24 +9,24 @@ import TabItem from '@theme/TabItem';
import { ScrollText } from 'lucide-react';
import { PanelLeft } from 'lucide-react';
When working with [Large Language Models (LLMs)](/docs/getting-started/providers), there are limits to how much conversation history they can process at once. Goose provides smart context management features to help handle context and conversation limits so you can maintain productive sessions. Here are some key concepts:
When working with [Large Language Models (LLMs)](/docs/getting-started/providers), there are limits to how much conversation history they can process at once. goose provides smart context management features to help handle context and conversation limits so you can maintain productive sessions. Here are some key concepts:
- **Context Length**: The amount of conversation history the LLM can consider, also referred to as the context window
- **Context Limit**: The maximum number of tokens the model can process
- **Context Management**: How Goose handles conversations approaching these limits
- **Turn**: One complete prompt-response interaction between Goose and the LLM
- **Context Management**: How goose handles conversations approaching these limits
- **Turn**: One complete prompt-response interaction between goose and the LLM
## How Goose Manages Context
Goose uses a two-tiered approach to context management:
## How goose Manages Context
goose uses a two-tiered approach to context management:
1. **Auto-Compaction**: Proactively summarizes conversation when approaching token limits
2. **Context Strategies**: Backup strategy used if the context limit is still exceeded after auto-compaction
This layered approach lets Goose handle token and context limits gracefully.
This layered approach lets goose handle token and context limits gracefully.
## Automatic Compaction
Goose automatically compacts (summarizes) older parts of your conversation when approaching token limits, allowing you to maintain long-running sessions without manual intervention.
Auto-compaction is triggered by default when you reach 80% of the token limit in Goose Desktop and the Goose CLI.
goose automatically compacts (summarizes) older parts of your conversation when approaching token limits, allowing you to maintain long-running sessions without manual intervention.
Auto-compaction is triggered by default when you reach 80% of the token limit in goose Desktop and the goose CLI.
Control the auto-compaction behavior with the `GOOSE_AUTO_COMPACT_THRESHOLD` [environment variable](/docs/guides/environment-variables.md#session-management).
Disable this feature by setting the value to `0.0`.
@@ -37,9 +37,9 @@ export GOOSE_AUTO_COMPACT_THRESHOLD=0.6
```
When you reach the auto-compaction threshold:
1. Goose will automatically start compacting the conversation to make room.
1. goose will automatically start compacting the conversation to make room.
2. Once complete, you'll see a confirmation message that the conversation was compacted and summarized.
3. Continue the session. Your previous conversation remains visible, but only the compacted conversion is included in the active context for Goose.
3. Continue the session. Your previous conversation remains visible, but only the compacted conversion is included in the active context for goose.
### Manual Compaction
You can also trigger compaction manually before reaching context or token limits:
@@ -50,7 +50,7 @@ You can also trigger compaction manually before reaching context or token limits
1. Point to the token usage indicator dot next to the model name at the bottom of the app
2. Click <ScrollText className="inline" size={16} /> `Compact now` in the context window that appears
3. Once complete, you'll see a confirmation message that the conversation was compacted and summarized.
4. Continue the session. Your previous conversation remains visible, but only the compacted conversion is included in the active context for Goose.
4. Continue the session. Your previous conversation remains visible, but only the compacted conversion is included in the active context for goose.
:::info
You must send at least one message in the chat before the `Compact now` button is enabled.
@@ -76,7 +76,7 @@ Key information has been preserved while reducing context length.
## Context Limit Strategies
When auto-compaction is disabled, or if a conversation still exceeds the context limit, Goose offers different ways to handle it:
When auto-compaction is disabled, or if a conversation still exceeds the context limit, goose offers different ways to handle it:
| Feature | Description | Best For | Availability | Impact |
|---------|-------------|-----------|-----------|---------|
@@ -88,7 +88,7 @@ When auto-compaction is disabled, or if a conversation still exceeds the context
<Tabs groupId="interface">
<TabItem value="ui" label="goose Desktop" default>
Goose Desktop exclusively uses summarization by compacting the conversation to manage context, preserving key information while reducing size.
goose Desktop exclusively uses summarization by compacting the conversation to manage context, preserving key information while reducing size.
</TabItem>
<TabItem value="cli" label="goose CLI">
@@ -99,7 +99,7 @@ The default behavior depends on the mode you're running in:
- **Interactive mode**: Prompts user to choose (equivalent to `prompt`)
- **Headless mode** (`goose run`): Automatically summarizes (equivalent to `summarize`)
You can configure how Goose handles context limits by setting the `GOOSE_CONTEXT_STRATEGY` environment variable:
You can configure how goose handles context limits by setting the `GOOSE_CONTEXT_STRATEGY` environment variable:
```bash
# Set automatic strategy (choose one)
@@ -127,21 +127,21 @@ final_summary: [A summary of your conversation will appear here]
Context maxed out
--------------------------------------------------
Goose summarized messages for you.
goose summarized messages for you.
```
**With `GOOSE_CONTEXT_STRATEGY` configured**, Goose will automatically apply your chosen strategy:
**With `GOOSE_CONTEXT_STRATEGY` configured**, goose will automatically apply your chosen strategy:
```sh
# Example with GOOSE_CONTEXT_STRATEGY=summarize
Context maxed out - automatically summarized messages.
--------------------------------------------------
Goose automatically summarized messages for you.
goose automatically summarized messages for you.
# Example with GOOSE_CONTEXT_STRATEGY=truncate
Context maxed out - automatically truncated messages.
--------------------------------------------------
Goose tried its best to truncate messages for you.
goose tried its best to truncate messages for you.
# Example with GOOSE_CONTEXT_STRATEGY=clear
Context maxed out - automatically cleared session.
@@ -151,7 +151,7 @@ Context maxed out - automatically cleared session.
</Tabs>
## Maximum Turns
The `Max Turns` limit is the maximum number of consecutive turns that Goose can take without user input (default: 1000). When the limit is reached, Goose stops and prompts: "I've reached the maximum number of actions I can do without user input. Would you like me to continue?" If the user answers in the affirmative, Goose continues until the limit is reached and then prompts again.
The `Max Turns` limit is the maximum number of consecutive turns that goose can take without user input (default: 1000). When the limit is reached, goose stops and prompts: "I've reached the maximum number of actions I can do without user input. Would you like me to continue?" If the user answers in the affirmative, goose continues until the limit is reached and then prompts again.
This feature gives you control over agent autonomy and prevents infinite loops and runaway behavior, which could have significant cost consequences or damaging impact in production environments. Use it for:
@@ -177,7 +177,7 @@ This setting is stored as the `GOOSE_MAX_TURNS` environment variable in your [co
goose configure
```
2. Select `Goose Settings`:
2. Select `goose settings`:
```sh
┌ goose-configure
@@ -187,7 +187,7 @@ This setting is stored as the `GOOSE_MAX_TURNS` environment variable in your [co
│ ○ Toggle Extensions
│ ○ Remove Extension
// highlight-start
│ ● Goose Settings (Set the Goose Mode, Tool Output, Tool Permissions, Experiment, Goose recipe github repo and more)
│ ● goose settings (Set the goose mode, Tool Output, Tool Permissions, Experiment, goose recipe github repo and more)
// highlight-end
```
@@ -197,10 +197,10 @@ This setting is stored as the `GOOSE_MAX_TURNS` environment variable in your [co
┌ goose-configure
◇ What would you like to configure?
Goose Settings
goose settings
◆ What setting would you like to configure?
│ ○ Goose Mode
│ ○ goose mode
│ ○ Router Tool Selection Strategy
│ ○ Tool Permission
│ ○ Tool Output
@@ -208,7 +208,7 @@ This setting is stored as the `GOOSE_MAX_TURNS` environment variable in your [co
│ ● Max Turns (Set maximum number of turns without user input)
// highlight-end
│ ○ Toggle Experiment
│ ○ Goose recipe github repo
│ ○ goose recipe github repo
│ ○ Scheduler Type
```
@@ -218,7 +218,7 @@ This setting is stored as the `GOOSE_MAX_TURNS` environment variable in your [co
┌ goose-configure
◇ What would you like to configure?
Goose Settings
goose settings
◇ What setting would you like to configure?
│ Max Turns
@@ -228,7 +228,7 @@ This setting is stored as the `GOOSE_MAX_TURNS` environment variable in your [co
│ 10
// highlight-end
└ Set maximum turns to 10 - Goose will ask for input after 10 consecutive actions
└ Set maximum turns to 10 - goose will ask for input after 10 consecutive actions
```
:::tip
@@ -245,12 +245,12 @@ The appropriate max turns value depends on your use case and comfort level with
- **5-10 turns**: Good for exploratory tasks, debugging, or when you want frequent check-ins. For example, "analyze this codebase and suggest improvements" where you want to review each step
- **25-50 turns**: Effective for well-defined tasks with moderate complexity, such as "refactor this module to use the new API" or "set up a basic CI/CD pipeline"
- **100+ turns**: More suitable for complex, multi-step automation where you trust Goose to work independently, like "migrate this entire project from React 16 to React 18" or "implement comprehensive test coverage for this service"
- **100+ turns**: More suitable for complex, multi-step automation where you trust goose to work independently, like "migrate this entire project from React 16 to React 18" or "implement comprehensive test coverage for this service"
Remember that even simple-seeming tasks often require multiple turns. For example, asking Goose to "fix the failing tests" might involve analyzing test output (1 turn), identifying the root cause (1 turn), making code changes (1 turn), and verifying the fix (1 turn).
Remember that even simple-seeming tasks often require multiple turns. For example, asking goose to "fix the failing tests" might involve analyzing test output (1 turn), identifying the root cause (1 turn), making code changes (1 turn), and verifying the fix (1 turn).
## Token Usage
After sending your first message, Goose Desktop and Goose CLI display token usage.
After sending your first message, goose Desktop and goose CLI display token usage.
<Tabs groupId="interface">
<TabItem value="ui" label="goose Desktop" default>
@@ -280,7 +280,7 @@ After sending your first message, Goose Desktop and Goose CLI display token usag
## Model Context Limit Overrides
Context limits are automatically detected based on your model name, but Goose provides settings to override the default limits:
Context limits are automatically detected based on your model name, but goose provides settings to override the default limits:
| Model | Description | Best For | Setting |
|-------|-------------|----------|---------|
@@ -295,12 +295,12 @@ This setting only affects the displayed token usage and progress indicators. Act
This feature is particularly useful with:
- **LiteLLM Proxy Models**: When using LiteLLM with custom model names that don't match Goose's patterns
- **LiteLLM Proxy Models**: When using LiteLLM with custom model names that don't match goose's patterns
- **Enterprise Deployments**: Custom model deployments with non-standard naming
- **Fine-tuned Models**: Custom models with different context limits than their base versions
- **Development/Testing**: Temporarily adjusting context limits for testing purposes
Goose resolves context limits with the following precedence (highest to lowest):
goose resolves context limits with the following precedence (highest to lowest):
1. Explicit context_limit in model configuration (if set programmatically)
2. Specific environment variable (e.g., `GOOSE_LEAD_CONTEXT_LIMIT`)
@@ -313,7 +313,7 @@ Goose resolves context limits with the following precedence (highest to lowest):
<Tabs groupId="interface">
<TabItem value="ui" label="goose Desktop" default>
Model context limit overrides are not yet available in the Goose Desktop app.
Model context limit overrides are not yet available in the goose Desktop app.
</TabItem>
<TabItem value="cli" label="goose CLI">
@@ -368,14 +368,14 @@ To manage live cost tracking:
3. Click the `App` tab
4. Toggle `Cost Tracking` on/off
The session cost is shown at the bottom of the Goose window and updates dynamically as tokens are consumed. Hover over the cost to see a detailed breakdown of token usage. If multiple models are used in the session, this includes a cost breakdown by model. Ollama and local deployments always show a cost of $0.00.
The session cost is shown at the bottom of the goose window and updates dynamically as tokens are consumed. Hover over the cost to see a detailed breakdown of token usage. If multiple models are used in the session, this includes a cost breakdown by model. Ollama and local deployments always show a cost of $0.00.
Pricing data is regularly fetched from the OpenRouter API and cached locally. The `Advanced settings` tab shows when the data was last updated and allows you to refresh.
These costs are estimates only, and not connected to your actual provider bill. The cost shown is an approximation based on token counts and public pricing data.
</TabItem>
<TabItem value="cli" label="goose CLI">
Show estimated cost in the Goose CLI by setting the `GOOSE_CLI_SHOW_COST` [environment variable](/docs/guides/environment-variables.md#session-management) or including it in the [configuration file](/docs/guides/config-files.md).
Show estimated cost in the goose CLI by setting the `GOOSE_CLI_SHOW_COST` [environment variable](/docs/guides/environment-variables.md#session-management) or including it in the [configuration file](/docs/guides/config-files.md).
```
# Set environment variable