Codync
A free, open-source 1:1 alternative to Grok Bot and Muse. Message Claude Code, Codex, Cursor and 40+ coding agents as persistent bots from your iPhone, Mac or Linux desktop. Group chats, threads, appr
Fa is a programming language which is intended to be as fast as low-level languages like C++ and Rust and as easy to use as high-level languages like Python and Javascript
Developer toolsRust · SvelteGitHub @Gin-QuinOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Fa is a programming language designed for both AI agents and humans.
Agents get a language they can't get wrong without the compiler noticing: strict types, typed errors, requirements and mutations, clear diagnostics and an unambiguous grammar. Humans get code that reads almost like natural language, and that runs everywhere: web, server, native, WebAssembly.
Syntax-wise, Fa sits between Rust and TypeScript.
-- Load the score of the current user.
function loadScore = (): Integer throws ApiError requires session: Session => {
let response = try fetchScore(session.user.id)
response.score
}
Fa is in active development. Expect breaking changes.
Like Rust, Fa has no escape hatch: no any, no unchecked casts, no null surprises. If it compiles, it works.
An agent can rely on the compiler as its feedback loop instead of on runtime testing.
Fa brings the ideas of the Effect TypeScript library directly into the language, with no wrappers, generators or pipes to learn. Every function signature tells you everything it can do:
throws): there are no exceptions. Errors are values declared in the signature, and the compiler makes sure each one is either propagated with try or handled with catch.requires): dependencies are passed implicitly through the call stack, but they are part of the signature. Calling a function without providing what it requires is a compile error.mutates, invalidates): a function declares what it modifies, down to a field or an element, and which references it can invalidate.type ApiError = Errors {
NetworkError = { message: String }
TimeoutError = { duration: Integer }
}
type Session = {
user: { id: String, name: String }
}
function greet = () requires session: Session => {
console.log("Hello, {session.user.name}!")
}
function main = () throws ApiError => {
provide Session = { user = { id = "42", name = "Ada" } }
greet() -- the session is provided implicitly
-- `try` propagates the error if the call fails
let score = try loadScore()
-- `catch` handles it
let scoreOrZero = loadScore() catch error => 0
}
Diagnostics explain what went wrong, where, and how to fix it. They are written to be acted upon by a human or an agent without guesswork.
Every construct has a single meaning and, as much as possible, a single way to be written. There are few keywords, no context-dependent parsing and no hidden rules, which makes Fa easy to read and easy to generate.
Documentation is part of the language, not a convention on top of it. A comment written right above a declaration is its documentation: it is attached to the declaration and are available to the compiler, the language server and the tooling, so agents always find the documentation right next to the code they work on.
Fa favors words and simple operators over symbols. Code should read almost like a sentence:
for person in persons {
if person.age is 18 {
console.log("Welcome to adulthood, {person.name}!")
}
}
Fa is a universal language: write your code once, then compile it to JavaScript (browser, Bun, Node.js, Deno), native, WebAssembly or Rust source code.
The same code base can power your tooling, your applications and your games.
Fa has no garbage collector and no borrow checker, yet it is 100% memory-safe. It relies on two concepts.
When you reference an element of a collection, its type says where it is stored. The compiler tracks the operations that can move or remove elements, as precisely as it can: after one of them, the references it may have broken must be declared again before being used.
mutable persons: Array(Person) = [{ name = "Ana" }, { name = "Bao" }, { name = "Cleo" }]
use someone = persons[1] -- type: `Person in persons`
someone.name = "John" -- fine: modifying an element keeps the references valid
persons.pop() -- fine: `pop` only invalidates the last element
persons.push({ name = "Dan" }) -- `push` may reallocate the array: every reference into `persons` is invalidated
console.log(someone.name) -- error: `someone` was invalidated by `persons.push`: declare it again with `use someone = persons[...]`
A field that references another object names the collection it lives in, and is one side of a relation whose other side is declared too. The compiler keeps both sides in sync, and deleting an object cleans up every relation it was part of, so no reference is ever left dangling.
mutable people: Bag(Person) = []
type Person = {
name: String
bestFriend: (Person in people)?
bestFriendOf: Bag(people->bestFriend) -- the people whose `bestFriend` is me
}
use ana = people.add({ name = "Ana" })
use bao = people.add({ name = "Bao" })
ana.bestFriend = bao -- `bao.bestFriendOf` is updated automatically
people.delete(bao) -- `ana.bestFriend` becomes `none`
The full documentation lives in documentation/ and is published by the website in packages/website.
To test Fa locally, you need Rust installed. Install it with rustup from https://rustup.rs.
The parser project lives in packages/parser and builds as the fa-parser crate.
From the repository root:
cargo build -p fa-parser
The parser binary expects a file path and prints the parsed tree.
cargo run -p fa-parser -- path/to/file.fa
console.log("Hello, world")