> For the complete documentation index, see [llms.txt](https://docs.aeternity.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aeternity.com/aeternity-developer-tools/quick-start-guide/first-steps-in-development.md).

# First Steps in Development

## First Steps with æternity Blockchain Development

### Setting Up Your First Project

Getting started with æternity blockchain development is straightforward with the æternity project tool (aeproject). This command-line utility helps you initialize projects, compile smart contracts, run tests, and deploy to the blockchain.

To begin your journey, create a new project directory and initialize it with the aeproject tool:

```bash
mkdir my-aepp
cd my-aepp
aeproject init
```

The initialization process creates a well-organized project structure with dedicated directories for your smart contracts, deployment scripts, tests, and Docker configuration.\
\
The initialization process creates a well-organized project structure:\
\
my-aepp/

```
├── contracts/       # Sophia smart contracts
├── deployment/      # Deployment scripts
├── test/           # Test files
└── docker/         # Docker configuration
```

Now it's time to write your first smart contract in the Sophia language:

```sophia
// contracts/HelloWorld.aes
contract HelloWorld =
  entrypoint sayHello(name : string) : string =
    String.concat("Hello, ", name)
```

To ensure your contract works as expected, write a test file:

```javascript
// test/helloWorldTest.js
const { assert } = require('chai')
const { utils } = require('@aeternity/aeproject')

describe('HelloWorld', () => {
  let contract
  
  before(async () => {
    contract = await utils.deployContract('HelloWorld')
  })
  
  it('should say hello', async () => {
    const result = await contract.sayHello('æternity')
    assert.equal(result, 'Hello, æternity')
  })
})
```

Run your tests with `aeproject test`.

### Wallet Setup and Acquiring Test Tokens

To interact with the æternity blockchain, you'll need a wallet. The [**Base æpp (Mobile Wallet)**](https://base.aepps.com/) is a comprehensive mobile wallet for iOS and Android. Create a new account and securely store your seed phrase.

For browser-based development, install the [**SuperHero Wallet (Browser Extension)**](https://wallet.superhero.com/). It allows easy switching between mainnet and testnet environments.

Before deploying to mainnet, develop on the testnet using free test tokens. Visit <https://faucet.aeternity.io> or use the command:

```bash
curl -X POST -H "Content-Type: application/json" \
  -d '{"address": "YOUR_PUBLIC_KEY"}' \
  https://faucet.aeternity.io/account/balance
```

### Environment Configuration

Configure your environment to connect to the appropriate æternity network:

```javascript
// config/network.js
module.exports = {
  networks: {
    testnet: {
      node: "https://testnet.aeternity.io",
      compilerUrl: "https://compiler.aeternity.io"
    },
    local: {
      node: "http://localhost:3001",
      compilerUrl: "http://localhost:3080"
    }
  }
}
```

During development, use a local node with `aeproject node` for faster testing.

### Next Steps

Explore æternity's advanced features like [state channels ](/developer-documentation/protocol/channels.md)for off-chain scaling, [oracles ](/developer-documentation/protocol/oracles.md)for accessing external data, and the [AENS naming system ](/developer-documentation/aepp-sdk-js/docs/guides/aens.md)for human-readable addresses.

Join the[ æternity Forum](https://forum.aeternity.com/) to connect with the community.&#x20;

Always develop on testnet before moving to mainnet, and carefully review your code for security vulnerabilities.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.aeternity.com/aeternity-developer-tools/quick-start-guide/first-steps-in-development.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
