I have been exploring Gleam since its stable release and have been an active member (at least I think so) of the community for a year now. I tend to be quite... selective with programming languages, especially regarding syntax and minor design details. Gleam was my introduction to functional programming and the BEAM ecosystem, and I fell in love with how intuitive it is to learn and apply to my projects
My first major project in Gleam was "ewe", a web server that began as a learning experiment and eventually became my college graduation project. Since then I have contributed to and developed other packages. I am incredibly grateful that Gleam became my gateway to open source contributions. I have always wanted to be part of a collaborative community of talented developers, and I am glad to have found that here
I created armadillo to learn about DNS and to gain more experience with developing apps in Gleam, while also offering the community an open codebase to reference and use
It is wonderful to finally be part of a community I had been searching for :)
"Black lives matter. Trans rights are human rights. No nazi bullsh*t."
Important information to know about a programming language /s.
I've had woke people attempt to do me harm in the past, but the Gleam people didn't strike me as that kind of woke: they've been nothing but helpful.
If you think black lives don't matter, or that trans people deserve no rights, or support nazis... the Gleam community probably wouldn't want to have you.
I -- controversially -- think black lives matter and white lives matter. And everyone else too!
No it's not. It conveys nothing about the language.
>It means the community around the language cares about creating a safe environment for me and many of my friends.
They don't specifically ban child groomers like they do "Nazis", which using your logic means the language doesn't care about creating a safe environment for children and child sex abuse victims.
I was being sarcastic.
>I've had woke people attempt to do me harm in the past
Did you inform the authorities?
>If you think black lives don't matter, or that trans people deserve no rights, or support nazis... the Gleam community probably wouldn't want to have you.
Let's say there's a language that has the following on their homepage: "It's OK to be White, no child groomers. No commie bullshit."
If you think it's not OK to be White, or that people should be allowed to sexually groom children, or support commies...
Black and White lives matter, but that's not what Glean is signalling.
Not in the slightest. "Woke" worries have repeatedly been shown to be true in the courts. "Open fascism" has repeatedly been shown to be Trump Derangement Syndrome.
It is! citation: I wrote it.
Something that triggered you enough to make an account it seems.
>There are so many layers of bullshit in your comment I can't even fathom what to write
Your inability to disern bullshit and make a comment is a skills issue.
>I hope you improve as a human being and learn to use that wet thing inside your skull.
I hope you improve as a human being and learn to gain some skin and use that wet thing inside your skull.
> I was being sarcastic.
Yes I'm fully aware - I was just playing along.
Your account is a realtime view of a freak having a mental breakdown (stalking me in the comments), and the mods are like "this is fine" lol.
Writing is contextual, if one only looks at the literal then one misses the other half of the meaning. Unfortunately your proposed change has added context that undermine your honourable and well-intentioned message.
A self-hosted DNS server for homelab use, written in Gleam.
Configure it once on your router as the DNS resolver and every device on the network resolves your local domains automatically.
When a DNS query arrives, the server checks its local record store first. If a matching record exists, it responds immediately with the configured IP. If no record matches, the query is forwarded to a configurable upstream resolver, the response is cached by TTL, and returned to the client.
Local records are stored in a DNS zone file and loaded into ETS on startup. All query resolution at runtime goes through ETS only, the zone file is never read during query handling.
Available at ghcr.io/vshakitskiy/armadillo:v2.0.0.
| Variable | Default | Description |
|---|---|---|
DNS_PORT |
53 |
Port the DNS server listens on |
DNS_UPSTREAM |
8.8.8.8 |
Upstream resolver for unknown domains |
DNS_TTL |
300 |
Default TTL for zone records in seconds |
DNS_SOA_MINIMUM |
3600 |
SOA minimum TTL for negative caching in seconds |
API_PORT |
3000 |
Port for the web UI and REST API |
API_SECRET_KEY_BASE |
random key | Secret used to sign session cookies |
ZONE_FILE |
/data/local.zone |
Path to the DNS zone file |
Mount a volume to /data to persist the zone file across restarts. The zone
file is created automatically if it does not exist.
Deployment guides can be found in the examples/ directory.
The server accepts any domain string. That said, avoid .local. It is reserved
for mDNS/Bonjour (RFC 6762) and Apple devices will not send .local queries to
a unicast DNS server. .lan or .internal are common alternatives.
I will be glad to receive any contributions and feedbacks. Issues or pull requests are welcomed!
The project has three packages: server runs the DNS resolver and HTTP API,
client is the web UI, and shared contains modules used by both. Each package
is developed independently, run gleam run in server/ and
gleam run -m lustre/dev in client/.
For managing environment variables locally during development, direnv is recommended.
To bind to port 53 locally without sudo, run setcap on the BEAM binary:
# Find the binary:
$(which erl) -noshell -eval 'io:format("~s~n",[os:find_executable("beam.smp")]),halt().'
# > /path/to/beam.smp
sudo setcap cap_net_bind_service=+ep /path/to/beam.smp
Personal notes for if I run into DNS issues with a VPN again.
When running a VPN like vless in proxy or tun mode, it's very important to make
sure the VPN resolves domains via the correct DNS. Asuming the router's IP
192.168.1.1 is where the DNS server is configured:
{
"dns": {
"servers": [
{ "address": "192.168.1.1", "port": 53 },
"1.1.1.1"
]
},
"routing": {
"rules": [
{
"ip": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],
"outboundTag": "direct"
}
]
}
}
{
"dns": {
"servers": [
{ "tag": "dns-local", "address": "192.168.1.1", "detour": "direct" },
{ "tag": "dns-remote", "address": "1.1.1.1", "detour": "proxy" }
],
"rules": [{ "ip_is_private": true, "server": "dns-local" }],
"final": "dns-remote"
},
"route": {
"rules": [{ "ip_is_private": true, "outbound": "direct" }]
}
}
As does your original text. Congrats, you made my point for me.