Moe Babazadeh

Facts as of October 2026 · edits stay in this tab
ABCDEFGHIJKLMNOPQRS
1
Moe Babazadeh
2
CTO at Neuroject, building the alignment layer for construction enterprises. Building since 2007: robots, IoT and firmware, then web, mobile and AI platforms.
3
4
Facts as of
27 Oct 2026
An input; every figure below is a formula over the other sheets.
5
Figure
Value
Formula
6
Current title
CTO
=INDEX(Roles!B11:B18,MATCH(MAX(Roles!C11:C18),Roles!C11:C18,0))
7
Company
Neuroject
=INDEX(Roles!A11:A18,MATCH(MAX(Roles!C11:C18),Roles!C11:C18,0))
8
In this title since
Sep 2026
=MAX(Roles!C11:C18)
9
Years building
19
=YEAR(AsOf)-YEAR(MIN(Roles!C2:C7))
10
Roles held
6
=COUNTA(Roles!A2:A7)
11
Years at Neuroject
2.4
=ROUND(YEARFRAC(VLOOKUP(B7,Roles!A2:C7,3,FALSE),AsOf,1),1)
12
Commits since 2021
11,800+
=Roles!C22
13
Devices in production
5
=COUNTA(Devices!A2:A6)
14
Sensor records logged
0.5B+
=Devices!F2
15
Apps on both stores
2
=COUNTIFS(Products!E2:E18,"<>",Products!F2:F18,"<>")
16
Weekly downloads, patched
303k
=SUM('Open source'!E2:E6)
17
Products live
10+
=Products!B20
18
19
About
20
I started building websites as a freelancer in 2007, studied electrical engineering with a focus on control systems, and spent my university years building robots, including a 1st place at RoboCup IranOpen 2010.
21
Since then I’ve built for an electronics and IoT company, a grocery marketplace, an edtech company and a construction-tech company. Today I’m CTO at Neuroject, leading the platform that connects BIM, schedules, budgets and risks for construction enterprises, and bringing AI into it.
22
Along the way I’ve shipped apps to the App Store and Google Play, hardware that’s still logging data after 15 years, and fixes to open source projects like Gatsby and DefinitelyTyped.
23
24
Skills
25
TypeScript
26
React & Next.js
27
Laravel (PHP)
28
Python & FastAPI
29
AWS
30
React Native & Expo
31
Embedded C
32
PostgreSQL & MySQL
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Roles over time
2007201020132016201920222025FreelanceNiknam Electronic RayanAlget.nl0&1NeurojectNeuroship
Weekly downloads by package patched
050k100k150k200kgatsbyjs/gatsby163knanostores/persistent82kHuolalaTech/react-query-kit31kDefinitelyTyped/DefinitelyT…22kmicroapps/gatsby-plugin-rea…5.4k
Ready107 formulas, all calculated

Shortcuts and functions

Keyboard and mouse

Arrows
Move
⇧ Arrows
Extend the selection
⌘Arrows
Jump to the edge of the data
Enter · ⇧Enter
Down · up (inside a selection, cycle through it)
Tab · ⇧Tab
Right · left
F2
Edit the cell; while editing, switch Enter and Edit mode
Type =
Start a formula; click or drag cells (or use arrows) to point at them
Esc
Cancel the edit, clear the copy marquee, remove arrows
Delete
Clear the values (formats stay)
⌘C · ⌘X · ⌘V
Copy, cut, paste (formulas shift their relative references)
⌘Z · ⌘⇧Z
Undo · redo
⌘A
Select all
⌘B · ⌘I
Bold · italic
⌘`
Show formulas
⌘[
Select the precedents of the formula
⌥=
Sum the numbers above
⌥Enter
Open the link in the cell
F9
Calculate every formula now
Home · End
First · last column
Page Up · Page Down
A screen up · down
⌥↑ · ⌥↓
Previous · next sheet
⇧Space · Ctrl Space
Select the row · the column
Fill handle
Drag to fill; double-click to fill down beside data
Column edge
Drag to resize; double-click to fit
Name box
Type B9, Roles!C2:C7 or a name to go there; a new word names the selection

Functions

The engine is a real one: a tokenizer, a precedence-climbing parser, a dependency graph that recalculates only what changed, and cycle detection. Errors: #DIV/0!, #VALUE!, #REF!, #NAME?, #N/A, #NUM!, #CIRC! and #ERROR!.

Math

  • ABS(value)The absolute value.
  • INT(value)Rounds down to the nearest integer.
  • MOD(dividend, divisor)The remainder, with the divisor’s sign.
  • PI()π to fifteen digits.
  • POWER(base, exponent)Raises a number to a power.
  • ROUND(value, [places])Rounds to a number of decimal places, halves away from zero.
  • ROUNDDOWN(value, [places])Rounds toward zero.
  • ROUNDUP(value, [places])Rounds away from zero.
  • SIGN(value)1, 0 or -1, by the sign.
  • SQRT(value)The square root.
  • SUMIF(range, criterion, [sum_range])Adds the cells whose matching cell meets a criterion.
  • SUMIFS(sum_range, criteria_range1, criterion1, [criteria_range2, criterion2, …])Adds the cells whose rows meet every criterion.

Statistical

  • AVERAGE(value1, [value2, …])The mean of the numbers. Text and blanks in ranges are skipped.
  • AVERAGEIF(range, criterion, [average_range])The mean of the cells that meet a criterion.
  • COUNT(value1, [value2, …])How many numbers there are. Typed numbers, dates and booleans count; text in ranges does not.
  • COUNTA(value1, [value2, …])How many values are not blank. Errors and "" from formulas count.
  • COUNTBLANK(range)How many cells are empty, or hold "".
  • COUNTIF(range, criterion)Counts the cells that meet a criterion: 5, ">=2020", "<>", "Sec*".
  • COUNTIFS(criteria_range1, criterion1, [criteria_range2, criterion2, …])Counts the rows that meet every criterion.
  • LARGE(data, n)The nth largest number.
  • MAX(value1, [value2, …])The largest number.
  • MEDIAN(value1, [value2, …])The middle number.
  • MIN(value1, [value2, …])The smallest number.
  • PRODUCT(value1, [value2, …])Multiplies the numbers.
  • SMALL(data, n)The nth smallest number.
  • SUM(value1, [value2, …])Adds numbers and ranges.

Logical

  • AND(logical1, [logical2, …])TRUE when every argument is TRUE.
  • FALSE()The logical value FALSE.
  • IF(condition, value_if_true, [value_if_false])One value when the condition holds, another when it doesn’t. Only the branch taken is evaluated.
  • IFERROR(value, value_if_error)The value, or a fallback when it’s an error.
  • IFNA(value, value_if_na)The value, or a fallback when it’s #N/A.
  • IFS(condition1, value1, [condition2, value2, …])The value for the first condition that holds.
  • NOT(logical)The opposite of a logical value.
  • OR(logical1, [logical2, …])TRUE when any argument is TRUE.
  • TRUE()The logical value TRUE.

Text

  • CONCAT(value1, [value2, …])Joins text and ranges end to end.
  • CONCATENATE(text1, [text2, …])Joins text end to end.
  • FIND(search_for, text, [start])Where text first appears, counting from 1. Case-sensitive.
  • HYPERLINK(url, [label])A link: the cell shows the label and opens the address.
  • LEFT(text, [count])The first characters.
  • LEN(text)The number of characters.
  • LOWER(text)In lower case.
  • MID(text, start, count)Characters from the middle, counting from 1.
  • PROPER(text)Each word capitalised.
  • REPT(text, times)Text repeated: =REPT("█", A2) draws a bar in a cell.
  • RIGHT(text, [count])The last characters.
  • SEARCH(search_for, text, [start])Where text first appears, ignoring case; * and ? are wildcards.
  • SUBSTITUTE(text, search_for, replace_with, [occurrence])Replaces text, every occurrence or only the nth.
  • TEXT(value, format)A number shown through a format code: TEXT(A2, "0.0%"), TEXT(B4, "mmm yyyy").
  • TEXTJOIN(delimiter, ignore_empty, text1, [text2, …])Joins text with a delimiter, optionally skipping blanks.
  • TRIM(text)Without leading, trailing or doubled spaces.
  • UPPER(text)In capitals.
  • VALUE(text)Text that looks like a number, as a number.

Date

  • DATE(year, month, day)A date from its parts. Months and days past the end roll over.
  • DATEDIF(start, end, unit)Whole "Y" years, "M" months or "D" days between two dates; "YM", "MD" and "YD" give the remainders.
  • DAY(date)The day of the month.
  • DAYS(end, start)Days between two dates.
  • EDATE(start, months)The same day some months later (or earlier).
  • EOMONTH(start, months)The last day of the month, some months later.
  • MONTH(date)The month of a date, 1 to 12.
  • TODAY()Today’s date, from this device’s clock.
  • YEAR(date)The year of a date.
  • YEARFRAC(start, end, [basis])The fraction of years between two dates. Basis 0 is US 30/360, 1 actual/actual, 2 actual/360, 3 actual/365, 4 European 30/360.

Lookup

  • COLUMN([reference])The column number of a cell, or of this one.
  • COLUMNS(range)How many columns a range has.
  • INDEX(reference, row, [column])The cell at a row and column of a range. Row or column 0 means all of it.
  • MATCH(key, range, [type])Where a value sits in a row or column. Type 0 is an exact match; 1 (the default) the largest value not above it in an ascending list.
  • ROW([reference])The row number of a cell, or of this one.
  • ROWS(range)How many rows a range has.
  • VLOOKUP(key, range, index, [approximate])Finds a row by its first column and returns another column of it. Pass FALSE for an exact match.
  • XLOOKUP(key, lookup_range, return_range, [if_not_found])Finds a value in one range and returns the matching cell of another.

Info

  • FORMULATEXT(reference)The formula in a cell, as text: the spreadsheet showing its work.
  • ISBLANK(value)TRUE when the cell is empty ("" is not empty).
  • ISERROR(value)TRUE for any error.
  • ISFORMULA(reference)TRUE when the cell holds a formula.
  • ISLOGICAL(value)TRUE for TRUE or FALSE.
  • ISNA(value)TRUE for #N/A.
  • ISNUMBER(value)TRUE for a number (dates are numbers).
  • ISTEXT(value)TRUE for text.

In this workbook

Named ranges

  • AsOf = Overview!B4
  • Downloads = 'Open source'!E2:E6
  • Months = Roles!F2:F7

Conditional formatting

  • Roles: Current roles: =ISTEXT($D2)
  • Roles: Months: colour scale
  • Products: Featured products: =$B2
  • Open source: Weekly downloads: data bars
  • Open source: Kind is “Security”
  • Open source: Kind is “Data loss”

Charts

  • Roles over time: Roles!A2:A7, Roles!C2:C7, Roles!E2:E7
  • Weekly downloads by package patched: 'Open source'!A2:A6, 'Open source'!E2:E6

Overview A1: Moe Babazadeh