Developing Internal Tools with Appsmith
Appsmith is an open-source platform for building internal tools. Unlike Retool, Appsmith is fully self-hosted and free for unlimited users. Source code is open—you can fork and customize it.
Appsmith Advantages
- Self-hosted — data never leaves your infrastructure
- Open-source — MIT license, no vendor lock-in
- Docker deploy in 5 minutes
- Support for PostgreSQL, MySQL, MongoDB, REST API, GraphQL, Redis, S3
Installation
# Docker Compose
curl -L https://bit.ly/32jBNin -o $PWD/docker-compose.yml
docker-compose up -d
# Appsmith on http://localhost:80
# docker-compose.yml for production
services:
appsmith:
image: index.docker.io/appsmith/appsmith-ee:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./stacks:/appsmith-stacks
environment:
APPSMITH_ENCRYPTION_PASSWORD: "strong-random-password"
APPSMITH_ENCRYPTION_SALT: "random-salt"
APPSMITH_SUPERVISOR_TOKEN: "token"
restart: unless-stopped
Application Structure
An Appsmith app consists of:
- Pages — separate screens (Dashboard, Users, Orders)
- Widgets — UI components (Table, Form, Chart, Modal)
- Queries — database or API requests
- JSObjects — JavaScript for business logic
Example: CRM Panel
// JSObject: userActions
export default {
// Block user with confirmation
async blockUser() {
const confirmed = await showAlert(
`Block ${usersTable.selectedRow.email}?`,
'confirm'
);
if (!confirmed) return;
await blockUserQuery.run({
userId: usersTable.selectedRow.id,
reason: blockReasonInput.text
});
showAlert('User blocked', 'success');
await getUsersQuery.run();
},
// Export to CSV
exportToCSV() {
const data = getUsersQuery.data.map(u => ({
Email: u.email,
Status: u.status,
'Registration Date': u.created_at
}));
download(data, 'users.csv', 'text/csv');
}
}
Role-Based Access
Appsmith supports user groups with different permissions on applications: view, edit, publish.
Timeline
Simple CRUD tool — 2–4 days. Multi-page tool with roles — 1–2 weeks.







