Install the local service
Use the signed package for a boot-time LaunchDaemon with protected credentials and configurable LAN binding.
Developer preview · Build 72 namespace integrity
A SQL Server-compatible database engine for Mac, written in Rust and run as a LaunchDaemon on Apple Silicon. Administered by macSQL Studio, or by any SQL Server client that speaks TDS.
Native SQL execution, persistence, WAL recovery, schema management, security metadata, and TDS compatibility.
macSQL Studio is the native Mac client, and it is a separate product; SQL Server Management Studio and the thirteen qualified client stacks connect to the same listener.
LaunchDaemon installation, LAN operation, SQL-authenticated clients, protected secrets, and signed update delivery.
Build 78 administration: Engine 0.78.0
CREATE LOGIN, ALTER ROLE … ADD MEMBER,
and GRANT/DENY/REVOKE
execute over the same encrypted TDS connection every client uses,
gated on the authenticated login's own role — the SQL Server
model, from SSMS's query window or any driver, with no loopback
tool and no token. An adopted KrakenSQL login's password now
verifies and upgrades itself on first sign-in.
Build 78 is a source candidate. It has not been through release qualification and is installed nowhere.
Build 77 authorization: Engine 0.77.0
A denied permission is refused no matter which road reaches it. The
engine used to consult a principal's role before its DENYs, so any
permission the role allowed could not be denied — and making DENY
reachable exposed five routes around it: MERGE, derived
tables, subqueries in expression positions, and
INSERT … SELECT. All five are closed, and the
authorization walkers are now exhaustive: a new statement shape
fails to compile until someone decides what it may reach.
Build 77 passed source qualification and was installed on the live server on 2026-08-18; its production-form gate has not been rerun there.
Build 76 app-free engine: Engine 0.76.0
Until now the server was delivered inside a Mac application bundle:
the installer staged /Applications/macSQL.app with the
engine inside it and copied the engine back out to the service
directory. The graphical client is now its own product, macSQL
Studio, so the package carries the engine directly and installs
nothing into /Applications.
Build 76 was installed on the live server on 2026-08-17 together with the KrakenSQL data-root adoption; its production-form gate has not been rerun there.
Build 74 client reachability: GUI 1.0 build 74 · Engine 0.1.74
Build 73 made a procedure something you could write down and run.
Build 74 makes it something your application can call. Every client
library invokes a procedure by RPC — CommandType.StoredProcedure,
CallableStatement, {CALL p(?)},
request.execute() — and that path now works, with
OUTPUT parameters and return codes travelling back to
the caller. Parameters are bound rather than pasted into the
statement text, so a value can never become part of a query's syntax.
Build 74 is a source candidate. It has not been through release qualification and is installed nowhere; the installed release below remains Build 73.
Build 73 stored procedures: GUI 1.0 build 73 · Engine 0.1.73
CREATE PROCEDURE was an explicit parser rejection until
this build, which is the first reason an application written for SQL
Server does not start on macSQL. It parses now in all three forms
— CREATE, ALTER,
CREATE OR ALTER — and EXEC runs what they
stored. A body is captured verbatim and validated when the procedure
is created, so a body that cannot parse is refused then rather than
at some later call; the object names inside it resolve when it runs,
as SQL Server defers them, because a deployment script may legally
create a procedure before the table it reads.
OUTPUT parameters and a return code travel back to the caller; EXEC @rc = p works.WHILE, BREAK, CONTINUE and RETURN are real statements, in a procedure body or an ordinary batch.Build 72 namespace integrity: GUI 1.0 build 72 · Engine 0.1.72
Build 72 is a corrective release, installed on 2026-08-13.
CREATE TABLE over the name of an existing view
destroyed that view with no error: a view's catalog entry has no
columns, which is the same shape as a zero-column table shell left
by an older build, so the create fell through a repair branch meant
for those shells and overwrote the definition. View DDL was also
invisible to permission enforcement, so a principal holding only
read access could create and drop views. Both are refused now, at
the executor and again at the catalog boundary. Build 71's package
was cut before those fixes were committed, which is why this build
exists.
CREATE TABLE and DROP TABLE refuse any object that is not a table, and name the statement to use instead.sys.procedures, sys.parameters, sys.sql_modules, and the first INFORMATION_SCHEMA.ROUTINES and INFORMATION_SCHEMA.PARAMETERS in this engine. No syntax creates a procedure yet; the phase is a verified no-op for existing databases.Build 71 Management Studio catalog: GUI 1.0 build 71 · Engine 0.1.71
Build 71 makes Object Explorer work. SSMS drives its tree with
enumeration queries that join three to six catalog views at a time
and filter on OBJECTPROPERTY; macSQL answered none
of them, because the sys.* catalog lived in the wire
layer behind a dispatcher that refused joins, grouping, CTEs, and
set operations outright. The catalog now resolves inside the
executor as ordinary query sources, so those enumerations are just
SELECTs — they join, group, aggregate, sort, and compose like any
other statement. Object identity is single-valued across every
view and metadata scalar, so OBJECT_ID(...) returns
the id sys.tables reports and the two can be joined;
previously a second, incompatible id implementation meant every
tool join silently returned nothing. All 22 Object Explorer query
shapes answer over encrypted TDS. Build 71 was the installed
release until Build 72 replaced it on 2026-08-13.
sys.* and INFORMATION_SCHEMA.* catalog resolves in the executor, ahead of user tables, as ordinary materialized sources.OBJECT_ID/DB_ID hash is gone.OBJECT_ID, OBJECT_NAME, OBJECT_SCHEMA_NAME, SCHEMA_NAME, SCHEMA_ID, DB_ID, OBJECTPROPERTY, COLUMNPROPERTY, COL_NAME, COL_LENGTH, and TYPE_NAME answer from the live catalog on every statement route, including DECLARE/SET, IF conditions, and EXEC'd batches.DATETIME2(p) and DATETIMEOFFSET(p), real capacities for large-object types, and correct numeric-versus-temporal-versus-character classification in INFORMATION_SCHEMA.COLUMNS.COUNT(*), GROUP BY, and HAVING over the views were previously refused outright.Build 70 engine-rival tranche: GUI 1.0 build 70 · Engine 0.1.70
Build 70 is the engine-rival tranche. The engine switches to
table-granularity strict two-phase locking with concurrent writers,
FIFO admission, deadlock detection, and cooperative mid-query
KILL. Page format v3 stamps a persisted page-kind byte
that drives load-time structural validation, with seal-forward
migration for existing databases. Every single-table statement shape
— plain, ordered, aggregate/GROUP BY/HAVING, DISTINCT, and the
UPDATE/DELETE scans — now runs in bounded memory through streaming
scans and an external merge sort that spills to unlinked temp files.
ORDER BY, set-operator, and HAVING binding follow T-SQL rules
(aliases, ordinals, combined-result ordering, aggregate scope). The
native wire types and seven MS-TDS/MC-SMP protocol corrections
passed the strict no-skip encrypted thirteen-client matrix — 13
passed, 0 skipped, 0 failed — including 120 KB MAX-type
round-trips over encrypted MARS. Build 70 was signed, notarized,
and stapled, and is the installed, protected, published developer
preview.
KILL interrupts a running statement.SELECT 1 UNION SELECT 2 shapes and CTE visibility across branches are correct.HAVING COUNT(*) > 1 works, HAVING without GROUP BY aggregates the whole table, and ungrouped columns fail like SQL Server error 8120.DONEINPROC with affected-row counts — Node mssql recordsets and SqlClient ExecuteNonQuery counts are exact.ALTER TABLE dbo.Students ALTER COLUMN FamilyId BIGINT NULL across repeated managed restarts._macsql reinstall is zero-write; only the tightly proven macOS RealName normalization is reconciled, and a root-owned marker binds UID/GID plus both GeneratedUID values.PageAlloc provenance; bounded legacy upgrades reject unexplained gaps before mutation.QUOTED_IDENTIFIER ON/OFF stateful within/across batches, bounds TEXTSIZE for MAX/text/blob payloads without changing bounded columns, advertises LOGINACK 17.0.0.0, and passes real sqlcmd plus PDO post-error source regressions.Backups, WALArchive, and RestoreStages roots to _macsql, with strict symlink and boundary rejection.dsAttrTypeNative:IsHidden, and server-security verification defines the canonical macSQL log root._macsql identity with explicit root/service ownership boundaries.IsHidden alias.SET NOCOUNT is stateful and @@TRANCOUNT reflects the real connection transaction for driver cleanup.DATEDIFF, DATEDIFF_BIG, DATEADD, and recursive ON DELETE CASCADE execute through direct regression tests.READ COMMITTED, REPEATABLE READ, and SERIALIZABLE requests parse explicitly; unsupported isolation and session timeout requests fail closed..admin.status exposes the lock model, active/waiting readers and writers, peak readers, timeout policy, and timeout/victim counters.DATETIME2(p) columns advertise TDS DATETIME2 with their scale instead of falling back to NVARCHAR.System.DateTime, and the PHMA reader can use GetDateTime().GETUTCDATE() is evaluated in UTC.DATETIME2(7) values are preserved across daemon restart and logical backup/restore.SUM(DECIMAL - DECIMAL) retains exact DECIMAL(38,2) TDS metadata for populated and zero-balance PHMA families.sp_unprepare, returns RETURNSTATUS before final DONEPROC.PDO::SQLSRV_ATTR_DIRECT_QUERY for its intended direct execution path.SELECT ?, dispose it, and execute the next statement on the same connection.BIT columns retain Boolean metadata and values through scans, expressions, grouping, CTEs, set operations, MARS, and parameterized writes.TINYINT, SMALLINT, INT, and BIGINT advertise and encode their exact SQL Server widths with range-safe conversion.NVARCHAR(MAX) and VARBINARY(MAX) retain MAX metadata for empty, NULL, short, and large values instead of changing type shape with each row.COALESCE and other scalar wrappers, including indexed parent lookups.COUNT() is exposed as SQL INT, and SUM(DECIMAL) remains exact TDS DECIMALN for GetDecimal()..admin.status.NOT NULL, primary/composite keys, UNIQUE, and unique indexes are enforced.RESETCONNECTION and sp_reset_connection can no longer switch application queries into Abyss.GRANT/DENY rules apply across every qualified path.0.1.73.sqlcmd -S 127.0.0.1,1433 \
-U website \
-P "$MACSQL_PASSWORD" \
-No \
-Q "SELECT 1 AS ok;"
Built for real development loops
Use the signed package for a boot-time LaunchDaemon with protected credentials and configurable LAN binding.
Use SQL username/password authentication through TDS with documented settings for sqlcmd, ODBC, PHP, and Node.
Manage logins, roles, object permissions, databases, backups, integrity checks, and diagnostics from the Mac client, which is a separate product.
Repair local SQL logins through Studio’s normal macOS administrator prompt instead of editing plists or tokens.
Developer preview channel
macSQL Server is the database engine and its LaunchDaemon package. macSQL Studio is the Mac client that administers it — and, over TDS, any Microsoft SQL Server. They are separate products with separate release trains: the server runs headless on a machine you administer, and the client runs on your Mac. Neither requires the other to be installed on the same machine.
The signed server package that installed, ran, and passed its pre-publication gate. Installs the engine as a system daemon and listens for TDS on port 1433.
Sign in to downloadA native Mac client for macSQL and Microsoft SQL Server. It ships no engine and links no engine library — it connects over TDS to a server that is already running.
Studio keeps itself current. It checks its own release feed at launch, downloads a new build in the background, and offers to relaunch — no account, no manual download. Updates are verified against a signing key built into the app, so a build that is not ours cannot install.
Sign in to downloadSigned-in accounts can inspect build numbers, checksums, compatibility requirements, and release notes.
Honest readiness snapshot
Overall enterprise-replacement readiness remains about 49% release-qualified. The last evidence-scored candidate remains 52–55%. Installed Build 69 single-node capability is planned at 74–76%, but that is not a release-qualified score. These are planning estimates, not benchmark scores.
Candidate gains remain provisional until the strict clean-Mac production gate passes certificate verification and all thirteen encrypted client paths with no skips, plus corruption, online-backup, archive-continuity, timed-PITR, upgrade, reboot, and rollback drills.
macSQL accounts
The account portal stores user profiles, password hashes, approval state, and revocable session hashes in macSQL. Plaintext passwords are never stored or shown. New accounts remain pending until an administrator approves them.
password_hash and password_verify.