<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nidhi</title>
    <description>The latest articles on DEV Community by Nidhi (@nidhibuilds).</description>
    <link>https://dev.to/nidhibuilds</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4178143%2Fc5dfb606-1557-48d2-bc8c-33c0883c9afd.png</url>
      <title>DEV Community: Nidhi</title>
      <link>https://dev.to/nidhibuilds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nidhibuilds"/>
    <language>en</language>
    <item>
      <title>How to find which Indian government schemes you qualify for (and which documents to get ready first)</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Tue, 27 Oct 2026 10:43:53 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/how-to-find-which-indian-government-schemes-you-qualify-for-and-which-documents-to-get-ready-first-ncg</link>
      <guid>https://dev.to/nidhibuilds/how-to-find-which-indian-government-schemes-you-qualify-for-and-which-documents-to-get-ready-first-ncg</guid>
      <description>&lt;p&gt;India has thousands of central and state welfare schemes, from crop insurance to scholarships to pensions. Most people who qualify for one never apply. That is usually not because the scheme is hard. It's because finding the right scheme, reading its fine print and collecting the papers takes longer than anyone has. Here's the process I'd follow, plus a small free tool I built to speed up the first step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Start from the official catalogue
&lt;/h3&gt;

&lt;p&gt;The Government of India runs &lt;strong&gt;myScheme&lt;/strong&gt; (&lt;a href="https://www.myscheme.gov.in" rel="noopener noreferrer"&gt;https://www.myscheme.gov.in&lt;/a&gt;), a single portal that lists central and state schemes with their eligibility, benefits, documents and application process. State departments also run their own portals, such as MahaDBT in Maharashtra or the SSP portal in Rajasthan.&lt;/p&gt;

&lt;p&gt;Whatever site you use to &lt;em&gt;discover&lt;/em&gt; a scheme, the official page is where you &lt;em&gt;decide&lt;/em&gt;. Check that the address ends in &lt;code&gt;.gov.in&lt;/code&gt; or &lt;code&gt;.nic.in&lt;/code&gt; before you type in Aadhaar or bank details.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Write down the facts that decide eligibility
&lt;/h3&gt;

&lt;p&gt;Nearly every scheme filters on the same handful of facts. Write yours down once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;State of residence.&lt;/strong&gt; Many schemes are state-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Age&lt;/strong&gt;, in completed years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gender.&lt;/strong&gt; Some schemes are only for women or for transgender persons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annual family income&lt;/strong&gt;, usually from all sources, and usually backed by an income certificate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Occupation&lt;/strong&gt;: farmer, student, self-employed, salaried, unemployed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social category&lt;/strong&gt;: General, OBC, SC, ST, PVTG or DNT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disability&lt;/strong&gt;, and its percentage if you have a certificate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rural or urban&lt;/strong&gt; residence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Special groups&lt;/strong&gt;: ex-serviceman, freedom fighter or dependent, orphan, widow, ward of police or CAPF personnel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lists you're on&lt;/strong&gt;: a ration card (AAY or PHH), or an SECC or below-poverty-line list.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Read the fine print the filters miss
&lt;/h3&gt;

&lt;p&gt;Filters get you a shortlist, not an answer. These conditions usually sit only in the eligibility text:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Land in your name.&lt;/strong&gt; PM-KISAN, for example, is for landholding farmer families with cultivable land in their own names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Being on an existing list.&lt;/strong&gt; Ayushman Bharat PM-JAY uses the SECC 2011 deprivation criteria. Free food grain under PM-GKAY goes to Antyodaya and Priority Household ration-card families.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Being a current student&lt;/strong&gt; at a recognised institution, often with an attendance or marks condition. This applies to most scholarships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A life event.&lt;/strong&gt; Some schemes are for a marriage, a first pregnancy, a death in the family, or a serious illness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not already receiving a similar benefit.&lt;/strong&gt; Many pensions and scholarships forbid holding two at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not paying income tax.&lt;/strong&gt; Atal Pension Yojana, for example, has been closed to income-tax payers since October 2022.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open and close dates.&lt;/strong&gt; Some schemes run in yearly windows, and some have ended. If a scheme shows a close date, confirm it is still running before you spend time on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Prepare the documents most schemes ask for
&lt;/h3&gt;

&lt;p&gt;You'll save the most time here, because the same papers come up again and again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aadhaar card, with your current mobile number linked to it&lt;/li&gt;
&lt;li&gt;A bank account in your own name, linked to Aadhaar, since most benefits are paid by direct transfer&lt;/li&gt;
&lt;li&gt;Income certificate from the tehsil or revenue office&lt;/li&gt;
&lt;li&gt;Caste or category certificate, if you're applying under a reserved category&lt;/li&gt;
&lt;li&gt;Domicile or residence certificate for state schemes&lt;/li&gt;
&lt;li&gt;Ration card, which matters for food and many health schemes&lt;/li&gt;
&lt;li&gt;Land records for farmer schemes&lt;/li&gt;
&lt;li&gt;Disability certificate or UDID card&lt;/li&gt;
&lt;li&gt;Student documents: previous mark sheets, an admission or bonafide certificate, and fee receipts&lt;/li&gt;
&lt;li&gt;Recent passport-size photographs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certificates such as income and caste can take days or weeks, so apply for them before you start the scheme application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Apply only through official channels
&lt;/h3&gt;

&lt;p&gt;Use the scheme's official portal or your nearest &lt;strong&gt;Common Service Centre (CSC)&lt;/strong&gt;, where a village-level entrepreneur can file the application for you. Be wary of anyone promising guaranteed approval for a fee. Keep the acknowledgement number, and check your status on the same portal.&lt;/p&gt;

&lt;h3&gt;
  
  
  A shortcut for step 1: YojanaMatch
&lt;/h3&gt;

&lt;p&gt;I built &lt;strong&gt;YojanaMatch&lt;/strong&gt; (&lt;a href="https://nidhi-bhai.github.io/yojana-match/" rel="noopener noreferrer"&gt;https://nidhi-bhai.github.io/yojana-match/&lt;/a&gt;) to make the shortlist step faster. You answer the ten questions from Step 2, and it checks them against 239 central and state schemes copied from myScheme. It splits the results in two:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Matches.&lt;/strong&gt; A scheme counts as a match only when every condition in its official eligibility text maps to one of your answers. That bar is strict, and only a handful of schemes clear it, mostly pensions such as old-age and widow pensions, and MGNREGA. Most people get zero to two firm matches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Possibly eligible, check conditions.&lt;/strong&gt; This is where most schemes land: the official text has a condition the form can't settle, such as land in your name, a marriage, a first pregnancy, or not paying income tax. It quotes that condition so you know what to check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Schemes whose close date on myScheme has passed are marked &lt;strong&gt;Closed&lt;/strong&gt; and are never shown as matches. Each scheme shows its eligibility text, the documents myScheme lists, the official source page, and the apply link where myScheme gives one. Every scheme also has its own page you can share. It works in English, Hindi and Telugu. The Telugu scheme text is a machine translation, marked beta, so check the English.&lt;/p&gt;

&lt;p&gt;To be clear about its limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is unofficial.&lt;/strong&gt; It's not a government website, and a match isn't a promise of eligibility. Read the eligibility text and confirm on the official page before you apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It covers a subset.&lt;/strong&gt; 239 schemes is far from every scheme in India. Some states and UTs, including Goa, Uttarakhand, Himachal Pradesh and Puducherry, have no state schemes in it yet, and the form labels them "central schemes only".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The data is a copy.&lt;/strong&gt; Each record says "Copied from myScheme on 2026-10-27". Rules change, so the official page wins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's free.&lt;/strong&gt; There's an optional $2 PDF (in English) of your firm matches, but it's the same checklist the page shows for free. Payment is through PayPal, which can't take payments from buyers in India, so for most people the free page is the whole product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you help other people apply, as a CSC operator, at an NGO or just as the family member who handles the paperwork, I'd like to hear which schemes or states you'd want added.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Unofficial guide. Scheme rules change, so always verify on the official site (myscheme.gov.in or the scheme's own portal) before applying.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>india</category>
      <category>opendata</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to find which countries actually import your product, using free UN Comtrade data</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:40:49 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/how-to-find-which-countries-actually-import-your-product-using-free-un-comtrade-data-45ed</link>
      <guid>https://dev.to/nidhibuilds/how-to-find-which-countries-actually-import-your-product-using-free-un-comtrade-data-45ed</guid>
      <description>&lt;p&gt;Most first-time exporters start with a list of buyers' emails. A better place to start is one question: which countries actually paid for this product last year, and how much? You can answer it for free in about fifteen minutes. Here is how, with real 2024 numbers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Get the right HS code (this is where most people go wrong)
&lt;/h3&gt;

&lt;p&gt;Customs and trade statistics are organised by the Harmonized System (HS), a six-digit product code that is shared worldwide. Countries add their own digits after the first six. India's ITC-HS uses eight, for example. International comparisons only work at six digits.&lt;/p&gt;

&lt;p&gt;Pick the most specific six-digit code that honestly describes what you ship:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Green (unroasted) coffee is &lt;strong&gt;0901.11&lt;/strong&gt;, "Coffee; not roasted or decaffeinated". That is a clean match.&lt;/li&gt;
&lt;li&gt;Turmeric is &lt;strong&gt;0910.30&lt;/strong&gt;, which covers turmeric (curcuma) in every form. That is close enough, though it isn't one commercial grade.&lt;/li&gt;
&lt;li&gt;Moringa leaf powder has no code of its own. It usually falls under &lt;strong&gt;1211.90&lt;/strong&gt;, a basket of plants used in pharmacy and perfumery. Any number you pull for it covers far more than moringa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write down how specific your code is. It decides how much you can trust everything that follows.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pull imports from the world
&lt;/h3&gt;

&lt;p&gt;Open Comtrade Plus (comtradeplus.un.org), or call the public preview API directly. No key is needed for small queries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://comtradeapi.un.org/public/v1/preview/C/A/HS?flowCode=M&amp;amp;period=2024&amp;amp;partnerCode=0&amp;amp;cmdCode=090111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This query asks for annual (A) imports (&lt;code&gt;flowCode=M&lt;/code&gt;) of HS 090111 in 2024 from all partners combined (&lt;code&gt;partnerCode=0&lt;/code&gt;, "World"), across every reporting country. Each row has a &lt;code&gt;primaryValue&lt;/code&gt; in US dollars and, usually, a quantity in kilograms.&lt;/p&gt;

&lt;p&gt;For green coffee, the response I pulled on 27 Oct 2026 had 147 reporting countries. The top three were:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reporter&lt;/th&gt;
&lt;th&gt;2024 imports, HS 090111 (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;USA&lt;/td&gt;
&lt;td&gt;6,319,859,239&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;4,706,705,407&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Italy&lt;/td&gt;
&lt;td&gt;2,753,529,337&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Read the numbers correctly
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Imports are usually valued CIF.&lt;/strong&gt; That means the value includes freight and insurance to the buyer's border, so it is not comparable to an FOB export quote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value divided by quantity gives a rough unit value.&lt;/strong&gt; Use it as a sanity check on price bands, not as a price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not every country has reported yet.&lt;/strong&gt; A missing country may simply be late, so check the reporter count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big producers can be big importers.&lt;/strong&gt; In 2024, India reported $42.1M of turmeric imports (HS 091030) and ranked second after the USA ($56.2M). That is easy to miss if you assume a producer never imports. It is also a lead: someone in India is buying turmeric from abroad.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Go from country to company
&lt;/h3&gt;

&lt;p&gt;A country can't sign a purchase order. Once you have three to five target countries, narrow down to actual buyers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trade show exhibitor and visitor lists.&lt;/strong&gt; Exhibitor lists for fairs like Anuga, Gulfood, BioFach or Seafood Expo Global are often public and name real companies in your category.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Industry associations.&lt;/strong&gt; Member directories (coffee, tea, herbal products, valves…) list firms that already buy in the category.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Company types, not just names.&lt;/strong&gt; Ask which kind of business buys this as an input: botanical manufacturers, spice grinders, food wholesalers. Then search for that type in the target country.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job titles.&lt;/strong&gt; Your email should reach the purchasing manager or the category buyer, not &lt;a href="mailto:info@"&gt;info@&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then write to them with the specification they would file: grade, moisture, certificates and MOQ. Don't lead with a market-size slide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where BuyerRadar fits
&lt;/h3&gt;

&lt;p&gt;I got tired of redoing steps 1–4 by hand, so I built &lt;strong&gt;BuyerRadar&lt;/strong&gt; (&lt;a href="https://nidhi-bhai.github.io/buyer-radar/" rel="noopener noreferrer"&gt;https://nidhi-bhai.github.io/buyer-radar/&lt;/a&gt;). For 48 curated products (40 goods and 8 software categories), it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ranks importing countries from a stored UN Comtrade 2024 snapshot, using the exact API values and saying when the HS heading is broader than the product, as it is for moringa;&lt;/li&gt;
&lt;li&gt;scores buyer company types, trade shows, associations, marketplaces and job titles from 1 to 5 on Money, Authority and Need, with a written reason and a source link for each score;&lt;/li&gt;
&lt;li&gt;shows the top 5 channels for free, and sells the full ranked report for $19.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It covers only those 48 products, and it doesn't name individual importers.&lt;/li&gt;
&lt;li&gt;Every score except the Comtrade figures is an editorial judgment, not a measurement.&lt;/li&gt;
&lt;li&gt;The company types and job titles use US classifications (NAICS and O*NET).&lt;/li&gt;
&lt;li&gt;The software categories have no trade data at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat it as a shortlist to check, not as a buyer list.&lt;/p&gt;

&lt;p&gt;The method above works for any product, whether or not it is on that list. The free data is good enough to stop you from cold-emailing the wrong country.&lt;/p&gt;

&lt;p&gt;If you want it in one file, the full ranking with an outreach angle for each channel is a $19 Markdown/PDF report. Every source in it is public and linked, so you're paying for the assembly, not secret data.&lt;/p&gt;

</description>
      <category>export</category>
      <category>data</category>
      <category>opendata</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to track RBI, DGFT and GST changes that affect your export business</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:35:06 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/how-to-track-rbi-dgft-and-gst-changes-that-affect-your-export-business-1ma0</link>
      <guid>https://dev.to/nidhibuilds/how-to-track-rbi-dgft-and-gst-changes-that-affect-your-export-business-1ma0</guid>
      <description>&lt;p&gt;If you export from India, the rules that move your margin rarely arrive as news. They come out as a DGFT notification, an RBI circular addressed to banks, a CBIC notification or a Gazette entry, often late in the evening, and on sites that weren't built for skimming. This is the routine I use to keep up, plus a free tool I built to make it lighter.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Know which publisher owns which risk
&lt;/h3&gt;

&lt;p&gt;Start by mapping what you care about to who publishes it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DGFT&lt;/strong&gt; covers export and import policy, licences, export incentives and restricted items. It publishes three kinds of documents, and they mean different things:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Notifications&lt;/strong&gt; amend the Foreign Trade Policy or the ITC(HS) import and export schedules. When an item moves from "free" to "restricted", this is usually where it shows up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public notices&lt;/strong&gt; amend the Handbook of Procedures and its appendices: procedures, forms and documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trade notices&lt;/strong&gt; are clarifications, advisories and process updates. They are often operational, but they are not always minor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RBI&lt;/strong&gt; covers foreign-exchange rules (FEMA), export proceeds, banking and credit. For exporters the key series is the &lt;strong&gt;A.P. (DIR Series)&lt;/strong&gt; circulars. They are addressed to Authorised Dealer banks, which means your bank will apply them to you whether or not you have read them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CBIC / GST&lt;/strong&gt; covers GST rates, refunds, filing changes and portal notices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Gazette of India&lt;/strong&gt; is where notifications are formally published. If someone tells you "the amendment is in force", the Gazette entry is what to check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEBI&lt;/strong&gt; and &lt;strong&gt;PIB&lt;/strong&gt; matter less for day-to-day exporting. PIB is still useful as an early, plain-English heads-up that a ministry has decided something.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Read the instrument, not the headline
&lt;/h3&gt;

&lt;p&gt;Headlines tell you very little. "Amendment in import policy of raw sugar classified under Exim Code 170114..." tells you the item and the direction, but not the effective date, any exceptions or any transition period. Before you change a price, a shipment or a filing, open the PDF and check three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Effective date.&lt;/strong&gt; Is it immediate, from a future date, or retrospective?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope.&lt;/strong&gt; Which HS codes, which ports, which class of exporter?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transition.&lt;/strong&gt; Are shipments already in the pipeline protected, for example those with a letter of credit opened before the date?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you can't answer all three from the document, ask your CA or customs broker. Don't guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Batch it once a day
&lt;/h3&gt;

&lt;p&gt;Checking six sites ad hoc means you either miss things or check too often. A better pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One fixed slot a day&lt;/strong&gt;, for example 9 a.m., to scan everything published since yesterday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter by your exposure.&lt;/strong&gt; Look up your HS chapters and your instruments (incentive schemes, advance authorisation, and so on). Skip everything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log what you acted on.&lt;/strong&gt; Note the date, the notice number, what changed and what you did.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Use RSS where it exists
&lt;/h3&gt;

&lt;p&gt;RBI and SEBI publish RSS feeds, and PIB has a press-release RSS. Any feed reader can pull them into one place. DGFT, CBIC and the Gazette are harder because their pages aren't built for feeds, which is exactly where people fall behind.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The tool I built for this: PolicyPulse
&lt;/h3&gt;

&lt;p&gt;I got tired of doing step 4 by hand, so I built &lt;a href="https://nidhi-bhai.github.io/policy-pulse/" rel="noopener noreferrer"&gt;PolicyPulse&lt;/a&gt;. It's a static site. A daily GitHub Actions job fetches the public pages of PIB, RBI, SEBI, the CBIC GST portal, DGFT and the Gazette, and stores each notice with its date and official link. It then files each notice on sector pages: exports, agri, MSME, banking, GST, pharma and startups. The archive has 654 notices, including a 2023-26 backfill labelled with each document's own date, and there's an RSS feed.&lt;/p&gt;

&lt;p&gt;What I deliberately didn't do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't summarise the law for you.&lt;/strong&gt; Each card shows the official headline and source type, and tells you to open the source. An impact note appears only where the notice itself states one. Lines about amendments, restrictions or duties appear only when those words are in the official text. Any optional AI note is dropped if it contains a number that isn't in the source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sector filing is keyword matching&lt;/strong&gt;, so it will sometimes mis-file a notice. A company with "Exports" in its name can land on the exports page, for example. Treat the sector pages as a first filter, not a verdict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sources can fail.&lt;/strong&gt; The sources page shows the result of the last fetch for each publisher, so you can see when one didn't come through and check that site directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The daily feed, the sector pages and the RSS feed are free. Pro is a convenience rather than extra data: $9 once, via PayPal, for a link to the unlisted weekly Pro brief page, updated every Monday; no renewal, no account. It sorts that week's notices by sector with official links, and it funds the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  A ten-minute daily routine
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open your sector page (or your RSS reader) at a fixed time.&lt;/li&gt;
&lt;li&gt;Open the official PDF for anything that touches your HS codes, your bank or your GST filing.&lt;/li&gt;
&lt;li&gt;Check the effective date, the scope and the transition.&lt;/li&gt;
&lt;li&gt;Log it, and loop in your CA or broker if it changes anything you do.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Disclaimer: This article and PolicyPulse are for education and information only. They are not legal, tax or investment advice, and PolicyPulse is not a government website. Always read the official notice and consult a qualified professional before acting.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>india</category>
      <category>exports</category>
      <category>opendata</category>
      <category>rss</category>
    </item>
    <item>
      <title>How to move a PowerPoint deck into a brand template without retyping it</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:26:55 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/how-to-move-a-powerpoint-deck-into-a-brand-template-without-retyping-it-4278</link>
      <guid>https://dev.to/nidhibuilds/how-to-move-a-powerpoint-deck-into-a-brand-template-without-retyping-it-4278</guid>
      <description>&lt;p&gt;Someone hands you a finished deck. Marketing hands you the new company template. You're told to "just put it in the template". An hour later you're retyping titles into placeholders. Here is why that happens and how to avoid most of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  What a template actually is
&lt;/h3&gt;

&lt;p&gt;A .pptx file is a zip of XML files. Your words, pictures and tables live on the &lt;strong&gt;slides&lt;/strong&gt;. The look lives in three other places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;slide master&lt;/strong&gt;, which holds the logo, background, footer and default text styles;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;layouts&lt;/strong&gt;, named arrangements of placeholders such as Title Slide, Title and Content, Section Header and Picture with Caption;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;theme&lt;/strong&gt;, which holds the font pair and the colour palette.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"Applying a template" means getting your content into the template's &lt;strong&gt;placeholders&lt;/strong&gt;. If the old deck was built from loose text boxes, PowerPoint has nothing to map, which is why "Design → Browse for themes" so often leaves slides looking half-converted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 0: check both files first
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the template's Slide Master view&lt;/strong&gt; (View → Slide Master). You want real title and body placeholders. If the "template" is a full-slide picture, there is nothing to reflow into, so ask for the proper file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the aspect ratio.&lt;/strong&gt; Moving from 4:3 to 16:9 will always need some nudging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List what's hard to move.&lt;/strong&gt; Charts, SmartArt, embedded videos and animations need manual work whatever method you use. Knowing how many you have tells you how long this will really take.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Method 1: Reuse Slides (manual, built in)
&lt;/h3&gt;

&lt;p&gt;Start a new file from the template, then go to Home → New Slide → Reuse Slides and pick the old deck. The slides arrive keeping their source formatting. Select them, choose a layout from the Layout gallery, and click Reset.&lt;/p&gt;

&lt;p&gt;It works, and it's free. But Reset often puts text into the wrong placeholder when the source used text boxes, and on a 30-slide deck you'll be fixing slides one at a time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 2: Copy and paste with "Use Destination Theme"
&lt;/h3&gt;

&lt;p&gt;Paste slides into the template deck and choose &lt;strong&gt;Use Destination Theme&lt;/strong&gt;. It's quick for decks built on standard layouts. For decks made of free-floating shapes it mostly recolours them and leaves the layout alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 3: Rebuild the slides automatically (SlideFit)
&lt;/h3&gt;

&lt;p&gt;I built &lt;a href="https://nidhi-bhai.github.io/slide-fit/" rel="noopener noreferrer"&gt;SlideFit&lt;/a&gt; for the case where Methods 1 and 2 fall over. You give it two files, the deck and the template, and it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;reads each slide&lt;/strong&gt; and pulls out the title, subtitle, bullets (with their indent level), pictures and table cell text;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;classifies the slide&lt;/strong&gt;: a first slide with no bullets becomes a Title Slide, a short lone line becomes a Section Header, a picture with text becomes Picture with Caption, a table goes in the body of Title and Content, and everything else becomes Title and Content;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;writes a new .pptx&lt;/strong&gt; on the template's master, layouts, fonts and colours. Your original file isn't touched.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It runs entirely in the browser tab using JSZip. There's no account and no server, and the deck isn't uploaded. The code is public at &lt;a href="https://github.com/Nidhi-bhai/slide-fit" rel="noopener noreferrer"&gt;github.com/Nidhi-bhai/slide-fit&lt;/a&gt;, and you can confirm it in your browser's network panel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The limits, plainly:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Charts and SmartArt are not rebuilt.&lt;/strong&gt; The slide keeps its title and the preview marks it "Skipped: chart or diagram", so you can paste the chart back in by hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speaker notes and animations are not rebuilt.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline formatting (bold, colour, and links) is not kept&lt;/strong&gt;; the words come across as plain text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom layouts become standard ones.&lt;/strong&gt; A hand-built collage turns into a title, a text block and pictures. That's usually what a brand team wants, but it isn't a pixel copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overflow happens.&lt;/strong&gt; Long bullets or a 4:3 deck on a widescreen master may need nudging after you download.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free plan keeps the first 5 slides, then adds a SlideFit watermark slide, which is enough to check a template. After that there are two one-time PayPal payments, and neither auto-renews: $5 for 24 hours of conversions in that browser or $12 for a 30-day pass covering every deck in that browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  A 15-minute workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Convert 5 slides first to check that the template maps the way you expect.&lt;/li&gt;
&lt;li&gt;Convert the whole deck.&lt;/li&gt;
&lt;li&gt;Go through the slides marked "Skipped" and paste those charts back from the original.&lt;/li&gt;
&lt;li&gt;Check for overflow, then re-add any emphasis (bold words) that matters.&lt;/li&gt;
&lt;li&gt;Re-add speaker notes if you present from them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Whichever method you pick, the rule is the same: get the content into placeholders, and the template does the rest.&lt;/p&gt;

</description>
      <category>powerpoint</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Pull Indian tech and AI-startup job data from employer career pages, in one API call</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Tue, 27 Oct 2026 08:21:43 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/pull-indian-tech-and-ai-startup-job-data-from-employer-career-pages-in-one-api-call-166j</link>
      <guid>https://dev.to/nidhibuilds/pull-indian-tech-and-ai-startup-job-data-from-employer-career-pages-in-one-api-call-166j</guid>
      <description>&lt;p&gt;If you build a job board, run recruiting outreach or track hiring as a market signal, sooner or later you need the same thing: a clean, structured list of open roles. The usual approach is to scrape LinkedIn or Naukri, and that means logins, proxies, CAPTCHAs and reposted listings.&lt;/p&gt;

&lt;p&gt;There is a simpler source. Most product companies host their careers page on an applicant tracking system (ATS) such as &lt;strong&gt;Greenhouse, Lever, Ashby or SmartRecruiters&lt;/strong&gt;. Those vendors publish public JSON job-board feeds, so that companies can embed their openings on any site. No login is required.&lt;/p&gt;

&lt;p&gt;I built two Apify actors on top of those feeds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;India Tech Jobs Scraper&lt;/strong&gt;: &lt;a href="https://apify.com/prospect_antechamber/india-tech-jobs-scraper" rel="noopener noreferrer"&gt;https://apify.com/prospect_antechamber/india-tech-jobs-scraper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI &amp;amp; Startup Jobs Scraper&lt;/strong&gt;: &lt;a href="https://apify.com/prospect_antechamber/ai-startup-jobs-scraper" rel="noopener noreferrer"&gt;https://apify.com/prospect_antechamber/ai-startup-jobs-scraper&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post shows how to call them, what you get back, what it costs and where they fall short.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each actor covers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;India Tech Jobs Scraper&lt;/strong&gt; has a built-in directory of 57 employers that hire in India. The Store page lists names such as Stripe, Databricks, Okta, MongoDB, Zscaler, Swiggy, CRED, Meesho, Freshworks, Groww, Sarvam AI and InMobi. Every job is tagged &lt;code&gt;isIndia&lt;/code&gt; and &lt;code&gt;indiaCity&lt;/code&gt;, and the actor normalises spellings like Bangalore/Bengaluru and Gurgaon/Gurugram. In my test run on 27 Oct 2026 it returned 1,431 live India jobs from 61 company boards in 51 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI &amp;amp; Startup Jobs Scraper&lt;/strong&gt; has a directory of 144 companies, each tagged by sector: &lt;code&gt;ai&lt;/code&gt;, &lt;code&gt;fintech&lt;/code&gt;, &lt;code&gt;devtools&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;crypto&lt;/code&gt;, &lt;code&gt;health&lt;/code&gt;, &lt;code&gt;autonomy_space_defense&lt;/code&gt; and &lt;code&gt;consumer_gaming&lt;/code&gt;. It includes OpenAI, Anthropic, Perplexity, ElevenLabs, Cursor (Anysphere), Stripe, Databricks and SpaceX. A full run on 27 Oct 2026 returned 23,192 jobs from 144 boards (Greenhouse 16,881, Ashby 5,506, Lever 805), and 4,303 of them were remote.&lt;/p&gt;

&lt;p&gt;Both actors also accept &lt;strong&gt;any other company&lt;/strong&gt; that runs on one of the four supported ATSs. You can pass a careers URL (&lt;code&gt;https://jobs.lever.co/meesho&lt;/code&gt;), an &lt;code&gt;ats:slug&lt;/code&gt; pair (&lt;code&gt;greenhouse:stripe&lt;/code&gt;) or a bare slug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 1: data and ML roles in Bengaluru, posted this week
&lt;/h2&gt;

&lt;p&gt;This input uses fields from the India actor's input schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"useIndiaDirectory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://jobs.lever.co/meesho"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"greenhouse:stripe"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"indiaOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeGlobalRemote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bengaluru"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bangalore"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"machine learning"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"excludeKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"intern"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"remoteOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeDescription"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is what the fields do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;keywords&lt;/code&gt; and &lt;code&gt;excludeKeywords&lt;/code&gt; match against the title, department and team.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;postedWithinDays&lt;/code&gt; uses the date each board publishes or updates.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxItems&lt;/code&gt; caps the run. You pay only for jobs returned, so this is also your cost ceiling.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;indiaOnly: false&lt;/code&gt; to get every location from the boards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example 2: AI-lab engineering roles in San Francisco or remote
&lt;/h2&gt;

&lt;p&gt;This input uses fields from the AI &amp;amp; Startup actor's schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"useDirectory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sectors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ai"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"San Francisco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Remote"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"excludeKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"intern"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"remoteOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedWithinDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeDescription"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you leave &lt;code&gt;sectors&lt;/code&gt; empty, the actor scans all 144 directory companies. &lt;code&gt;locations&lt;/code&gt; keeps any job whose location string contains one of your values, such as &lt;code&gt;"London"&lt;/code&gt;, &lt;code&gt;"United States"&lt;/code&gt; or &lt;code&gt;"India"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling it from Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;apify-client   &lt;span class="c"&gt;# snippet follows the Python example on the actor's Store page&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;useDirectory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sectors&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;locations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;San Francisco&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Remote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engineer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postedWithinDays&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prospect_antechamber/ai-startup-jobs-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_dataset_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jobUrl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To call the India actor instead, swap in &lt;code&gt;prospect_antechamber/india-tech-jobs-scraper&lt;/code&gt; and its input. The same calls work from JavaScript (&lt;code&gt;apify-client&lt;/code&gt; on npm), from the Apify CLI (&lt;code&gt;apify call ... --output-dataset&lt;/code&gt;), or as a tool for an AI agent through the Apify MCP server (&lt;code&gt;https://mcp.apify.com/?tools=prospect_antechamber/ai-startup-jobs-scraper&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What one row looks like
&lt;/h2&gt;

&lt;p&gt;Both actors return the same flat schema, one row per job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ashby"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"atlan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Atlan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"20fe5046-b287-40f6-990f-842ad75526e5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Staff Software Engineer - Infrastructure (AI Native)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"India"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allLocations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"India"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"department"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Engineering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"team"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Engineering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employmentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FullTime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workplaceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-23T14:44:45.243000+00:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"updatedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://jobs.ashbyhq.com/atlan/20fe5046-b287-40f6-990f-842ad75526e5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"applyUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://jobs.ashbyhq.com/atlan/20fe5046-b287-40f6-990f-842ad75526e5/application"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isIndia"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"indiaCity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isRemote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scrapedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-27T07:26:28.940092+00:00"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI &amp;amp; Startup actor adds a &lt;code&gt;sectors&lt;/code&gt; array to each row. You can export results as JSON, CSV or Excel from the Apify console, or send them on to Google Sheets, Zapier, Make or a webhook.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pattern that works: a daily "new roles" feed
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Schedule the actor once a day in Apify with &lt;code&gt;postedWithinDays: 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Upsert rows into your database, using &lt;code&gt;ats + companySlug + jobId&lt;/code&gt; as the key.&lt;/li&gt;
&lt;li&gt;Mark rows that disappear from a later run as closed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That gives you a fresh feed for a job board or newsletter. It also gives you a time series of hiring by company, team and city, which is useful for hiring-intent signals or for analyst work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;Both actors use Apify's pay-per-event model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$1.50 per 1,000 jobs returned ($0.0015 per job)&lt;/strong&gt;, plus Apify platform usage.&lt;/li&gt;
&lt;li&gt;Filters are applied before charging, so jobs you filter out cost nothing.&lt;/li&gt;
&lt;li&gt;For example, 500 jobs cost $0.75 plus usage. A full India directory scan of about 1,400 jobs is roughly $2.15 plus usage.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;maxItems&lt;/code&gt; or an Apify spending limit to cap the cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Four ATSs only.&lt;/strong&gt; The actors cover Greenhouse, Lever, Ashby and SmartRecruiters. They do not cover LinkedIn, Naukri, Indeed, or companies that run their own careers system or Workday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The directories are curated.&lt;/strong&gt; They hold 57 and 144 companies, not "every company in India" or "every startup". Anything else has to go in &lt;code&gt;companies&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salary is often null.&lt;/strong&gt; It appears only when the employer publishes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The data is only as clean as the board.&lt;/strong&gt; Departments, teams and employment types are whatever each company enters. Some boards leave them empty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location matching is string-based.&lt;/strong&gt; A job listed only as "Remote" with no country is dropped when &lt;code&gt;indiaOnly&lt;/code&gt; is on, unless you set &lt;code&gt;includeGlobalRemote&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Descriptions slow runs down.&lt;/strong&gt; &lt;code&gt;includeDescription&lt;/code&gt; makes SmartRecruiters boards slower in particular.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;These are new actors.&lt;/strong&gt; They have very few users so far and no Store ratings yet, so test on a small &lt;code&gt;maxItems&lt;/code&gt; first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Is it allowed?
&lt;/h2&gt;

&lt;p&gt;The actors read only the public job-board endpoints that the ATS vendors provide for publishing jobs. They use no logins or cookies, and they don't collect candidate data. You are still responsible for how you use the data in your own jurisdiction, and for each source's terms.&lt;/p&gt;

&lt;p&gt;If a company you need is missing from a directory, add its careers URL to &lt;code&gt;companies&lt;/code&gt;, or tell me and I'll consider adding it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built and maintain both actors, and I earn the per-job fee above.&lt;/em&gt; (Nidhi, &lt;a href="https://x.com/RealNidhibhai" rel="noopener noreferrer"&gt;@RealNidhibhai&lt;/a&gt;, GitHub &lt;a href="https://github.com/Nidhi-bhai" rel="noopener noreferrer"&gt;Nidhi-bhai&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>apify</category>
      <category>webscraping</category>
      <category>python</category>
      <category>jobs</category>
    </item>
    <item>
      <title>What an Indian agri export price actually is, and how to read one</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Tue, 27 Oct 2026 08:01:23 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/what-an-indian-agri-export-price-actually-is-and-how-to-read-one-41j6</link>
      <guid>https://dev.to/nidhibuilds/what-an-indian-agri-export-price-actually-is-and-how-to-read-one-41j6</guid>
      <description>&lt;p&gt;&lt;em&gt;Education only. This is not trading or investment advice, and nothing here is an offer to sell.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you import spices, herbs, millets or oils from India, the first question is usually "what does this cost right now?" Public answers do exist, but they are spread across UN Comtrade, the Government of India's Agmarknet mandi dashboards, and seller listings. Each of those sources measures something different.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;India Agri Export Price Index&lt;/strong&gt; (&lt;a href="https://nidhi-bhai.github.io/india-agri-export-prices/" rel="noopener noreferrer"&gt;https://nidhi-bhai.github.io/india-agri-export-prices/&lt;/a&gt;) is a free page I publish that brings those sources together each week for 18 products, priced in USD/kg. This article explains what the numbers mean and how an importer, trader or analyst can use them without over-reading them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 18 products
&lt;/h2&gt;

&lt;p&gt;The index covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Herbs and leaf powders:&lt;/strong&gt; moringa leaf powder, ashwagandha root powder, neem leaf powder, curry leaf powder, indigo leaf powder and wheatgrass powder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spices:&lt;/strong&gt; turmeric (finger and powder).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sugar:&lt;/strong&gt; jaggery powder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Millets:&lt;/strong&gt; ragi, bajra, foxtail, the small millets (kodo, little, proso, barnyard and browntop), and khapli (emmer) wheat and atta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oils:&lt;/strong&gt; cold-pressed groundnut oil, cold-pressed coconut oil, karanja (pongamia) oil and moringa seed oil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roots:&lt;/strong&gt; dried vetiver (khus) root.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For wheatgrass powder, the page says plainly that there is "no reliable public price yet". It leaves the cell empty rather than guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three kinds of number, and why they differ
&lt;/h2&gt;

&lt;p&gt;Every figure on the page is labelled with its type, source and date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Official export unit values (UN Comtrade).&lt;/strong&gt; India reports its exports each month by HS customs code. Dividing the FOB value in USD by the net weight in kg gives a &lt;em&gt;unit value&lt;/em&gt;: the average price of everything shipped under that code in that month.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These figures come with a lag of about &lt;strong&gt;2–4 months&lt;/strong&gt;. The 27 Oct 2026 snapshot shows July 2026 as the latest month.&lt;/li&gt;
&lt;li&gt;Many products share one code. HS 121190, for example, covers moringa, ashwagandha, neem, curry leaf, vetiver and hundreds of other herbs. The index marks such series as &lt;strong&gt;pooled&lt;/strong&gt;. A pooled number tells you about the market, not the price of the exact product you want.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Mandi prices (Agmarknet).&lt;/strong&gt; These are daily all-India average wholesale prices from regulated markets, published in INR per quintal (100 kg). The index converts them to USD/kg at the ECB reference rate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They are &lt;strong&gt;raw, farm-gate commodity prices&lt;/strong&gt;, recorded before cleaning, grading, grinding, packing, testing and port costs. So they sit well below export prices.&lt;/li&gt;
&lt;li&gt;The page also shows each day's &lt;strong&gt;arrivals&lt;/strong&gt;. Low arrivals mean a thin, noisy price. In this snapshot, ragi had only 0.1 t of arrivals on the reported day and coconut oil 0.25 t.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Estimates.&lt;/strong&gt; For powders and other niche items there is no official price series. For these the index compiles ranges from public seller offers, rate cards and trade reports, and links each source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These are &lt;strong&gt;asking prices, not transaction prices&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Some estimates rest on very little evidence, and the page says so. The khapli figure (2.58 USD/kg) comes from &lt;em&gt;one&lt;/em&gt; emmer-flour shipment, which the data file calls "a single data point, not a market price". Several millet ranges are cited from July 2026 and are marked "older".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A worked example: turmeric
&lt;/h2&gt;

&lt;p&gt;Turmeric (HS 091030) is one of the cleaner series because it has its own code. From the 27 Oct 2026 snapshot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Export unit value, Jul 2026:&lt;/strong&gt; 1.853 USD/kg FOB. India shipped 13,489 t worth USD 24.99 million that month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12-month range of monthly unit values (Aug 2025 – Jul 2026):&lt;/strong&gt; 1.70–2.29 USD/kg. The high was December 2025.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mandi price, 25 Oct 2026:&lt;/strong&gt; INR 19,500 per quintal, about 2.05 USD/kg. Arrivals that day were only 2.0 t, so treat that figure as thin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destinations in 2025:&lt;/strong&gt; unit values ranged from about 1.30 USD/kg (Bangladesh) to 3.56 USD/kg (USA). That spread most likely reflects differences in grade, form and buyer requirements, not one "India price".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The takeaway is that a single headline number hides a wide range. The destination table is often more useful than the average, because it shows what buyers in markets like yours have paid on average.&lt;/p&gt;

&lt;h2&gt;
  
  
  How importers can use it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sanity-check a quote.&lt;/strong&gt; If an offer sits far outside both the Comtrade range and the public-offer range, ask why. The answer may be grade, certification, packing or freight terms. Note that the index covers conventional grade only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch direction, not just level.&lt;/strong&gt; Comtrade's monthly series shows whether average export unit values are rising or falling, even with the lag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate raw material from finished product.&lt;/strong&gt; The gap between the mandi price and the export price is roughly the processing, compliance and logistics cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download and build your own view.&lt;/strong&gt; Everything is available as &lt;code&gt;latest.csv&lt;/code&gt;, &lt;code&gt;latest.json&lt;/code&gt; and an append-only &lt;code&gt;history.csv&lt;/code&gt;, under CC BY 4.0. The history file started with the 27 Oct 2026 snapshot, so it holds one week of data for now and grows by one snapshot a week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Caveats worth repeating
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pooled HS codes are context, not product prices.&lt;/strong&gt; On the home page, neem leaf powder (4.056) and indigo leaf powder (3.803) show pooled-code values. Karanja oil and moringa seed oil both show 6.227 USD/kg because they share HS 151590.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comtrade lags by months.&lt;/strong&gt; Mandi data is daily but thin for niche items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estimates are seller asks&lt;/strong&gt; compiled from a handful of public sources, and some of them are old.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cold-pressed coconut oil estimate (2.70 USD/kg)&lt;/strong&gt; comes from a general coconut-oil FOB Cochin index for August 2026. It is not specific to cold-pressed oil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USD/INR conversions&lt;/strong&gt; use the ECB reference rate for one day.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who publishes it
&lt;/h2&gt;

&lt;p&gt;The index is published by Nidhi Farms, a sourcing firm (a trader, not a grower) in Andhra Pradesh, India, supplying conventional grade only. To be transparent: Nidhi Farms also takes quote requests, and the page links to them. The reference data itself is free and open, and corrections are welcome at &lt;a href="mailto:nidhi69n@gmail.com"&gt;nidhi69n@gmail.com&lt;/a&gt;. The methodology is at &lt;a href="https://nidhi-bhai.github.io/india-agri-export-prices/methodology.html" rel="noopener noreferrer"&gt;https://nidhi-bhai.github.io/india-agri-export-prices/methodology.html&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>datascience</category>
      <category>agriculture</category>
      <category>india</category>
    </item>
    <item>
      <title>Building a $0, no-backend portfolio backtester and the data-licensing rabbit hole</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Sun, 18 Oct 2026 03:18:39 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/building-a-0-no-backend-portfolio-backtester-and-the-data-licensing-rabbit-hole-2oga</link>
      <guid>https://dev.to/nidhibuilds/building-a-0-no-backend-portfolio-backtester-and-the-data-licensing-rabbit-hole-2oga</guid>
      <description>&lt;p&gt;I built &lt;a href="https://nidhi-bhai.github.io/backtestcard/" rel="noopener noreferrer"&gt;BacktestCard&lt;/a&gt;, a static-site backtester for Indian investors who measure in USD. It has no framework, no backend and no dependencies. Three things were more interesting than I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Data licensing decides your architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Yahoo, Stooq and NSE all forbid redistribution.&lt;/li&gt;
&lt;li&gt;FRED was the surprise. Its ToS bars storing or caching FRED content, even for public-domain series.&lt;/li&gt;
&lt;li&gt;So the build script fetches from the publishers themselves:

&lt;ul&gt;
&lt;li&gt;Federal Reserve DDP for H.10 and H.15&lt;/li&gt;
&lt;li&gt;BLS flat files&lt;/li&gt;
&lt;li&gt;the OECD SDMX API&lt;/li&gt;
&lt;li&gt;the World Bank Pink Sheet (CC BY 4.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The result is a 108 KB JSON file, refreshed monthly by a GitHub Action.&lt;/li&gt;
&lt;li&gt;Licensed indices such as NIFTY come only through a user CSV upload. It's parsed with &lt;code&gt;FileReader&lt;/code&gt; and never sent anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Test your maths with a second implementation
&lt;/h2&gt;

&lt;p&gt;The engine is about 200 lines of plain JS. The tests include a separate pandas implementation that must match every statistic to 1e-9. On day one it disagreed on bond returns.&lt;/p&gt;

&lt;p&gt;Bond returns are modelled from yields. Each month you buy a 10-year par bond and reprice it at the new yield. I had added coupon/12 &lt;em&gt;on top of&lt;/em&gt; a dirty price that already included accrued interest, which added 1.4%/yr of phantom return to a 60/40 mix. The fix uses a closed form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// remaining flows at j/2 - 1/12 years =&amp;gt; dirty = (1+y/2)^(1/6) * P_20(y)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;price20&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Share state belongs in the URL
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The whole portfolio state is in the hash, e.g. &lt;code&gt;#p=us_eq:60,in_eq:40&amp;amp;s=2000-01&amp;amp;c=USD&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It's whitelisted on decode, so &lt;code&gt;__proto__:5&lt;/code&gt; gets dropped.&lt;/li&gt;
&lt;li&gt;The share card is a 1200×630 canvas exported with &lt;code&gt;toDataURL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;?embed=1&lt;/code&gt; gives a compact iframe with a badge, which is the growth loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code (MIT): &lt;a href="https://github.com/Nidhi-bhai/backtestcard" rel="noopener noreferrer"&gt;https://github.com/Nidhi-bhai/backtestcard&lt;/a&gt;. It's educational only, not investment advice.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>finance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CGPA to GPA Conversion: How to Convert a 10-Point CGPA to a 4.0 GPA (and When Not To)</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:25:51 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/cgpa-to-gpa-conversion-how-to-convert-a-10-point-cgpa-to-a-40-gpa-and-when-not-to-a9c</link>
      <guid>https://dev.to/nidhibuilds/cgpa-to-gpa-conversion-how-to-convert-a-10-point-cgpa-to-a-40-gpa-and-when-not-to-a9c</guid>
      <description>&lt;p&gt;If you studied in India or anywhere else that uses a 10-point CGPA, you've probably been asked for your "GPA on a 4.0 scale" when applying for a master's abroad, a job, or a scholarship. The internet is full of one-line formulas that give contradictory answers. This guide explains the common methods, where each one comes from, and which number you should actually put on an application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; there is no single universal formula. If an application asks for a converted GPA, check whether the institution wants a credential evaluation (WES, ECE, or their own). If they ask you to self-report, many tell you exactly how they want the number. Use what they specify, and include your original CGPA and scale wherever possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why there's no single formula
&lt;/h2&gt;

&lt;p&gt;A 10-point CGPA and a US 4.0 GPA aren't just the same thing at a different scale. They're different grading systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grading in many Indian universities is stricter at the top. An 8.5 CGPA can be a very strong result, while a US 3.4 (85% of 4.0) is decent but not outstanding.&lt;/li&gt;
&lt;li&gt;Different universities map marks to grade points differently.&lt;/li&gt;
&lt;li&gt;US GPAs are built from letter grades per course, so a proper conversion works course by course, not from the final number.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why a straight linear formula and a professional evaluation can give quite different answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: Simple linear scaling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GPA = (CGPA ÷ 10) × 4&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Example: CGPA 8.0 → 3.2. CGPA 9.0 → 3.6.&lt;/p&gt;

&lt;p&gt;This is easy and widely quoted, but it often &lt;em&gt;undervalues&lt;/em&gt; strong Indian CGPAs because it ignores how differently the grades are distributed. Treat it as a rough first estimate only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: Via percentage
&lt;/h2&gt;

&lt;p&gt;Some people convert CGPA to a percentage first and then map the percentage to a letter grade. For CBSE, the official rule of thumb is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Percentage ≈ CGPA × 9.5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So a CGPA of 8.0 ≈ 76%. &lt;strong&gt;Important:&lt;/strong&gt; this ×9.5 rule comes from CBSE and was meant for CBSE school results. Many universities publish their own formula instead (for example ×10, or (CGPA − 0.5) × 10, or (CGPA − 0.75) × 10). Your university's official conversion, usually printed on the transcript or in the academic regulations, always comes first.&lt;/p&gt;

&lt;p&gt;After that, people map the percentage to a US grade (for example 60%+ treated as roughly an A in some evaluators' tables for Indian first-class results). These tables vary by evaluator, which is why we haven't printed one as if it were official.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 3: Course-by-course (what evaluators do)
&lt;/h2&gt;

&lt;p&gt;Credential evaluators like WES generally look at each course grade on your transcript, convert it to a US grade equivalent using their own tables, and then calculate a credit-weighted GPA. This is the most accurate method, and it's often the one universities trust. It's also why the evaluator's number may not match any formula you use at home. WES publishes a free "iGPA calculator" preview on its website that you can try with your own grades.&lt;/p&gt;

&lt;p&gt;If an application requires a WES or ECE evaluation, use the GPA from that report. Don't try to calculate your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which number should you report?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;If the application has a field for your original scale,&lt;/strong&gt; enter your CGPA out of 10. Admissions teams that see many Indian applicants are used to reading these directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If they give a formula or table,&lt;/strong&gt; use exactly that one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If they require a credential evaluation,&lt;/strong&gt; use the evaluator's GPA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If they ask you to self-convert and give no method,&lt;/strong&gt; use the linear estimate, label it as approximate, and give the original as well: "8.4/10 CGPA (≈3.36/4.0 by linear scaling)." Being transparent never hurts you. A number that looks inflated can.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Never round up or pick the most flattering formula without saying so. Your transcript will be checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculating your CGPA correctly first
&lt;/h2&gt;

&lt;p&gt;Before you convert anything, make sure the CGPA itself is right. CGPA is the &lt;strong&gt;credit-weighted&lt;/strong&gt; average of your semester SGPAs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CGPA = Σ(SGPA × semester credits) ÷ Σ(semester credits)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A plain average of SGPAs is only correct if every semester carried the same credits, and that's often not the case.&lt;/p&gt;

&lt;p&gt;Worked example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Semester&lt;/th&gt;
&lt;th&gt;SGPA&lt;/th&gt;
&lt;th&gt;Credits&lt;/th&gt;
&lt;th&gt;SGPA × Credits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;7.8&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;156&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;180.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;8.6&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;206.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8.9&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;160.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;703&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CGPA = 703 ÷ 84 = &lt;strong&gt;8.37&lt;/strong&gt;. A simple average of the four SGPAs would give 8.375, which is close here, but the gap gets bigger when credit loads differ a lot.&lt;/p&gt;

&lt;p&gt;The arithmetic itself is quick: multiply each semester's SGPA by its credits, add them up, and divide by total credits (any spreadsheet or AI chat can do it in seconds). If you want somewhere to keep your semester grades organised over time, the free &lt;a href="https://nidhiverse1.gumroad.com/l/study-os-2027-lite" rel="noopener noreferrer"&gt;Study OS 2027 Lite&lt;/a&gt; planner template includes a grade tracker alongside a weekly planner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick reference: linear 10-point to 4.0 estimates
&lt;/h2&gt;

&lt;p&gt;These are linear estimates only, not official equivalents:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CGPA (10)&lt;/th&gt;
&lt;th&gt;Linear GPA (4.0)&lt;/th&gt;
&lt;th&gt;CBSE ×9.5 %&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;td&gt;2.40&lt;/td&gt;
&lt;td&gt;57.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;2.60&lt;/td&gt;
&lt;td&gt;61.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;2.80&lt;/td&gt;
&lt;td&gt;66.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;3.00&lt;/td&gt;
&lt;td&gt;71.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;3.20&lt;/td&gt;
&lt;td&gt;76.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.5&lt;/td&gt;
&lt;td&gt;3.40&lt;/td&gt;
&lt;td&gt;80.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.0&lt;/td&gt;
&lt;td&gt;3.60&lt;/td&gt;
&lt;td&gt;85.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.5&lt;/td&gt;
&lt;td&gt;3.80&lt;/td&gt;
&lt;td&gt;90.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;4.00&lt;/td&gt;
&lt;td&gt;95.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Expect a course-by-course evaluation to come out &lt;em&gt;higher&lt;/em&gt; than the linear column for many strong Indian transcripts, but that isn't guaranteed. The only way to know is to run the evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using a plain average of SGPAs&lt;/strong&gt; when credit loads differ between semesters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using the ×9.5 rule for a university result&lt;/strong&gt; when the university publishes its own formula.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reporting only a converted number&lt;/strong&gt; without the original CGPA and scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Picking whichever online calculator gives the highest number.&lt;/strong&gt; Evaluators will recalculate it anyway, and a big gap looks bad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leaving it to the last week.&lt;/strong&gt; Credential evaluations can take several weeks, so request them early.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is 8 CGPA good for a US master's?&lt;/strong&gt;&lt;br&gt;
It's generally considered solid, but admissions decisions depend on the program, your university's reputation, test scores, and your profile. A GPA number alone doesn't decide it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I just multiply my CGPA by 0.4?&lt;/strong&gt;&lt;br&gt;
That's the same as the linear method. Fine as a rough estimate, but label it as one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does WES accept my self-calculated GPA?&lt;/strong&gt;&lt;br&gt;
No. WES calculates its own from your official transcripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My university uses a 7-point or 5-point scale. Does this apply?&lt;/strong&gt;&lt;br&gt;
The same logic holds: GPA = (your grade ÷ your scale maximum) × 4 for a linear estimate. The same caveats apply too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep tracking while you're still studying
&lt;/h2&gt;

&lt;p&gt;If you're still in university, the easiest way to avoid conversion stress later is to keep track of every semester's SGPA and credits as you go. The free &lt;strong&gt;Study OS 2027 Lite&lt;/strong&gt; spreadsheet includes a grade tracker for this, plus a semester planner. &lt;a href="https://nidhiverse1.gumroad.com/l/study-os-2027-lite" rel="noopener noreferrer"&gt;Download it free&lt;/a&gt;. Any spreadsheet works, though. What matters is recording credits along with grades.&lt;/p&gt;

&lt;p&gt;To sum up: get your CGPA right, use whatever conversion the institution asks for, always show the original, and never present a formula estimate as if it were official.&lt;/p&gt;

</description>
      <category>students</category>
      <category>education</category>
      <category>career</category>
      <category>studying</category>
    </item>
    <item>
      <title>How to Plan Your Spring 2027 Semester (A Week-by-Week System That Actually Survives February)</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:25:20 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/how-to-plan-your-spring-2027-semester-a-week-by-week-system-that-actually-survives-february-3jg3</link>
      <guid>https://dev.to/nidhibuilds/how-to-plan-your-spring-2027-semester-a-week-by-week-system-that-actually-survives-february-3jg3</guid>
      <description>&lt;p&gt;Most semester plans die in week three. The real reason usually isn't laziness. The plan was built for an imaginary student with unlimited energy and no surprises. This guide walks you through a spring 2027 plan built the other way around: you start with the hard dates you already know, you protect a small amount of study time every week, and you leave room for the weeks that go badly.&lt;/p&gt;

&lt;p&gt;You'll need a syllabus for every course, a calendar, and about 90 minutes. If you'd rather work from a ready-made sheet, there's a free template linked at the end. Everything below also works on paper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Collect every hard date in one place (30 minutes)
&lt;/h2&gt;

&lt;p&gt;Open each syllabus and copy out every date that carries marks or can't be moved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exams and midterms&lt;/li&gt;
&lt;li&gt;Assignment and project deadlines&lt;/li&gt;
&lt;li&gt;Quizzes, labs and presentations&lt;/li&gt;
&lt;li&gt;Add/drop and withdrawal deadlines (people forget these, and they matter most when a course is going badly)&lt;/li&gt;
&lt;li&gt;Holidays and spring break&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put all of them in &lt;strong&gt;one&lt;/strong&gt; list, sorted by date. Don't keep a separate list per course. The point is to see the collisions. If three deadlines land in the week of March 8, you want to know that in January, while you can still start one of them early.&lt;/p&gt;

&lt;p&gt;For each item, write down its &lt;strong&gt;weight&lt;/strong&gt; (the share of the final grade). A 5% quiz and a 30% project should never get the same amount of worry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Mark your crunch weeks
&lt;/h2&gt;

&lt;p&gt;Count the weighted deadlines per week. Any week where the deadlines add up to more than about 20% of a course grade, or where two or more courses have major deliverables, is a crunch week. Most spring semesters have two or three: around midterms, just before spring break, and the last two weeks.&lt;/p&gt;

&lt;p&gt;For every crunch week, pick one deliverable and move its &lt;em&gt;personal&lt;/em&gt; deadline one week earlier. You aren't changing the real due date. You're just making sure the crunch week holds two big things instead of four.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Build a minimum weekly study block
&lt;/h2&gt;

&lt;p&gt;Here's where most plans go wrong. Students schedule 6 hours a night, miss it by day four, and then drop the plan entirely. Instead, decide on a &lt;strong&gt;minimum&lt;/strong&gt; you could hit even in a bad week. That's usually 45–90 minutes per course per week of active review, plus the time assignments take.&lt;/p&gt;

&lt;p&gt;A workable default for a 5-course load:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Block 1 (45 min)&lt;/th&gt;
&lt;th&gt;Block 2 (45 min)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mon&lt;/td&gt;
&lt;td&gt;Course A review&lt;/td&gt;
&lt;td&gt;Course B problem set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tue&lt;/td&gt;
&lt;td&gt;Course C review&lt;/td&gt;
&lt;td&gt;Course D reading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wed&lt;/td&gt;
&lt;td&gt;Course E review&lt;/td&gt;
&lt;td&gt;Catch-up / flex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thu&lt;/td&gt;
&lt;td&gt;Course A practice questions&lt;/td&gt;
&lt;td&gt;Course B review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fri&lt;/td&gt;
&lt;td&gt;Light: flashcards only&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sat&lt;/td&gt;
&lt;td&gt;Assignment work&lt;/td&gt;
&lt;td&gt;Assignment work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sun&lt;/td&gt;
&lt;td&gt;Weekly review (20 min)&lt;/td&gt;
&lt;td&gt;Course C/D practice&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "flex" block matters. It's what keeps one bad day from wrecking the whole week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Use spaced review instead of rereading
&lt;/h2&gt;

&lt;p&gt;Rereading notes feels productive but does surprisingly little for exam performance. Research on learning (Dunlosky et al., 2013, &lt;em&gt;Psychological Science in the Public Interest&lt;/em&gt;) rates &lt;strong&gt;practice testing&lt;/strong&gt; and &lt;strong&gt;distributed (spaced) practice&lt;/strong&gt; as the two most useful techniques of the ten it reviewed. Rereading and highlighting score low.&lt;/p&gt;

&lt;p&gt;In practice: after each lecture, write 3–5 questions on the material. Answer them again 1 day later, 3 days later, 7 days later and about 2–3 weeks later. Each round takes minutes. There's a full schedule for this in our &lt;a href="https://dev.to/nidhibuilds/the-spaced-repetition-study-schedule-a-practical-day-by-day-plan-for-students-2502"&gt;spaced repetition study schedule guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Track your grade as you go, not at the end
&lt;/h2&gt;

&lt;p&gt;Most students only find out where they stand when final grades come out. Don't do that. Every time a mark comes back, log it with its weight. That lets you answer the most useful question of the semester: &lt;em&gt;what do I need on the final to get the grade I want?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can work that out in seconds: required final = (target − current × (1 − final weight)) ÷ final weight. If your current grade is 82% and the final is worth 25%, you need 114% to reach a 90 overall. That target is impossible, and it's far better to learn that in March than in May. Then you can put effort where it can still change the outcome.&lt;/p&gt;

&lt;p&gt;To keep your grades, deadlines and weekly plan in one place all semester, you can use the free &lt;a href="https://nidhiverse1.gumroad.com/l/study-os-2027-lite" rel="noopener noreferrer"&gt;Study OS 2027 Lite&lt;/a&gt; planner template (disclosure: I made it).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The 20-minute Sunday review
&lt;/h2&gt;

&lt;p&gt;Once a week, answer four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What's due in the next 14 days?&lt;/li&gt;
&lt;li&gt;Which course am I furthest behind in?&lt;/li&gt;
&lt;li&gt;Did I hit my minimum study blocks? If not, was the plan unrealistic, or did the week just go badly?&lt;/li&gt;
&lt;li&gt;What's the one thing that would make next week easier?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Change the plan based on the answers. If you keep missing a block, shrink it. A 30-minute block you actually do beats a 2-hour block you skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Plan for bad weeks on purpose
&lt;/h2&gt;

&lt;p&gt;You'll get sick, or a family thing will come up, or you'll just lose a week to burnout. Decide ahead of time what "survival mode" looks like: deadlines only, plus 15 minutes of flashcards a day. When it happens, switch to survival mode without guilt, then come back to the normal plan the next week. Students who plan for bad weeks recover from them. Students who don't usually abandon the whole system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A sample spring 2027 timeline
&lt;/h2&gt;

&lt;p&gt;Dates vary by school, so treat this as a shape, not a calendar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;January, weeks 1–2:&lt;/strong&gt; Collect dates, mark crunch weeks, set your minimum blocks. Low workload, so this is the cheapest time to get ahead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 3–6:&lt;/strong&gt; First quizzes and labs. Start spaced review from week 1's material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 7–8 (midterms):&lt;/strong&gt; First crunch. Your spaced review means you're revising, not learning from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring break:&lt;/strong&gt; Rest for most of it. One or two short sessions to get ahead on the biggest late-semester project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 10–13:&lt;/strong&gt; Project-heavy. Run the required-final math to see which courses still have room to move.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 14–16 (finals):&lt;/strong&gt; Turn your question bank into practice exams. Put the most time into the courses where the final carries the most weight &lt;em&gt;and&lt;/em&gt; your target is still reachable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Planning by course instead of by date.&lt;/strong&gt; Collisions stay hidden until it's too late.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating every assignment equally.&lt;/strong&gt; Look at the weight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building a perfect-week plan.&lt;/strong&gt; It breaks on the first imperfect week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only checking your grade at the end.&lt;/strong&gt; You lose every chance to change it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too many tools.&lt;/strong&gt; One calendar and one tracker is enough. Five apps means none of them gets updated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A free template if you want one
&lt;/h2&gt;

&lt;p&gt;I made &lt;strong&gt;Study OS 2027 Lite&lt;/strong&gt;, a free Google Sheets/Excel planner with a deadline list sorted by date, a GPA tracker, and a study schedule laid out like the one above. &lt;a href="https://nidhiverse1.gumroad.com/l/study-os-2027-lite" rel="noopener noreferrer"&gt;Download Study OS 2027 Lite (free)&lt;/a&gt;. There's also a &lt;a href="https://nidhiverse1.gumroad.com/l/study-os-2027" rel="noopener noreferrer"&gt;paid full version ($12)&lt;/a&gt; with extra features, but you don't need it to use this method. A paper notebook works too.&lt;/p&gt;

&lt;p&gt;The system matters more than the tool. Put every date in one list, keep your weekly minimum small, review on a schedule, track your grade as it comes in, and plan for the bad weeks. Do those five things and spring 2027 will feel a lot calmer than last semester.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>students</category>
      <category>planning</category>
      <category>studying</category>
    </item>
    <item>
      <title>The Spaced Repetition Study Schedule: A Practical Day-by-Day Plan for Students</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:25:12 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/the-spaced-repetition-study-schedule-a-practical-day-by-day-plan-for-students-2502</link>
      <guid>https://dev.to/nidhibuilds/the-spaced-repetition-study-schedule-a-practical-day-by-day-plan-for-students-2502</guid>
      <description>&lt;p&gt;Spaced repetition has a lot of evidence behind it, and most students still never use it, mostly because nobody shows them what it looks like on an ordinary Tuesday. This guide gives you a concrete schedule, explains why it works without overselling it, and shows how to fit it around a normal course load.&lt;/p&gt;

&lt;h2&gt;
  
  
  What spaced repetition is
&lt;/h2&gt;

&lt;p&gt;Spaced repetition means reviewing material at gradually longer intervals instead of cramming it all at once. The basic finding goes back to Hermann Ebbinghaus in the 1880s: we forget quickly at first and then more slowly, and each well-timed review slows the forgetting further.&lt;/p&gt;

&lt;p&gt;Modern research backs this up. A large review by Dunlosky and colleagues (2013) rated &lt;em&gt;distributed practice&lt;/em&gt; and &lt;em&gt;practice testing&lt;/em&gt; as the two highest-utility study techniques of the ten they examined. Cepeda et al. (2008) found that the best gap between reviews gets longer the longer you need to remember something, which is why intervals should expand over time.&lt;/p&gt;

&lt;p&gt;It's not magic. It works best for material you need to &lt;em&gt;recall&lt;/em&gt;: definitions, formulas, mechanisms, dates, vocabulary, problem types. It won't make up for not understanding a concept in the first place. But it is one of the best-supported ways to keep what you've learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two ingredients: spacing + testing
&lt;/h2&gt;

&lt;p&gt;Spacing on its own isn't enough. Rereading your notes at day 1, 3 and 7 is better than rereading them once, but the bigger gain comes from &lt;strong&gt;retrieval&lt;/strong&gt;: making yourself recall the answer before you look at it. So each review session should be a mini-test, not a reread.&lt;/p&gt;

&lt;p&gt;Ways to test yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flashcards (paper or an app like Anki)&lt;/li&gt;
&lt;li&gt;Writing questions in the margin of your notes and covering the answers&lt;/li&gt;
&lt;li&gt;Blank-page recall: write down everything you remember about a topic, then check&lt;/li&gt;
&lt;li&gt;Past exam questions and end-of-chapter problems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The schedule
&lt;/h2&gt;

&lt;p&gt;Here's a simple schedule that works for most courses. Day 0 is the day you first learn the material (the lecture or reading).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Review&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Time needed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Day 1 (next day)&lt;/td&gt;
&lt;td&gt;10–15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Day 3&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Day 7&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Day 14–21&lt;/td&gt;
&lt;td&gt;5–10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Before the exam&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you get something wrong in a review, it goes back to a shorter interval. If you get it right easily, the next gap can be longer. Apps like Anki do this for you. On paper, a "Box 1 / Box 2 / Box 3" system (the Leitner system) does the same job.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a real week looks like
&lt;/h2&gt;

&lt;p&gt;Say you have lectures Monday, Wednesday and Friday in Biology. Your reviews pile up like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tuesday:&lt;/strong&gt; Review Monday's lecture (review 1).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thursday:&lt;/strong&gt; Review Wednesday's lecture (review 1) + Monday's lecture (review 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saturday:&lt;/strong&gt; Review Friday's lecture (review 1) + Wednesday's (review 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next Monday:&lt;/strong&gt; Review last Monday's lecture (review 3) + Friday's (review 2).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In any given week you're doing roughly 20–40 minutes of review per course, spread across several days. That's far less than a cram session, and you remember much more of it.&lt;/p&gt;

&lt;p&gt;The catch is that the reviews &lt;strong&gt;pile up&lt;/strong&gt;. By week 6 you're reviewing material from weeks 1, 3, 4 and 5 all at once. That's why each review has to be short and focused on testing yourself, and why a tracker helps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling to 5 courses
&lt;/h2&gt;

&lt;p&gt;With five courses, schedule review as a fixed daily habit rather than per lecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily:&lt;/strong&gt; 30–45 minutes of "due" reviews across all courses. Do whatever's due today, oldest first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly:&lt;/strong&gt; one longer session (60 min) of mixed practice problems from older topics. Mixing topics (interleaving) also has decent evidence behind it, especially for maths and science problem-solving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before exams:&lt;/strong&gt; turn your question bank into a timed practice test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a day gets missed, don't try to do two days' reviews tomorrow. Do today's, and add the missed ones over the next few days. Overdue reviews are still useful, only a little less so.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to write good review questions
&lt;/h2&gt;

&lt;p&gt;Bad questions make spaced repetition useless. A few rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One fact per question.&lt;/strong&gt; "Explain the Krebs cycle" is too big. "What is the net ATP produced directly by one turn of the Krebs cycle?" is a good one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask why, not just what.&lt;/strong&gt; "Why does increasing temperature eventually decrease enzyme activity?" builds understanding as well as recall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use your own words.&lt;/strong&gt; Copying textbook sentences gets you recognition, not recall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include worked problems.&lt;/strong&gt; For quantitative subjects, the "question" is a problem you have to solve from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete questions you've mastered.&lt;/strong&gt; If you've got one right four times over a month, retire it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tools (free options)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anki:&lt;/strong&gt; free on desktop and Android, and it schedules intervals automatically. It takes some learning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paper flashcards plus Leitner boxes:&lt;/strong&gt; zero setup, and surprisingly effective.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A spreadsheet:&lt;/strong&gt; list each topic, the date you learned it, and the next review date. Sort by due date each day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free &lt;strong&gt;Study OS 2027 Lite&lt;/strong&gt; template has a review tracker that works like the spreadsheet option. You log a topic and it shows the next review dates. &lt;a href="https://nidhiverse1.gumroad.com/l/study-os-2027-lite" rel="noopener noreferrer"&gt;Get it free here&lt;/a&gt;. Anki works just as well if you prefer an app. Use whichever one you'll actually open every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linking review to your grades
&lt;/h2&gt;

&lt;p&gt;Spaced repetition helps most when you aim it well. Before an exam block, check where your grades stand. If the final in one course is worth 40% and your target is still reachable, that course should get the most review time. If a target is already secured or can't be reached, move that time to another course.&lt;/p&gt;

&lt;p&gt;You can check quickly: work out what score you need on the final to hit your target, then plan your reviews around it. If you'd like a ready-made place to track grades and your review schedule, there's a free &lt;a href="https://nidhiverse1.gumroad.com/l/study-os-2027-lite" rel="noopener noreferrer"&gt;Study OS 2027 Lite&lt;/a&gt; planner template (disclosure: I made it).&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rereading instead of recalling.&lt;/strong&gt; It feels good and doesn't do much.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cards that are too big.&lt;/strong&gt; You'll mark them "kind of right" and fool yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starting the week before the exam.&lt;/strong&gt; Spacing needs time. Start in week 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping hard cards.&lt;/strong&gt; The ones you get wrong are exactly the ones you need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never deleting anything.&lt;/strong&gt; Your daily load grows until you quit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How long until it pays off?
&lt;/h2&gt;

&lt;p&gt;Be realistic. In the first week, spaced review feels slower than cramming, because you're spending time on material you won't be tested on for a month. The payoff shows up around midterms, when you find you're revising things you already know instead of learning them again from scratch. Most students who stick with it for four to six weeks say exam prep feels noticeably less frantic. The ones who quit usually stop in week two, before the reviews have had time to build up. If you can get through the first fortnight, the habit mostly runs itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A starter plan for this week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;After your next lecture, write 5 questions on the material.&lt;/li&gt;
&lt;li&gt;Tomorrow, answer them without notes (10 minutes).&lt;/li&gt;
&lt;li&gt;Put reminders in your calendar for day 3 and day 7.&lt;/li&gt;
&lt;li&gt;Repeat for one more course.&lt;/li&gt;
&lt;li&gt;After two weeks, add the rest of your courses.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start small. A 15-minute daily habit you keep for a whole semester will beat a perfect system you drop after a week, every time.&lt;/p&gt;

</description>
      <category>studying</category>
      <category>productivity</category>
      <category>learning</category>
      <category>students</category>
    </item>
    <item>
      <title>Feed a whole YouTube playlist into Claude or ChatGPT as one file (+ MCP setup)</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Mon, 12 Oct 2026 03:08:31 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/feed-a-whole-youtube-playlist-into-claude-or-chatgpt-as-one-file-mcp-setup-5e7g</link>
      <guid>https://dev.to/nidhibuilds/feed-a-whole-youtube-playlist-into-claude-or-chatgpt-as-one-file-mcp-setup-5e7g</guid>
      <description>&lt;p&gt;Paste a YouTube link into Claude and ask for a summary, and one of three things happens: it tells you it can't open the link, it searches the web and summarizes what other people wrote about the video, or it quietly guesses from the title. None of those is the video.&lt;/p&gt;

&lt;p&gt;What every assistant &lt;em&gt;can&lt;/em&gt; do is read text. So the reliable workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the captions as text.&lt;/li&gt;
&lt;li&gt;For a playlist, put all of them in &lt;strong&gt;one file&lt;/strong&gt; in order, with a heading per video.&lt;/li&gt;
&lt;li&gt;Upload that file, or connect a transcript tool over MCP so the assistant fetches it on its own.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This post covers both, with the free DIY route first.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much fits? (do this maths before uploading)
&lt;/h2&gt;

&lt;p&gt;Speech runs at roughly 130–160 words a minute, so one hour of video is about 8,000–10,000 words, or roughly 11,000–13,000 tokens for English. Rough guide:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Playlist&lt;/th&gt;
&lt;th&gt;Approx. words&lt;/th&gt;
&lt;th&gt;Approx. tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 × 15-min videos&lt;/td&gt;
&lt;td&gt;20k&lt;/td&gt;
&lt;td&gt;27k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 × 1-hour lectures&lt;/td&gt;
&lt;td&gt;180k&lt;/td&gt;
&lt;td&gt;240k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 × 1-hour lectures&lt;/td&gt;
&lt;td&gt;900k&lt;/td&gt;
&lt;td&gt;1.2M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Context limits differ by model and plan and change often, so check yours. Two practical rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Under your model's context limit:&lt;/strong&gt; upload the single file and ask questions across the whole playlist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over it:&lt;/strong&gt; upload to a &lt;strong&gt;Claude Project&lt;/strong&gt; or a &lt;strong&gt;ChatGPT Project / custom GPT&lt;/strong&gt; as knowledge files. Those retrieve the relevant parts instead of reading everything at once, so split the playlist into a few files (e.g. one per module) with clear headings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 (free): playlist → one file with yt-dlp
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;yt-dlp
&lt;span class="nb"&gt;mkdir &lt;/span&gt;subs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;subs
yt-dlp &lt;span class="nt"&gt;--skip-download&lt;/span&gt; &lt;span class="nt"&gt;--write-subs&lt;/span&gt; &lt;span class="nt"&gt;--write-auto-subs&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sub-langs&lt;/span&gt; &lt;span class="s2"&gt;"en.*"&lt;/span&gt; &lt;span class="nt"&gt;--sub-format&lt;/span&gt; vtt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"%(playlist_index)03d - %(title)s.%(ext)s"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://www.youtube.com/playlist?list=YOUR_PLAYLIST_ID"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This downloads only subtitle files (no video), creator captions first, auto-captions otherwise, numbered in playlist order. Run it from a home connection; YouTube often blocks cloud and VPN IPs with a "confirm you're not a bot" error.&lt;/p&gt;

&lt;p&gt;Then merge them. Raw &lt;code&gt;.vtt&lt;/code&gt; auto-captions repeat each line two or three times, so dedupe while you merge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;TAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;[^&amp;gt;]+&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;# Playlist transcripts&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.vtt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ignore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WEBVTT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Kind:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Language:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\.[\w-]+\.vtt$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# drop ".en.vtt"
&lt;/span&gt;    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;## &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;playlist.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;words&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: prompt it like a long document, not a video
&lt;/h2&gt;

&lt;p&gt;Headings per video are what make this work. The model can cite "## 007 - Backpropagation" instead of vaguely saying "in one of the videos".&lt;/p&gt;

&lt;p&gt;Prompts that use the whole playlist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"This file has one section per video. For each section, give one line: the main claim and the best example used."&lt;/li&gt;
&lt;li&gt;"Where do videos 3 and 11 disagree? Quote both."&lt;/li&gt;
&lt;li&gt;"Build a study plan: what to rewatch, in what order, for someone who already knows X."&lt;/li&gt;
&lt;li&gt;"Turn the whole series into a checklist I can follow, with the video number next to each step."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask it to &lt;strong&gt;quote&lt;/strong&gt; when it matters. Quotes from a transcript are checkable; paraphrases can drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 (optional): let the assistant fetch transcripts itself with MCP
&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) lets Claude, ChatGPT, Cursor and other clients call external tools. With a YouTube transcript MCP server connected, you can say "get the transcripts for this playlist and compare videos 2 and 5", and the assistant fetches the text itself.&lt;/p&gt;

&lt;p&gt;You can self-host an open-source transcript MCP server (several exist on GitHub, most built on &lt;code&gt;youtube-transcript-api&lt;/code&gt;). They work well locally, but the same IP blocking applies when you deploy them to a cloud server.&lt;/p&gt;

&lt;p&gt;Or use a hosted one. I built &lt;a href="https://13-234-185-132.sslip.io/?ref=devto" rel="noopener noreferrer"&gt;YT Transcriber&lt;/a&gt;, which has a remote MCP server (disclosure: I'm the maker, a student). The setup is the same pattern for any remote MCP server:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Get a key.&lt;/strong&gt; Sign in, then &lt;strong&gt;Settings → API keys → Create&lt;/strong&gt;, and copy it once. Then &lt;strong&gt;Settings → AI &amp;amp; Automations&lt;/strong&gt; gives you the MCP server URL with the key included. Treat that URL like a password.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude:&lt;/strong&gt; Customize → Connectors → &lt;strong&gt;Add custom connector&lt;/strong&gt;. Name it, paste the MCP URL, and choose no extra sign-in, since the URL carries the key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT:&lt;/strong&gt; Settings → Apps → &lt;strong&gt;Create MCP app&lt;/strong&gt;. Paste the MCP URL, authentication: none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor:&lt;/strong&gt; Settings → MCP → New MCP server, preferably with the key in a header instead of the URL:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"yt-transcriber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://13-234-185-132.sslip.io/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ytk_YOUR_KEY"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server exposes five tools: &lt;code&gt;submit_transcripts&lt;/code&gt; (video, playlist or channel URLs), &lt;code&gt;list_jobs&lt;/code&gt;, &lt;code&gt;get_transcript&lt;/code&gt;, &lt;code&gt;export_transcript&lt;/code&gt; (txt, md, json, toon, srt, pdf) and &lt;code&gt;check_quota&lt;/code&gt;. In the web app, a finished playlist can also be downloaded as &lt;strong&gt;one file&lt;/strong&gt; for this exact workflow, auto-split under 450,000 words between videos.&lt;/p&gt;

&lt;p&gt;Honest limits: it reads existing captions (no speech-to-text), so caption-less videos fail. The free tier is 3 videos a day after sign-in, and you can try one video on the homepage without signing in. Whole playlists are $9/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don't trust a model that says it "watched" a YouTube link. Give it the transcript.&lt;/li&gt;
&lt;li&gt;One file per playlist, a heading per video, in playlist order.&lt;/li&gt;
&lt;li&gt;Check the size against your model's context; use Projects or knowledge files when it's bigger.&lt;/li&gt;
&lt;li&gt;MCP turns "go get the transcript" into something the assistant can do on its own.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>chatgpt</category>
      <category>mcp</category>
      <category>youtube</category>
    </item>
    <item>
      <title>How to get around NotebookLM's 50-source limit with YouTube playlists</title>
      <dc:creator>Nidhi</dc:creator>
      <pubDate>Mon, 12 Oct 2026 03:08:30 +0000</pubDate>
      <link>https://dev.to/nidhibuilds/how-to-get-around-notebooklms-50-source-limit-with-youtube-playlists-3f12</link>
      <guid>https://dev.to/nidhibuilds/how-to-get-around-notebooklms-50-source-limit-with-youtube-playlists-3f12</guid>
      <description>&lt;p&gt;NotebookLM (Google renamed it &lt;strong&gt;Gemini Notebook&lt;/strong&gt; in July 2026, same product) is one of the best free ways to study from long video courses. You add a YouTube link, it reads the video's captions, and you can ask questions, make flashcards or generate an audio overview.&lt;/p&gt;

&lt;p&gt;The problem shows up with real courses. Google's help pages list these limits for the free plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;50 sources per notebook&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;500,000 words per source&lt;/strong&gt; (or 200 MB per uploaded file)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each YouTube link is one source. A semester course with 120 lectures needs three notebooks, and then you can't ask one question across the whole course.&lt;/p&gt;

&lt;p&gt;The fix is in the second number. &lt;strong&gt;50 sources is small, but 500,000 words per source is big.&lt;/strong&gt; One hour of lecture speech is roughly 8,000–10,000 words of captions, so one source can hold around 45–55 hours of transcript. Turn the playlist into one text file and the course becomes one source, leaving 49 free slots for slides, papers and notes.&lt;/p&gt;

&lt;p&gt;Below is the free, do-it-yourself way, then a shortcut if you don't want to touch a terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/yt-dlp/yt-dlp" rel="noopener noreferrer"&gt;yt-dlp&lt;/a&gt; (&lt;code&gt;pip install yt-dlp&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A playlist whose videos have captions (manual or auto-generated). This method reads captions; it does not transcribe audio, so a video without captions gives you nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Download only the captions for the whole playlist
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;subs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;subs
yt-dlp &lt;span class="nt"&gt;--skip-download&lt;/span&gt; &lt;span class="nt"&gt;--write-subs&lt;/span&gt; &lt;span class="nt"&gt;--write-auto-subs&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sub-langs&lt;/span&gt; &lt;span class="s2"&gt;"en.*"&lt;/span&gt; &lt;span class="nt"&gt;--sub-format&lt;/span&gt; vtt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"%(playlist_index)03d - %(title)s.%(ext)s"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://www.youtube.com/playlist?list=YOUR_PLAYLIST_ID"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What the flags do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--skip-download&lt;/code&gt; fetches no video or audio, only subtitle files.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--write-subs --write-auto-subs&lt;/code&gt; takes the creator's captions if they exist, otherwise YouTube's auto-captions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--sub-langs "en.*"&lt;/code&gt; picks English tracks. Change &lt;code&gt;en&lt;/code&gt; to your language code. If you get the wrong language, run &lt;code&gt;yt-dlp --list-subs URL&lt;/code&gt; on one video to see the exact track names.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;%(playlist_index)03d&lt;/code&gt; puts a 001, 002, ... prefix on each file so the lectures stay in order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you get "Sign in to confirm you're not a bot" errors, you're probably on a cloud server or VPN. YouTube blocks many datacenter IPs. Run it from your normal home connection, and add &lt;code&gt;--sleep-requests 1&lt;/code&gt; for big playlists so you don't hammer YouTube.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Combine the subtitle files into one clean Markdown file
&lt;/h2&gt;

&lt;p&gt;Raw &lt;code&gt;.vtt&lt;/code&gt; files are full of timing lines, formatting tags and, for auto-captions, every line repeated two or three times as the captions "roll". This script strips all of that, keeps the lectures in order under a &lt;code&gt;## heading&lt;/code&gt; each, and starts a new part file only if you go past 450,000 words (a safety margin under the 500k cap). It never cuts a lecture in half.&lt;/p&gt;

&lt;p&gt;Save it as &lt;code&gt;combine_subs.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Combine every .vtt subtitle file in a folder into one Markdown file per
~450,000 words (under Gemini Notebook / NotebookLM&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s 500,000-words-per-source cap).
Usage: python3 combine_subs.py ./subs &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My Course&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;WORD_CAP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;450_000&lt;/span&gt;
&lt;span class="n"&gt;TAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;[^&amp;gt;]+&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# &amp;lt;00:00:01.234&amp;gt;&amp;lt;c&amp;gt; word timing tags
&lt;/span&gt;&lt;span class="n"&gt;CUE_TIME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# 00:00:01.000 --&amp;gt; 00:00:03.000 lines
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;vtt_to_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ignore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WEBVTT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;CUE_TIME&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Kind:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Language:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NOTE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                &lt;span class="c1"&gt;# auto-captions repeat each line as they roll
&lt;/span&gt;            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.vtt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No .vtt files in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;# &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\.[\w-]+\.vtt$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# drop ".en.vtt"
&lt;/span&gt;        &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;vtt_to_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;WORD_CAP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;              &lt;span class="c1"&gt;# start a new part between videos
&lt;/span&gt;            &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;# &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (continued)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;## &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - part &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wrote &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; words)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Playlist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 combine_subs.py ./subs &lt;span class="s2"&gt;"Intro to Algorithms"&lt;/span&gt;
&lt;span class="c"&gt;# example output: wrote Intro to Algorithms.md (182,000 words)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Big courses come out as &lt;code&gt;... - part 1.md&lt;/code&gt;, &lt;code&gt;... - part 2.md&lt;/code&gt;, each under the cap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Upload it to NotebookLM as one source
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open your notebook, click &lt;strong&gt;Add sources&lt;/strong&gt;, and upload the &lt;code&gt;.md&lt;/code&gt; file. If the upload dialog won't take &lt;code&gt;.md&lt;/code&gt; on your account, rename it to &lt;code&gt;.txt&lt;/code&gt;; it's plain text either way.&lt;/li&gt;
&lt;li&gt;Because every lecture sits under its own &lt;code&gt;## 001 - Title&lt;/code&gt; heading, citations point you to the right lecture.&lt;/li&gt;
&lt;li&gt;Use the 49 free slots for the course slides, papers and your own notes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prompts that work well on a whole-course source
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;"Make a one-page outline of the course, one line per lecture, using the lecture headings."&lt;/li&gt;
&lt;li&gt;"Which lectures explain dynamic programming? Quote the key sentence from each."&lt;/li&gt;
&lt;li&gt;"Write 20 exam-style questions that need ideas from at least two different lectures."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limits to know (so you're not surprised)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Captions only.&lt;/strong&gt; If a lecturer writes a formula on the board without saying it, it isn't in the transcript. Add the slides as a separate source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-captions make mistakes&lt;/strong&gt; with names and technical terms. Spot-check anything you'll quote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamps are dropped&lt;/strong&gt; by this script to save words. If you need to jump back to the exact moment, keep the original &lt;code&gt;.vtt&lt;/code&gt; files, or export SRT instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private, members-only and caption-less videos&lt;/strong&gt; won't work with any caption-based method.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The shortcut (if you'd rather not run scripts)
&lt;/h2&gt;

&lt;p&gt;I built a web tool, &lt;a href="https://13-234-185-132.sslip.io/?ref=devto" rel="noopener noreferrer"&gt;YT Transcriber&lt;/a&gt;, that does Steps 1 and 2 in the browser: paste a playlist or channel URL and download it as one file for NotebookLM, ChatGPT or Claude, auto-split under 450,000 words between videos. You can try one video on the homepage with no sign-in. With a Google sign-in it's 3 videos a day free, and $9/month for whole playlists. Disclosure: I'm the maker, a student. It reads captions like the script above, so the same limits apply.&lt;/p&gt;

&lt;p&gt;The free script works fine too. The point of this post is the trick: &lt;strong&gt;one big file beats 50 small links.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>notebooklm</category>
      <category>youtube</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
