diff --git a/src/components/MemberRow.tsx b/src/components/MemberRow.tsx
new file mode 100644
index 0000000..a31a946
--- /dev/null
+++ b/src/components/MemberRow.tsx
@@ -0,0 +1,24 @@
+import imageUrl from '../imageUrl';
+
+export default function MemberRow({ member }: { member: SGA.MemberDocument }) {
+ let thumbUrl: string | null = null;
+ if (member.profile_photo) {
+ thumbUrl = imageUrl(member.profile_photo).url();
+ }
+
+ return (
+
+
+ {thumbUrl ? (
+

+ ) : null}
+
+
+
{member.name}
+
{member.role}, {member.year}
+
+
{member.bio}
+
+
+ );
+}
diff --git a/src/pages/committee.tsx b/src/pages/committee.tsx
new file mode 100644
index 0000000..cfec114
--- /dev/null
+++ b/src/pages/committee.tsx
@@ -0,0 +1,26 @@
+import React from 'react';
+import Hero from '../components/Hero';
+import MemberRow from '../components/MemberRow';
+import useQuery from '../hooks/useInitiatives';
+
+export default function Committee() {
+ let excomm = useQuery(
+ `*[_type == 'member' && committee == 'excomm'] | order (role, year desc)`
+ );
+ // year desc because seniority 8)
+
+ if (!excomm) {
+ return null;
+ }
+
+ return (
+ <>
+
+
+ {excomm.map((member) => {
+ return ;
+ })}
+
+ >
+ );
+}
diff --git a/src/pages/officers.tsx b/src/pages/officers.tsx
new file mode 100644
index 0000000..d3ff930
--- /dev/null
+++ b/src/pages/officers.tsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import Hero from '../components/Hero';
+import MemberRow from '../components/MemberRow';
+import useQuery from '../hooks/useInitiatives';
+
+export default function Officers() {
+ let officers = useQuery(
+ `*[_type == 'member' && committee == 'officer']`
+ );
+
+ if (!officers) {
+ return null;
+ }
+
+ return (
+ <>
+
+
+ {officers.map((officer) => {
+ return ;
+ })}
+
+ >
+ );
+}