---
next:
link: '/guide/getting-started/supported-languages'
text: 'Supported Languages'
---
# Nix
## Astal
Using Astal on Nix will require you to package your project.
:::code-group
```nix [ Lua]
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
astal = {
url = "github:aylur/astal";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, astal }: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
packages.${system}.default = astal.lib.mkLuaPackage {
inherit pkgs;
src = ./path/to/project; # should contain init.lua
# add extra glib packages or binaries
extraPackages = [
astal.packages.${system}.battery
pkgs.dart-sass
];
};
};
}
```
```nix [ Python]
# Not documented yet
```
```nix [ Vala]
# keep in mind that this is just the nix derivation
# and you still have to use some build tool like meson
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
astal.url = "github:aylur/astal";
};
outputs = { self, nixpkgs, astal }: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
packages.${system} = {
default = pkgs.stdenv.mkDerivation {
name = "my-shell";
src = ./.;
nativeBuildInputs = with pkgs; [
meson
ninja
pkg-config
vala
gobject-introspection
];
# add extra packages
buildInputs = [
astal.packages.${system}.astal
];
};
};
};
}
```
```nix [ TypeScript]
# The usage of AGS (read below) is recommended
# Usage without AGS is not yet documented
```
:::
## AGS
The recommended way to use [AGS](../typescript/first-widgets#first-widgets) on NixOS is through the home-manager module.
Example content of a `flake.nix` file that contains your `homeConfigurations`.
:::code-group
```nix [ flake.nix]
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
# add ags https://github.com/Aylur/ags/pull/504
ags.url = "github:aylur/ags/v2";
};
outputs = { home-manager, nixpkgs, ... }@inputs:
let
system = "x86_64-linux";
in
{
homeConfigurations."${username}" = home-manager.lib.homeManagerConfiguration {
pkgs = import nixpkgs { inherit system; };
# pass inputs as specialArgs
extraSpecialArgs = { inherit inputs; };
# import your home.nix
modules = [ ./home-manager/home.nix ];
};
};
}
```
:::
Example content of `home.nix` file
:::code-group
```nix [ home.nix]
{ inputs, pkgs, ... }:
{
# add the home manager module
imports = [ inputs.ags.homeManagerModules.default ];
programs.ags = {
enable = true;
configDir = ../ags;
# additional packages to add to gjs's runtime
extraPackages = with pkgs; [
inputs.ags.packages.${pkgs.system}.battery
fzf
];
};
}
```
:::
AGS by default only includes the core `astal3/astal4` and `astal-io` libraries.
If you want to include any other [library](../libraries/references) you have to add them to `extraPackages`.
You can also add binaries which will be added to the gjs runtime.
:::warning
The `configDir` option symlinks the given path to `~/.config/ags`.
If you already have your source code there leave it as `null`.
:::
The AGS flake does not expose the `astal` cli to the home environment, you have to do that yourself if you want:
:::code-group
```nix [ home.nix]
home.packages = [ inputs.ags.packages.${pkgs.system}.default ];
```
```sh [ sh]
astal --help
```
:::
Same applies to the `extraPackages` option, it does not expose the passed packages to the home environment.
To make astal cli tools available to home environments, you have to add them yourself:
:::code-group
```nix [ home.nix]
home.packages = [ inputs.ags.packages.${pkgs.system}.notifd ];
```
```sh [ sh]
astal-notifd --help
```
:::