diff --git a/public/brand/icons/brayer.svg b/public/brand/icons/brayer.svg
new file mode 100644
index 0000000..1c8f022
--- /dev/null
+++ b/public/brand/icons/brayer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/brand/icons/smopt.svg b/public/brand/icons/smopt.svg
new file mode 100644
index 0000000..8170c25
--- /dev/null
+++ b/public/brand/icons/smopt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/data/site.ts b/src/data/site.ts
index 23f284a..532e215 100644
--- a/src/data/site.ts
+++ b/src/data/site.ts
@@ -110,6 +110,16 @@ export const PROJECTS: Project[] = [
pypi: 'nlpql',
icon: 'nlpql.svg',
},
+ {
+ name: 'smopt',
+ display: 'SmOpt',
+ tagline: 'Penalty free first order solvers for optimization on the Stiefel manifold',
+ category: 'Optimization',
+ github: gh('smopt'),
+ docs: eggzecDocs('smopt'),
+ pypi: 'smopt',
+ icon: 'smopt.svg',
+ },
// ---- Numerics ---------------------------------------------------------
{
@@ -175,6 +185,15 @@ export const PROJECTS: Project[] = [
pypi: 'gnspy',
icon: 'gnspy.svg',
},
+ {
+ name: 'brayer',
+ tagline: 'Desktop forms built from Pydantic models, with widgets chosen from the field types',
+ category: 'Tooling',
+ github: gh('brayer'),
+ docs: eggzecDocs('brayer'),
+ pypi: 'brayer',
+ icon: 'brayer.svg',
+ },
]
/** How a project is written in prose and on cards. */