Drawing Ledger
The drawing fills in the transmittal. The lead still says yes.
Built and tested, first live installation pending
5 jobs to 1 per drawing issued: five hand jobs move to the engine, and the project lead keeps one review.
Reported, source 1Counted from the product specification. Not yet observed on a live installation.
₹1,250 a month per user, paid yearly, plus GST, for the Power Automate Premium licence this design does not need.
Reported, source 9Microsoft's India list price, read 25 Oct 2026.
290 automated tests, all run with no network; 33 of them came from an adversarial review.
Measured, source 3About 45 minutes of one admin's time in one sitting to switch on the managed service, then one row per project.
Reported, source 8Planned in the setup guide, not yet timed on a live tenant.
Drop, read, record
A drawing transmittal is a practice's record of what it issued, which revision, to whom and when. Kept by hand, one missed update leaves the record people point to a revision behind. Pick a sample drawing, drop it in the issue folder, and play the project lead.
Loading the demo
Issue folder · Sample Pavilion
Approval page
Approve the transmittal update
Sample Pavilion · SPVL · from Drawing Ledger to lead@example.com
A-120 · Ground Floor Plan · R1 · 09 Feb 2026 · For Construction, the project default
A-121 · First Floor Plan · R0 · first issue 02 Feb 2026 · For Construction, the project default
A-120 R0 will be marked Revoked.
Opening this page changed nothing. Only the button decides.
Or reject with a reason. Nothing is published until you choose.
Email sent
Transmittal updated: Sample Pavilion
Links only, no attachments.
- lead@example.com
- client@example.com
- consultant@example.com
Transmittal · client copy
· ·
· first issued · rev
| No. | Title | Drawing No. | Status | First issued | Rev | Rev date |
|---|---|---|---|---|---|---|
| 1 | Site Plan | A-110 | For Construction | 12 Jan 2026 | R0 | |
| 2 | Ground Floor Plan | A-120 | For Construction | 12 Jan 2026 | R0 | |
| 4 | Roof Plan | A-130 | For Construction | 19 Jan 2026 | R0 | |
| 5 | Elevations | A-140 | For Construction | 19 Jan 2026 | R0 | |
| 6 | Section AA | A-150 | For Construction | 26 Jan 2026 | R0 | |
| 7 | Annexe Plan | ANX/A-210 | For Construction | 26 Jan 2026 | R0 |
Done for you
- Type the row's seven cells
- Link the drawing number to its PDF
- Strike the old revisionNothing to strike: a first issue
- Replace the client copy
- Email the update
- Left for you: Review and approve
1 · Read
The name and the title block agree
Sample sheet A-120, revision R1. The scan reads the drawing number, project code, first issue date, revision list and title, and they match the file name.
SHEET S1STEP 1SAMPLE DATA
2 · Plan
R1 added, R0 kept
Sample transmittal for Sample Pavilion No. Title Drawing No. Status First issued Rev Rev date 1 Site Plan A-110 For Construction 12 Jan 2026 R0 2 Ground Floor Plan A-120 Revoked 12 Jan 2026 R0 2 Ground Floor Plan A-120 For Construction 12 Jan 2026 R1 09 Feb 2026 4 Roof Plan A-130 For Construction 19 Jan 2026 R0 5 Elevations A-140 For Construction 19 Jan 2026 R0 6 Section AA A-150 For Construction 26 Jan 2026 R0 7 Annexe Plan ANX/A-210 For Construction 26 Jan 2026 R0 The draft adds the R1 row under R0 and strikes R0 through in red as Revoked. First issued stays 12 Jan 2026.
SHEET S2STEP 2SAMPLE DATA
3 · Approve and send
Five jobs done, one review
Approve the transmittal update
Sample Pavilion · SPVL · from Drawing Ledger to lead@example.com
A-120 · Ground Floor Plan · R1 · 09 Feb 2026 · For Construction, the project default
A-120 R0 will be marked Revoked.
Approve and publishOpening this page changed nothing. Only the button decides.
Or reject with a reason. Nothing is published until you choose.
Transmittal updated: Sample Pavilion
Links only, no attachments.
- lead@example.com
- client@example.com
- consultant@example.com
Done for you
- Type the row's seven cells, done
- Link the drawing number to its PDF, done
- Strike the old revisionNothing to strike: a first issue, done
- Replace the client copy, done
- Email the update, done
- Left for you: Review and approve, done
The lead approves. The client copy is replaced and one email with links goes to three people. The engine did five jobs and the lead did one review Reported, source 1.
SHEET S3STEP 3SAMPLE DATA
Needs a look
A misnamed file waits
Needs a look08_A-160_SPVL_R0_Door_Schedule.pdf uses underscores instead of spaces. It is refused with a plain fix, and nothing is written.
SHEET S4NEEDS A LOOKSAMPLE DATA
- The sample sheet lands in the issue folder. Its name gives the serial, drawing number, project code, revision and title.
- The scan reads the title block: drawing number, project code, first issue date, revision list and title.
- The name and the drawing agree, so the change is planned. When they disagree on number, project or revision, the drawing wins and the file waits for a person.
- Five fields fill the new row. For a revision, the old row stays, struck through in red and marked Revoked.
- The draft waits. The project lead gets an email with a signed link and sees every row before anything changes.
- Approve and publish replaces the client copy, and each drawing number links to its exact PDF.
- One email with links, never attachments, goes to the lead and everyone on the project's notify list.
- A misnamed file is refused with a plain fix, and nothing is written. Dropping the same file twice changes nothing.
Recreated for this page on sample data: Example Studio, project Sample Pavilion, code SPVL. The real check runs every 5 minutes in office hours Reported, source 1, so this demo runs faster than life. The sheet is drawn for this page; the engine reads one title block layout today.
The drawing decides, not the file name
I took the job apart cell by cell: what each column of a transmittal means, where its value comes from, and which values only a person can decide.
Every value in a row already exists somewhere. The serial, drawing number, project code, revision and title are in the file name someone typed. Most of the same facts, plus the dates, are in the title block someone drew.
File names are typed by people. The title block is what was drawn.
So the engine reads both. It takes the drawing number with any sub project prefix, the project code, the first issue date, the revision list when it is printed as text, and the title. When the name and the drawing disagree on number, project or revision, the drawing wins and the file waits for a person.
Anatomy of a sample drawing name
- 02SerialPlaces the row
- A-120Drawing numberMust match the title block
- SPVLProject codeMust match the project list and the title block
- R1RevisionMust match the revision list
- Ground Floor PlanTitleFills the Title column unless the title block names it differently
- SHEET NO
- A-120
- JOB CODE
- SPVL
- REV
- R1 · 09 FEB 2026
- SHEET TITLE
- GROUND FLOOR PLAN
When the name and the drawing disagree on number, project or revision, the drawing wins and the file waits for a person.
SHEET F1REV R0DATE 25 OCT 2026SAMPLE DATA
It asks a person only when there is no single right answer. If a title block draws a revision date as lines instead of text, the lead types it on the approval page. Status starts from the project's default, and the lead can change it per row.
Each check compares the whole issue folder with the transmittal and plans only the difference. A missed or doubled check cannot damage the record, and the same check run twice plans nothing.
Names it refuses, and the fix it sends
| Sample file | Why it waits | The fix |
|---|---|---|
| A-160 SPVL R0 Door Schedule.pdf | No serial, so the row cannot be placed. | Start the name with the serial, such as 08. |
| 08 A-160 SPVL Door Schedule.pdf | No revision. | Add R0 for a first issue. |
| 08_A-160_SPVL_R0_Door_Schedule.pdf | Underscores instead of spaces. | Rename it with spaces. |
| 08 A-160 SPVL R0 Door Schedule (1).pdf | Looks like a duplicate copy. | Delete the copy, or give a new drawing its own name. |
| 08 A-160 SPVL R0 Door Schedule.pdf, with A-161 in its title block | The name and the drawing disagree, and the drawing wins. | Fix the name or the title block, then drop it again. |
| 08 A-160 SPVL R0 Door Schedule.dwg | Not a PDF. | Export the drawing to PDF. |
SHEET F2REV R0DATE 25 OCT 2026SAMPLE DATA
Old rows stay, struck through
A transmittal settles an argument only if it still shows what was issued before. So by default the engine adds rows, and it has no way to delete one.
A new revision keeps the old row, strikes it through in red and marks it Revoked, then adds the new row under it. A deleted file keeps its row as well, struck through and marked Removed. A project can choose one row per drawing instead, updated in place, and the first issue date still never changes.
First issued is the drawing's first issue date and never changes. Rev date comes from the title block. The upload date is never used in its place, and impossible dates, such as one before the first issue, are refused.
Each drawing number links to the PDF that row was published from, so an old row points to the old drawing, not the new one. The client copy changes only after the project lead says yes, and only if it is still the version the lead reviewed.
The engine edits the practice's own Word file in place instead of rebuilding it, so the letterhead, the styles and every row it did not touch stay exactly as they were.
The sample record, nothing erased
| No. | Title | Drawing No. | Status | First issued | Rev | Rev date |
|---|---|---|---|---|---|---|
| 1 | Site Plan | A-110 | For Construction | 12 Jan 2026 | R0 | |
| 2 | Ground Floor Plan | A-120 | Revoked | 12 Jan 2026 | R0 | |
| 2 | Ground Floor Plan | A-120 | Revoked | 12 Jan 2026 | R1 | 09 Feb 2026 |
| 2 | Ground Floor Plan | A-120 | For Construction | 12 Jan 2026 | R2 | 23 Mar 2026 |
| 3 | First Floor Plan | A-121 | For Construction | 02 Feb 2026 | R0 | |
| 4 | Roof Plan | A-130 | Revoked | 19 Jan 2026 | R0 | |
| 4 | Roof Plan | A-130 | For Construction | 19 Jan 2026 | R1 | 02 Mar 2026 Typed by the lead |
| 5 | Elevations | A-140 | For Construction | 19 Jan 2026 | R0 | |
| 6 | Section AA | A-150 | Removed | 26 Jan 2026 | R0 | |
| 7 | Annexe Plan | ANX/A-210 | For Construction | 26 Jan 2026 | R0 |
- Red strike: Revoked, replaced by a newer revision
- Grey strike: Removed, the file was deleted
SHEET F3REV R0DATE 25 OCT 2026SAMPLE DATA
Three plans I struck out
The obvious way
On Microsoft 365, the obvious build is a Power Automate flow around my code: a trigger, an approval and an email. Azure and Power Automate were both new to me, and three plans broke on Microsoft's own rules while I built.
- A Power Automate flow calling my code The free licence limits a flow to standard connectors. Calling my code over HTTP needs a connector outside that set, so the account that owns the flow needs Power Automate Premium. Reported, source 10
- Microsoft's Excel API for the project list It has no application permission, so an automation identity cannot use it. Reported, source 11
- Sharing links pasted into the project list Microsoft Graph opens a sharing link for an app only with access to every file in the organisation, which this app must never have. Reported, source 12
What it would cost
A Power Automate Premium licence for as long as the flow runs, and an identity with far more reach than the job needs.
₹1,250 a month per user, paid yearly, plus GST: Microsoft's India list price for Power Automate Premium, read 25 Oct 2026. Reported, source 9
The flow only kept time, asked for a yes and sent mail. A small app could do all three itself.
What I built
One small Azure Functions app with its own timer, its own approval page behind Microsoft sign in, and Microsoft Graph mail. It reads and writes the project list as a whole file, guarded by its version tag, and asks people for the address in the browser bar instead of a sharing link. There is no Power Automate licence to buy, and the app reaches only what it is granted.
Five jobs become one review
An architect's part is two steps: name the PDF by the rule and drop it in the issue folder. Everything after the drop is the engine's job, except one review.
For each drawing issued, the engine does five jobs that are otherwise done by hand Reported, source 1. The project lead keeps one: review and approve, from an email, on a phone or a laptop.
What the engine does
- Types the row's seven cells
- Links the drawing number to its PDF
- Strikes the replaced revision
- Replaces the client copy
- Emails the update to the lead and the notify list
What stays with people
- Name the PDF by the rule and drop it in the issue folder.
- Review and approve the change.
- Type a revision date, only when the drawing draws it as graphics.
The update goes to the lead and everyone on the project's notify list every time, with links to the current transmittal and folder, so it no longer depends on someone remembering to send it.
I have not measured these hours on a live installation yet. The calculator shows the arithmetic in the open, so you can put in your own numbers.
Safe to leave running
Software that writes a record people rely on should reach as little as possible, and when something fails it should stop, say so and damage nothing.
What it can touch
It signs in to Microsoft Graph with a managed identity, so it stores no password or client secret for Microsoft Graph. Run as a service across organisations, the app's only credential is that identity, linked by a federated credential.
2 sites at most it can write to, each named by your admin: the site you share with clients and its own small site. Never the main office site, never the whole organisation. Reported, source 7
1 shared mailbox it can send from. A setup step checks that another mailbox is refused. Reported, source 7
0 passwords or client secrets stored for Microsoft Graph. It signs in with a managed identity. Reported, source 1
Two things are stored: one key that signs approval links and seals records, and in a self hosted install, the platform's sign in secret, which expires and has a renewal step.
What it can touch
SharePoint sites
Write on two named sites at most
Never the main office site
Mailboxes
Send from one shared mailbox
Microsoft Graph sign in
Managed identity. No password or client secret stored.
Approval page
Microsoft sign in. Your organisation and the named approver only.
SHEET F4REV R0DATE 25 OCT 2026ILLUSTRATION
Who can say yes
The approval page sits behind Microsoft sign in. It accepts only an account from the practice's own organisation whose sign in name is the project's approver. The managed service also matches that name to the person's object ID, so a reused or renamed address cannot approve; a self hosted install can switch the same check on.
Links are signed and expire. Opening a link changes nothing, because a mail scanner may open it before anyone reads the email; only the button decides. The page is never cached, cannot be framed by another site and sends a strict content security policy, and its error pages show a short reference, never internals.
Drawings stay in the practice's SharePoint and pass through memory only. Logs hold project codes, file names, statuses and approver addresses, never the text of a document, and the managed service keeps them for 30 days Reported, source 8.
When something fails
Every write is checked against the version it read, so it fails rather than overwrite a change it has not seen. The rest is a list of things that will go wrong one day, and what happens then.
| If this happens | Drawing Ledger does this |
|---|---|
| A check runs twice, or one is missed | The next check compares the whole folder again. A second run plans nothing. |
| Someone edits the client copy or replaces a drawing after the lead reviewed it | Publishing stops and a fresh draft goes out. It never overwrites. |
| The publish lands, then the email fails | The publish stands, because it is recorded the moment the client copy is written. The email goes again at the next check. |
| Someone edits the record file to approve a change | Its seal breaks. The update is cancelled and reported. |
| Microsoft asks it to slow down | It waits as asked, up to 60 seconds, for up to 5 attempts Reported, source 2. A write that may have landed is never sent twice. |
| The transmittal is open in Word, or the project list in Excel | Publishing waits for the next check, and log lines wait in a queue. |
| One project's folder errors | The other projects still run, and the failed one retries at the next check. |
| A Word file would come out damaged | It is never saved. A last gate checks every Word file before it is written. |
| A published transmittal has to be undone | SharePoint's version history restores it, and the next draft starts from the restored version. |
Checks run every 5 minutes Reported, source 1. When nothing changed, Last checked is stamped at most once an hour, so the project list gains at most one new SharePoint version an hour instead of up to 12 Modelled, source 2.
How I know it holds
290 automated tests run with no network, with fakes standing in for Microsoft Graph and Azure. 33 of them came from an adversarial review Measured, source 3, and two review rounds fixed over 40 findings Reported, source 4.
When I refactored for readability, I checked that the behaviour did not change: 176 output files compared byte for byte, all identical, with no test edited. The longest function went from 86 lines to 44 Measured, source 6.
The same engine runs on a laptop, with plain folders standing in for SharePoint and an outbox folder for mail. There, the end to end rehearsal passed: an approval with a typed date, a revision revoked, a rejection, a removed file, a bad name refused, a rerun that changed nothing, an impersonation refused and hand edits cancelled.
A test also checks the setup guides against the code, so a setting the code needs cannot go missing from a guide.
Nothing has run on a live Microsoft 365 tenant yet. Before the first installation, I listed the Microsoft behaviours the documentation leaves open, each with the check that settles it and a fallback: 19 for the managed service Reported, source 8 and 15 for a self hosted install Reported, source 7.
How it got here
From the first prototype to 290 passing tests took about two weeks Reported, source 4. Day 1 is the day the prototype passed.
Day 1 · Prototype
A standard library engine edits a Word transmittal in place, and a second run changes no byte.
Prove the file can be edited safely before building around it.
Day 1 · Second opinion
A separate review script: 58 checks passed, 16 defects logged Measured, source 5.
Find matching and date mistakes before production, not after.
Day 11 · Title block first
Rows match on the drawing number printed in the title block, not on the file name.
Names drift. The title block is what was drawn.
Day 12 · History rows
Every issue stays a row, and a new revision strikes the old row in red.
A record must show every issue ever made, not only the latest.
Day 12 · One small app
An Azure Functions app with its own timer, approval page and mail replaces the planned flow; 189 tests Reported, source 4.
Each plan it replaced broke on a Microsoft rule.
Day 12 · Review round
33 findings fixed; 242 tests Reported, source 4.
Close every way a retry, a crash or a hand edit could publish the wrong thing.
Day 15 · Refactor and service mode
Behaviour proven identical on 176 output files Measured, source 6. Managed service mode added, with no client secret; 290 tests Reported, source 4.
Someone else can keep it running, and a practice can try it without installing code.
Switched on in one sitting
Nothing has to be installed on anyone's computer. Setup happens in a browser, and a project starts with one row and a tick.
Four steps for the managed service. About 45 minutes of your admin's time, once, then one row per project Reported, source 8.
- Approve one app, grant write on the named sites and allow sending from one shared mailbox
Your admin also chooses who may sign in, then removes the tool consents used for the grant. Planned in the guide, not yet timed on a live tenant.
- Wait while Microsoft applies the permissions
Site grants take minutes, the mailbox scope 30 minutes to 2 hours and the per site permission up to about 24 hours.
- Add one row for the project and tick Active
Paste the folder addresses from the browser bar, name the approver and pick a default status. Within one check, Status reads: Up to date: 0 rows in the transmittal.
- Name each PDF by the rule and drop it in the issue folder
The lead approves from an email, on a phone or a laptop.
The way back: untick Active and that project stops at the next check. Your admin can disable or delete the app; removing it takes about 15 minutes Reported, source 8, and nothing in SharePoint is deleted.
A shared mailbox and a SharePoint communication site normally need no extra Microsoft 365 licence Reported, source 7.
The project list
| Project | Code | Issue folder | Approver | Notify | Default status | Mode | Active | Status | Last checked |
|---|---|---|---|---|---|---|---|---|---|
| Sample Pavilion | SPVL | Address from the browser bar | lead@example.com | client@example.com; consultant@example.com | For Construction | History | Ticked | Up to date: 0 rows in the transmittal. | 09:35 |
A pasted sharing linkRefused: this is a sharing link. Paste the address from the browser bar instead.
SHEET F5REV R0DATE 25 OCT 2026SAMPLE DATA
What it runs on
One Azure Functions app on the Flex Consumption plan, Microsoft Graph and SharePoint. The core uses the Python standard library, and only the title block reader needs an extra package, for PDF text. The runtime needs three packages, each pinned to an exact version, so a deploy or a rollback gets the same versions Measured, source 2.
Two hostings come from one zip: I can run it for you as a managed service, or it can be installed in your own Azure on pay as you go. Moving between them is a settings change plus your admin's grants. No data moves, because all state lives in your SharePoint.
About a third of Azure's free monthly compute grant, for one practice on an example schedule. Storage and logs bill separately and are not measured yet. Modelled, source 14
Show the math
- Example schedule: a check every 5 minutes for 11 hours = 132 checks a day
- 132 checks × 26 days = 3,432 checks a month
- 3,432 checks × 2 GB × 5 s, an estimate = 34,320 GB seconds
- 34,320 ÷ 100,000 GB seconds free each month ≈ 0.34, about a third
The free grant is 100,000 GB seconds and 250,000 executions a month per subscription, on a paid pay as you go subscription only Reported, source 13.
Microsoft lists October 2028 as the expected end of support for Python 3.12 on Azure Functions, so the move to a newer runtime is already on my list Reported, source 16.
What it does not do yet
- It reads one title block layout and writes one transmittal layout, with one list of status words. A practice with a different layout needs a small adapter, which I have not built yet.
- It reads text, not pictures. A scanned or image only PDF is not read.
- It has not run on a live Microsoft 365 tenant. A rehearsal on a test tenant comes first, then the first installation.
- Two checks from the first review are still open: a warning when a revision jumps, such as R2 to R10, and a check that a revision date is not earlier than the one before.
What I learned
The rules taught me more than the code did. An API with no application permission, a sharing link that opens only with access to every file, a publish that must be recorded the moment it lands: each one made the design smaller and safer. The lesson I keep is to read the permission table before drawing the architecture.
Get this for your business
- Who it is for
- Architecture, engineering and construction practices on Microsoft 365 and SharePoint that issue PDF drawings and keep a drawing transmittal in Word.
- What you get
- A transmittal that keeps itself. Each PDF dropped in a project's issue folder becomes a checked row. The project lead approves from an email after a work account sign in. The client copy is replaced with every drawing number linked to its exact PDF, old revisions struck through, deleted files marked Removed, and no row ever deleted. A project list in plain words, a log and a health check come with it.
- What you need
- Microsoft 365 with SharePoint. PDF drawings whose title block prints the drawing number, project code and date as text. A file naming rule with serial, drawing number, project code and revision. A Word transmittal template. A shared mailbox, a small SharePoint site and one approver per project. If your title block or transmittal layout differs from the one it reads today, a small adapter comes first.
- Setup
- I can run it for you as a managed service, or install it in your own Azure on pay as you go. Your admin gives about 45 minutes in one sitting for the managed service, or about an hour for your own Azure, then Microsoft's own waits of up to about a day. After that, one row per project: tick Active to start, untick it to stop. These durations are planned, not yet timed on a live tenant.
kshitijbhatnagar97@gmail.com
No prices here. I scope each setup after I hear how your work runs today.
How these numbers were measured
- Measured
- Observed with a tool or a log.
- Reported
- A person or a document said it; the source names who.
- Modelled
- Computed from inputs shown on the page.
- Example
- An illustration or a default you can change.
- 1
Drawing Ledger product docs: the README, the specification of its rules and the demo notes. They set the file name rule, title block reading, history rows, dates, status, links, approvals, emails and the check schedule; the five jobs per drawing issued are counted from these rules. Read 25 Oct 2026.
- 2
My engine source code: the name rules, the title block reader, the difference planner, the Word engine, the check runner, the approval page and its sign in, the Microsoft Graph client, the project list reader, and the list of pinned runtime packages. Read 25 Oct 2026.
- 3
Engine test suite: 290 test methods in 19 test files, 33 of them in the adversarial set, counted 25 Oct 2026. The suite runs with no network; fakes stand in for Microsoft Graph and Azure.
- 4
My build log: milestones from Day 1, the day the prototype passed, to Day 15; test counts at each milestone (189, 242, 290); review rounds (33 findings, then 4 low findings and 8 issues); the end to end rehearsal on a laptop; the next step, a rehearsal on a test tenant; the lessons about Microsoft's rules. Read 25 Oct 2026.
- 5
Prototype review script output, Day 1: summary line of 58 checks passed and 16 defects logged. Read 25 Oct 2026.
- 6
Optimisation record, Day 15: old and new code compared byte for byte on 176 output files, all identical, with random email boundaries and clock stamps masked and no test edited; longest function 86 lines before and 44 after, from a syntax tree scan. Read 25 Oct 2026.
- 7
Self hosted setup guide: browser only setup, about one hour of an admin's time on grant day, write on named sites only, one shared mailbox checked by a positive and a negative test, Microsoft's waits, the off switches, the cost section with its schedule arithmetic, and 15 open points with their checks. Read 25 Oct 2026.
- 8
Managed service guide: one admin sitting of about 45 minutes, sign in through a managed identity with no client secret, logs kept 30 days, removal in about 15 minutes, and 19 open points with their checks. Planned durations, not yet timed on a live tenant. Read 25 Oct 2026.
- 9
Microsoft, Power Automate pricing for India: Power Automate Premium at ₹1,250.00 per user a month, paid yearly, GST extra as applicable. Read 25 Oct 2026. microsoft.com, opens the source
- 10
Microsoft Learn, Types of Power Automate licenses (page updated 22 Sep 2026): the Free licence limits connector usage to standard connectors only; Power Automate Premium also covers the connectors outside that set, custom connectors included. Read 25 Oct 2026. learn.microsoft.com, opens the source
- 11
Microsoft Learn, Microsoft Graph v1.0, Get table in the Excel workbook API: application permissions are listed as not supported. Read 25 Oct 2026. learn.microsoft.com, opens the source
- 12
Microsoft Learn, Microsoft Graph v1.0, Access shared items: an app needs Files.ReadWrite.All or Sites.ReadWrite.All, both tenant wide. Read 25 Oct 2026. learn.microsoft.com, opens the source
- 13
Microsoft Azure, Azure Functions pricing for India: the Flex Consumption plan includes a monthly free grant of 250,000 executions and 100,000 GB seconds per subscription, on paid pay as you go subscriptions only. Read 25 Oct 2026. azure.microsoft.com, opens the source
- 14
Compute model for one practice, worked 25 Oct 2026: an example schedule of a check every 5 minutes for 11 hours a day is 132 checks; on 26 days a month that is 3,432 checks; at 2 GB and an estimated 5 seconds a check that is 34,320 GB seconds, about a third of the free grant. The 5 seconds stays an estimate until real run times are measured. Schedule and memory from the cost section of the self hosted setup guide.
- 15
Calculator model, worked 25 Oct 2026: hours a month = drawings issued × (minutes by hand − minutes of review) ÷ 60. The defaults are examples: 50 drawings a month, and 12 minutes a drawing, my own estimate, not measured. Review time has no sourced default and starts at 0.
- 16
Microsoft Learn, Supported languages in Azure Functions: Python 3.12 is generally available with an expected end of support in October 2028 (page updated 22 Oct 2026). Read 25 Oct 2026. learn.microsoft.com, opens the source