<?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: Alok Singh</title>
    <description>The latest articles on DEV Community by Alok Singh (@aryansbtloe).</description>
    <link>https://dev.to/aryansbtloe</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%2F4200262%2Fa213a348-e9a7-4e45-affc-6f651516050a.jpg</url>
      <title>DEV Community: Alok Singh</title>
      <link>https://dev.to/aryansbtloe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryansbtloe"/>
    <language>en</language>
    <item>
      <title>How to Extract Text From an Image or Screenshot (English and Hindi)</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Tue, 10 Nov 2026 08:58:10 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-to-extract-text-from-an-image-or-screenshot-english-and-hindi-43i</link>
      <guid>https://dev.to/aryansbtloe/how-to-extract-text-from-an-image-or-screenshot-english-and-hindi-43i</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-to-extract-text-from-an-image-or-screenshot-english/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-to-extract-text-from-an-image-or-screenshot-english/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Wi-Fi password is on a sticker photo. A recipe is on a screenshot from someone's story. A friend sent a photo of a printed notice in Hindi and you want to forward the text. In each case you want words, not a picture. &lt;a href="https://bestlatestapps.com/tools/image-to-text/" rel="noopener noreferrer"&gt;Image to text&lt;/a&gt; reads the text out of an image so you can copy, edit or download it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open, drop or paste one or more images, or take a photo.&lt;/li&gt;
&lt;li&gt;Pick a language: English, Hindi, or both.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Read text&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Copy the result, edit it in the box, or download it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you add several images, they're read in order and joined, so photographing a few pages gives you one continuous block of text.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's doing the reading
&lt;/h2&gt;

&lt;p&gt;It's Tesseract, a well-established open-source OCR engine, running inside your browser with English and Hindi language data. The first run downloads the engine and language files; after that, the browser has them.&lt;/p&gt;

&lt;p&gt;For screenshots and receipts, there's a &lt;strong&gt;Sharpen small or faint text&lt;/strong&gt; option. It enlarges and cleans up the image before reading, which helps a lot with thin fonts and low-resolution screenshots. Leave it on unless the text is already large and crisp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting accurate results
&lt;/h2&gt;

&lt;p&gt;OCR is very good with good input and frustrating with bad input. The photo matters more than any setting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fill the frame with the text.&lt;/strong&gt; A tiny paragraph in the middle of a big photo reads badly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shoot straight on.&lt;/strong&gt; Steep angles distort letter shapes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even light, no shadows.&lt;/strong&gt; Shadow across a line often deletes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hold still.&lt;/strong&gt; A slightly blurred photo looks fine to you and terrible to an OCR engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid fancy fonts.&lt;/strong&gt; Script, outlined and heavily stylised text cause the most errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hindi and mixed text
&lt;/h2&gt;

&lt;p&gt;Choose Hindi for Devanagari, or English and Hindi for mixed text like a government notice or a shop bill. Printed Hindi reads well. Proofread conjuncts and matras, since a misread vowel sign changes the word.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handwriting
&lt;/h2&gt;

&lt;p&gt;Neat, print-style handwriting sometimes works. Joined-up handwriting is hard for OCR engines in general, so expect to correct a lot or retype.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everyday examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Receipts for expense claims:&lt;/strong&gt; read the total and vendor, paste into your spreadsheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slides photographed in a lecture:&lt;/strong&gt; turn them into notes you can search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business cards:&lt;/strong&gt; copy phone and email instead of typing them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots of error messages:&lt;/strong&gt; paste the exact message into a search engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Book quotes:&lt;/strong&gt; photograph a page, copy the passage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Images vs PDFs
&lt;/h2&gt;

&lt;p&gt;This page reads image files: JPG, PNG, WebP and screenshots. For scanned PDFs, use &lt;a href="https://bestlatestapps.com/tools/ocr-pdf/" rel="noopener noreferrer"&gt;OCR PDF&lt;/a&gt;, which also makes the PDF itself searchable. If you're starting from paper and want a clean document, &lt;a href="https://bestlatestapps.com/tools/scan-to-pdf/" rel="noopener noreferrer"&gt;Scan to PDF&lt;/a&gt; followed by OCR PDF gives you both a tidy scan and text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Always proofread the numbers
&lt;/h2&gt;

&lt;p&gt;OCR mistakes cluster in exactly the places that matter: phone numbers, amounts, dates and codes. A 5 read as an S, a 0 as an O, or a decimal point dropped can turn ₹1,250.50 into ₹125050. Before pasting extracted figures into anything important, glance back at the image and check each one. It takes seconds and avoids awkward corrections later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;The tool page says your images are read inside the page. The engine and language data are fetched once on first use. Google ads appear on the page, as across the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Can it read Hindi?&lt;/strong&gt;&lt;br&gt;
Yes, alone or mixed with English.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why are some words wrong?&lt;/strong&gt;&lt;br&gt;
Blur, shadows, small text and fancy fonts. Retake the photo in good light and keep Sharpen on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can it read handwriting?&lt;/strong&gt;&lt;br&gt;
Neat print sometimes; cursive rarely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use it on a PDF?&lt;/strong&gt;&lt;br&gt;
Use OCR PDF for PDF files.&lt;/p&gt;

&lt;p&gt;Need the words out of a picture? Try &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/image-to-text/" rel="noopener noreferrer"&gt;Image to text&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ocr</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How to Compress a PDF Without Uploading It</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Tue, 10 Nov 2026 08:57:37 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-to-compress-a-pdf-without-uploading-it-llm</link>
      <guid>https://dev.to/aryansbtloe/how-to-compress-a-pdf-without-uploading-it-llm</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-to-compress-a-pdf-without-uploading/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-to-compress-a-pdf-without-uploading/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Picture a 31 MB scanned lease that has to reach a letting agent. Gmail turns it into a Drive link, the agent's portal wants a file under 10 MB, and the scanner software that made it is long gone. That situation is the reason &lt;a href="https://bestlatestapps.com/tools/compress-pdf/" rel="noopener noreferrer"&gt;Compress PDF&lt;/a&gt; exists: you pick the file, pick how aggressive to be, and get a smaller copy back in the same tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three modes, three different trade-offs
&lt;/h2&gt;

&lt;p&gt;Most compressors hide what they do. This one makes you choose, and the choice matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep text and links&lt;/strong&gt; is the gentle option. It repacks the PDF's internals and throws away objects nothing refers to any more. Your text stays selectable, links still click, bookmarks and form fields survive, and the pages look identical. The catch: it doesn't touch the images already inside the file. A Word export full of text may drop a lot; a scan, which is basically a stack of photos, often barely moves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smaller file&lt;/strong&gt; and &lt;strong&gt;Clearer pages&lt;/strong&gt; take the opposite approach. Every page is rendered as a picture, saved as a JPEG, and placed on a fresh page with the original dimensions. Smaller uses harsher JPEG settings; Clearer keeps more detail. Both mean the result is image-only, so you lose text selection, search, links and fillable fields. There's also a &lt;strong&gt;Grey pages&lt;/strong&gt; checkbox that removes colour for an even lighter file. These two modes handle up to 300 pages per run.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick routine that works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the tool and choose your PDF.&lt;/li&gt;
&lt;li&gt;If the file came out of Word, Google Docs or a website, start with Keep text and links.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Compress PDF&lt;/strong&gt; and read the note under the button, which shows the size before and after.&lt;/li&gt;
&lt;li&gt;Not small enough? Run it again on the original with Smaller file. Tick Grey pages if nobody needs the colour.&lt;/li&gt;
&lt;li&gt;Open the download and zoom in on the smallest print before you send it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a scanned lease like that, the gentle mode would save very little because the file is all images. Smaller file with grey pages is the mode most likely to get it under the portal limit; check that the signature is still legible before sending.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfalls worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sometimes there's no download.&lt;/strong&gt; If the new file wouldn't be smaller, the tool keeps your original and tells you why instead of handing you a bigger file. That usually means the PDF was already efficient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't picture-compress forms you still need to fill.&lt;/strong&gt; Once a page becomes a JPEG, the fields are just pixels. Fill and flatten first, compress last.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Huge pages come out a little soft.&lt;/strong&gt; Browsers cap how large a drawing canvas can get, so oversized pages (architectural drawings, posters) are scaled down to fit before being saved. For those, the gentle mode is safer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searchable PDFs stop being searchable&lt;/strong&gt; in the picture modes. If you ran OCR to make a scan searchable, compressing it with Smaller file throws that work away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your original file is never modified.&lt;/strong&gt; The result is a separate download, so experimenting costs nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where the file goes
&lt;/h2&gt;

&lt;p&gt;The PDF is processed inside the browser tab and isn't uploaded, according to the tool page. That makes it a reasonable choice for leases, payslips and ID scans you'd rather not hand to a random upload site. The page itself carries Google ads, as the rest of the site does.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Which mode should I try first for an email attachment?&lt;/strong&gt;&lt;br&gt;
Keep text and links for anything born digital. Jump to Smaller file (plus Grey pages) for scans and phone photos of documents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did the file get only slightly smaller?&lt;/strong&gt;&lt;br&gt;
Probably because most of its weight is in images that the gentle mode leaves alone. The picture modes are the ones that recompress those.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will people still be able to copy text out of it?&lt;/strong&gt;&lt;br&gt;
Only if you used Keep text and links. The other two modes turn the words into part of an image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it work on a phone?&lt;/strong&gt;&lt;br&gt;
It runs in the browser, so yes, though very long documents depend on how much memory the phone gives the tab.&lt;/p&gt;

&lt;p&gt;Next time an upload form rejects your file, open &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/compress-pdf/" rel="noopener noreferrer"&gt;Compress PDF&lt;/a&gt;&lt;/strong&gt; and try the gentle mode first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>CTC to In-Hand Salary: How to Work Out Your Monthly Take-Home in India</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Tue, 10 Nov 2026 08:57:05 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/ctc-to-in-hand-salary-how-to-work-out-your-monthly-take-home-in-india-3k7h</link>
      <guid>https://dev.to/aryansbtloe/ctc-to-in-hand-salary-how-to-work-out-your-monthly-take-home-in-india-3k7h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/ctc-to-in-hand-salary-how-to-work-out-your-monthly-take-home/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/ctc-to-in-hand-salary-how-to-work-out-your-monthly-take-home/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An offer letter says ₹13.56 lakh CTC. Divide by 12 and you'd expect ₹1.13 lakh a month. The first payslip says something closer to ₹1.03 lakh, and nobody explained the gap. &lt;a href="https://bestlatestapps.com/tools/ctc-to-in-hand/" rel="noopener noreferrer"&gt;CTC to in-hand salary&lt;/a&gt; walks through exactly where the money goes: employer PF, your PF, professional tax and income tax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enter annual CTC, monthly basic pay, dearness allowance and HRA.&lt;/li&gt;
&lt;li&gt;Enter your state's professional tax, and tick EDLI or the admin charge if those are already included in your CTC.&lt;/li&gt;
&lt;li&gt;Read the monthly in-hand pay, PF, and income tax for the year.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The worked example on the page
&lt;/h2&gt;

&lt;p&gt;The form opens with CTC ₹13,56,000, basic ₹50,000 and HRA ₹20,000, which comes to ₹1,03,100 a month in hand under the new regime. Here's the arithmetic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly CTC: ₹1,13,000.&lt;/li&gt;
&lt;li&gt;Employer PF, on the ₹25,000 wage ceiling: 12% = ₹3,000. That's part of CTC but never reaches your account, so gross pay is ₹1,10,000.&lt;/li&gt;
&lt;li&gt;Your own PF, also 12% of ₹25,000: ₹3,000.&lt;/li&gt;
&lt;li&gt;Annual taxable income: ₹13,20,000 gross minus the ₹75,000 standard deduction = ₹12,45,000.&lt;/li&gt;
&lt;li&gt;Tax for the year, with marginal relief and 4% cess: ₹46,800, or ₹3,900 a month.&lt;/li&gt;
&lt;li&gt;In hand: ₹1,10,000 − ₹3,000 − ₹3,900 = &lt;strong&gt;₹1,03,100&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Provident fund rules used
&lt;/h2&gt;

&lt;p&gt;According to the page, from 17 September 2026 the PF wage ceiling is ₹25,000 a month. Both you and your employer contribute 12% of PF wages. The employer's 12% is split: 8.33% of wages up to the ceiling goes to the pension scheme (EPS), rounded to the nearest rupee, and the rest goes to EPF. For example, on PF wages of ₹25,000, EPS is ₹2,083 and employer EPF is the remaining ₹917.&lt;/p&gt;

&lt;p&gt;EPS membership depends on your wages when you joined (or on 17 September 2026) being within the ceiling. If your employer puts the full 12% into EPF, untick EPS.&lt;/p&gt;

&lt;p&gt;EDLI and PF admin charges are each 0.50% of wages up to the ceiling. Tick them only if your CTC already includes that cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Professional tax
&lt;/h2&gt;

&lt;p&gt;Enter what your state deducts in a normal month. Some states charge a different amount in February; there's a separate field for that. Leave it blank if every month is the same. In the new regime, professional tax reduces in-hand pay but not taxable income. In the old regime it also reduces taxable income.&lt;/p&gt;

&lt;h2&gt;
  
  
  Old regime
&lt;/h2&gt;

&lt;p&gt;The old regime uses its own slabs, a ₹50,000 standard deduction, annual professional tax, and deductions for deposits up to ₹1,50,000 (your own PF counts toward this). Age changes the nil band from 60 and again from 80.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using it for an offer negotiation
&lt;/h2&gt;

&lt;p&gt;Two offers: one with a higher CTC but a big variable bonus and PF on full basic, another slightly lower but with PF capped at the ceiling. Run both. Monthly in-hand is what pays rent; the PF difference is savings you'll get later, and a bonus is only real when paid. Seeing all three numbers separately makes the comparison honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monthly tax vs TDS
&lt;/h2&gt;

&lt;p&gt;The monthly tax shown is the year's tax divided by 12. Your employer's payroll may withhold different amounts in particular months, for example after you submit investment proofs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules as of October 2026
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Rules as of 27 October 2026.&lt;/em&gt; The page works out provident fund on the ₹25,000 ceiling, the professional tax you enter, and income tax for 2026-27. Salary structures, PF rules, professional tax by state and tax slabs all vary and change. Your employer's payslip is the final word; use this as an estimate.&lt;/p&gt;

&lt;p&gt;Official sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.epfindia.gov.in/" rel="noopener noreferrer"&gt;EPFO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.incometax.gov.in/iec/foportal/" rel="noopener noreferrer"&gt;Income Tax Department e-filing portal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;According to the page, your pay stays in the browser tab, and the page link only keeps the surrounding choices. Google ads appear on the page, as across the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Why is the example's in-hand ₹1,03,100?&lt;/strong&gt;&lt;br&gt;
₹1,13,000 CTC minus ₹3,000 employer PF minus ₹3,000 employee PF minus ₹3,900 monthly tax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do I enter professional tax?&lt;/strong&gt;&lt;br&gt;
Your state's normal monthly amount, plus February if different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the monthly tax the same as TDS?&lt;/strong&gt;&lt;br&gt;
It's an average; payroll may vary month to month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it handle the old regime?&lt;/strong&gt;&lt;br&gt;
Yes.&lt;/p&gt;

&lt;p&gt;Got an offer letter? Check the real monthly figure with &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/ctc-to-in-hand/" rel="noopener noreferrer"&gt;CTC to in-hand salary&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>iOS Silent Push Notifications That Actually Arrive: content-available, Priority 5 and the Throttling Rules</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Mon, 09 Nov 2026 04:36:14 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/ios-silent-push-notifications-that-actually-arrive-content-available-priority-5-and-the-2j79</link>
      <guid>https://dev.to/aryansbtloe/ios-silent-push-notifications-that-actually-arrive-content-available-priority-5-and-the-2j79</guid>
      <description>&lt;p&gt;Silent push notifications (Apple calls them background notifications) are the push you send when you don't want to show anything. You just want the app to wake up, fetch new data, refresh a cache or sync a record. They're also the push type developers most often swear "doesn't work."&lt;/p&gt;

&lt;p&gt;Usually it does work. It just follows rules that visible alerts don't. This guide covers the exact payload and headers, the app-side code, and the reasons a silent push gets delayed or dropped.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The payload
&lt;/h2&gt;

&lt;p&gt;A silent push is a payload with &lt;code&gt;content-available&lt;/code&gt; set to &lt;code&gt;1&lt;/code&gt; and no &lt;code&gt;alert&lt;/code&gt;, &lt;code&gt;sound&lt;/code&gt; or &lt;code&gt;badge&lt;/code&gt;:&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;"aps"&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;"content-available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"since"&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-11-09T04:00:00Z"&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;Anything outside &lt;code&gt;aps&lt;/code&gt; is your own data and is handed to the app. Keep the total under 4 KB.&lt;/p&gt;

&lt;p&gt;If you add an &lt;code&gt;alert&lt;/code&gt; to the same payload, it's no longer a silent push. It becomes a visible notification that also happens to wake the app, and it follows the visible-alert rules instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The headers (this is where most failures come from)
&lt;/h2&gt;

&lt;p&gt;When you call APNs over HTTP/2, a background notification needs these headers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apns-push-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;background&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apns-priority&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apns-topic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;your app's bundle ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rules matter here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;apns-push-type&lt;/code&gt; must be &lt;code&gt;background&lt;/code&gt;.&lt;/strong&gt; Since iOS 13 the header is required, and if it says &lt;code&gt;alert&lt;/code&gt; for a payload with no alert, delivery isn't reliable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority must be 5, not 10.&lt;/strong&gt; Priority 10 means "deliver immediately and show something to the user." Apple documents that background notifications sent with priority 10 can be rejected or not delivered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick test with &lt;code&gt;curl&lt;/code&gt; once you have a provider token (&lt;code&gt;$JWT&lt;/code&gt;) and a device token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--http2&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"authorization: bearer &lt;/span&gt;&lt;span class="nv"&gt;$JWT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"apns-topic: com.example.myapp"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"apns-push-type: background"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"apns-priority: 5"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"aps":{"content-available":1},"type":"sync"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.sandbox.push.apple.com/3/device/&lt;/span&gt;&lt;span class="nv"&gt;$DEVICE_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;200&lt;/code&gt; response with an &lt;code&gt;apns-id&lt;/code&gt; header means APNs accepted it. Accepted doesn't mean delivered, which is the next section.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;api.sandbox.push.apple.com&lt;/code&gt; for builds you run from Xcode and &lt;code&gt;api.push.apple.com&lt;/code&gt; for TestFlight and App Store builds. A token from one environment won't work in the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The app side
&lt;/h2&gt;

&lt;p&gt;First, turn on the capability. In Xcode, open &lt;strong&gt;Signing &amp;amp; Capabilities&lt;/strong&gt;, add &lt;strong&gt;Background Modes&lt;/strong&gt;, and tick &lt;strong&gt;Remote notifications&lt;/strong&gt;. Without it, the app is never woken.&lt;/p&gt;

&lt;p&gt;Register for remote notifications. Note that a silent push doesn't need the user's permission to show alerts, so you can register even if they declined:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;UIKit&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;AppDelegate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;UIApplicationDelegate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="n"&gt;didFinishLaunchingWithOptions&lt;/span&gt; &lt;span class="nv"&gt;launchOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;LaunchOptionsKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerForRemoteNotifications&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="n"&gt;didRegisterForRemoteNotificationsWithDeviceToken&lt;/span&gt; &lt;span class="nv"&gt;deviceToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deviceToken&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"%02x"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;joined&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="s"&gt;"APNs device token:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// send it to your server&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="n"&gt;didReceiveRemoteNotification&lt;/span&gt; &lt;span class="nv"&gt;userInfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;AnyHashable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                     &lt;span class="n"&gt;fetchCompletionHandler&lt;/span&gt; &lt;span class="nv"&gt;completionHandler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;@escaping&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UIBackgroundFetchResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="n"&gt;userInfo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"sync"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;completionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;noData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;Task&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;changed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="kt"&gt;SyncService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pullChanges&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="nf"&gt;completionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;changed&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;newData&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;noData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;completionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a SwiftUI app, hook the delegate in with &lt;code&gt;@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two things to get right in that handler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always call the completion handler&lt;/strong&gt;, on every path. You get roughly 30 seconds of background time. Not calling it, or running too long, teaches the system that your app is expensive to wake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return an honest result.&lt;/strong&gt; Use &lt;code&gt;.newData&lt;/code&gt;, &lt;code&gt;.noData&lt;/code&gt; or &lt;code&gt;.failed&lt;/code&gt; to reflect what actually happened.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Why silent pushes don't arrive
&lt;/h2&gt;

&lt;p&gt;Background notifications are low priority by design, and iOS decides when to deliver them. These are the common reasons yours seem lost:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The user force-quit the app.&lt;/strong&gt; If someone swipes the app away in the app switcher, iOS won't launch it for background notifications until they open it again. This is the number one "it worked yesterday" cause.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throttling.&lt;/strong&gt; Apple's guidance is not to send more than two or three per hour. Send more and the system will hold or coalesce them. Only the latest one may be delivered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low Power Mode and battery state.&lt;/strong&gt; With Low Power Mode on or a low battery, the system defers background work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background App Refresh is off&lt;/strong&gt;, either for your app or globally in Settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong headers.&lt;/strong&gt; Priority 10, or a missing or wrong &lt;code&gt;apns-push-type&lt;/code&gt;, as covered above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong environment.&lt;/strong&gt; A sandbox token sent to the production endpoint (or the reverse) returns &lt;code&gt;400 BadDeviceToken&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you need delivery to be immediate and guaranteed, a silent push is the wrong tool. Send a visible alert, or use a Notification Service Extension with &lt;code&gt;mutable-content&lt;/code&gt; to fetch data while showing a notification.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. A debugging checklist
&lt;/h2&gt;

&lt;p&gt;When a background notification isn't waking your app, go down this list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test on a &lt;strong&gt;physical device&lt;/strong&gt;, from a build installed with Xcode, using the &lt;strong&gt;sandbox&lt;/strong&gt; endpoint.&lt;/li&gt;
&lt;li&gt;Make sure the app is in the background and &lt;strong&gt;not force-quit&lt;/strong&gt;. Open it, press Home, then send.&lt;/li&gt;
&lt;li&gt;Check the APNs response code and keep the &lt;code&gt;apns-id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Plug the phone into a Mac, open &lt;strong&gt;Console.app&lt;/strong&gt;, select the device, and filter for &lt;code&gt;dasd&lt;/code&gt; and your bundle ID. You'll see lines showing whether the system decided to launch your app, or why it deferred it.&lt;/li&gt;
&lt;li&gt;Add a log or a local notification inside &lt;code&gt;didReceiveRemoteNotification&lt;/code&gt; so you know for sure when it runs.&lt;/li&gt;
&lt;li&gt;Leave a few minutes between test sends so you don't trigger throttling while debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;A silent push needs &lt;code&gt;content-available: 1&lt;/code&gt;, &lt;code&gt;apns-push-type: background&lt;/code&gt;, priority 5 and the Remote notifications background mode. Then you have to accept that iOS treats it as a hint, not a command. Design your sync so a missed push is harmless, and keep a foreground refresh as the backstop.&lt;/p&gt;

&lt;p&gt;If you'd rather send test pushes without writing a backend, I built &lt;a href="https://apps.apple.com/us/app/push-notification-tester/id1516154713" rel="noopener noreferrer"&gt;Push Notification – Tester&lt;/a&gt;, a free Mac app that sends APNs pushes, including silent payloads, using your push certificate from Keychain, to Development or Production. Full disclosure: I'm its developer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was written with AI assistance and reviewed by me before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>pushnotifications</category>
    </item>
    <item>
      <title>How to Upscale an Image 2 or 4 With AI, Right in Your Browser</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Sun, 08 Nov 2026 08:41:25 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-to-upscale-an-image-2x-or-4x-with-ai-right-in-your-browser-m17</link>
      <guid>https://dev.to/aryansbtloe/how-to-upscale-an-image-2x-or-4x-with-ai-right-in-your-browser-m17</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-to-upscale-an-image-2-or-4-with-ai-right-in-your-browser/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-to-upscale-an-image-2-or-4-with-ai-right-in-your-browser/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Say a relative sends a 640-pixel-wide photo of your grandparents, scanned years ago and squashed by WhatsApp a few times, and asks for a print for their anniversary. Stretch it to print size in a normal editor and you get a blurry mess. &lt;a href="https://bestlatestapps.com/tools/upscale-image/" rel="noopener noreferrer"&gt;Upscale image&lt;/a&gt; uses an AI model to rebuild detail while it enlarges, which is the difference between "blurry" and "surprisingly decent".&lt;/p&gt;

&lt;h2&gt;
  
  
  What's different about AI upscaling
&lt;/h2&gt;

&lt;p&gt;Traditional resizing just spreads the existing pixels over a bigger area and blends them, so edges go soft. Real-ESRGAN, the model this page uses, was trained on lots of image pairs to predict what fine detail probably looked like. It sharpens edges, firms up textures and cleans compression blockiness as it enlarges.&lt;/p&gt;

&lt;p&gt;That "probably" matters. The model invents plausible detail; it doesn't recover information that was never captured. Faces, text and fine patterns can come out slightly different from reality. For a family print, that's usually fine. For evidence, ID documents or anything where accuracy matters, it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Add a JPG, PNG or WebP.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;2×&lt;/strong&gt; or &lt;strong&gt;4×&lt;/strong&gt;, and a smoothing level.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Enlarge&lt;/strong&gt;. A progress line shows how far along it is, along with the final size.&lt;/li&gt;
&lt;li&gt;Download as PNG or JPG.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2× or 4×?
&lt;/h2&gt;

&lt;p&gt;2× finishes faster and keeps the file smaller. 4× gives a much larger image. If you're printing a small photo at postcard size, 2× is often enough. For a bigger print from a tiny image, 4×.&lt;/p&gt;

&lt;p&gt;There's a practical ceiling: a small photo gets a true 2× or 4×, but a very large photo is fitted to a size your device can realistically finish, and the page shows you that size before you download.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smoothing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep detail&lt;/strong&gt; leaves the image as the model produced it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light&lt;/strong&gt; and &lt;strong&gt;Strong&lt;/strong&gt; soften noise, which helps grainy night shots and old scans. Strong uses a second model, downloaded the first time you pick it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with Keep detail. Only add smoothing if you see grain or crunchy artefacts.&lt;/p&gt;

&lt;h2&gt;
  
  
  First run is slower, and why
&lt;/h2&gt;

&lt;p&gt;The first enlargement downloads the model (about 2.3 MB) and sets up the on-device runtime. The browser keeps both, so later images start almost immediately. If you're on a slow mobile connection, do your first run on Wi-Fi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical uses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Old family photos&lt;/strong&gt; for printing or framing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product photos&lt;/strong&gt; from a supplier that arrive too small for your online shop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thumbnails or screenshots&lt;/strong&gt; you need to use at a larger size in a presentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profile pictures&lt;/strong&gt; that look soft on modern high-resolution screens.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A computer is faster than a phone.&lt;/strong&gt; When a graphics chip is available, the page uses it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crop first.&lt;/strong&gt; Upscaling only the part you need is quicker and gives the model more of your device's budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't upscale twice.&lt;/strong&gt; Running 2× on a 2× result compounds the model's guesses. Go straight to 4× from the original.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For print,&lt;/strong&gt; a rough guide is 300 pixels per inch: a 6×4 inch print wants about 1800×1200 pixels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Privacy and network use
&lt;/h2&gt;

&lt;p&gt;The page downloads the model and runtime once and keeps them in the browser. Your photo itself, per the page, stays in the browser and the result goes straight to your downloads. As with every page on the site, there are Google ads.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Does my photo leave my device?&lt;/strong&gt;&lt;br&gt;
No, the page says the enlargement runs in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why was the first enlargement slow?&lt;/strong&gt;&lt;br&gt;
The model was downloading and initialising. After that, it's cached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will a big photo get a full 4×?&lt;/strong&gt;&lt;br&gt;
Not always. Very large images are fitted to what the device can handle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which browsers work?&lt;/strong&gt;&lt;br&gt;
Current Chrome, Edge, Firefox and Safari.&lt;/p&gt;

&lt;p&gt;Have a small photo worth saving? Give &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/upscale-image/" rel="noopener noreferrer"&gt;Upscale image&lt;/a&gt;&lt;/strong&gt; a try.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Play Minesweeper Online: How to Read the Numbers and Win</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Sun, 08 Nov 2026 08:39:48 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/play-minesweeper-online-how-to-read-the-numbers-and-win-21b9</link>
      <guid>https://dev.to/aryansbtloe/play-minesweeper-online-how-to-read-the-numbers-and-win-21b9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/play-minesweeper-online-how-to-read-the-numbers-and-win/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/play-minesweeper-online-how-to-read-the-numbers-and-win/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Minesweeper shipped with Windows for decades and quietly taught a generation of people logic, probability and right-clicking. It's still one of the best five-minute games there is. &lt;a href="https://bestlatestapps.com/tools/minesweeper/" rel="noopener noreferrer"&gt;Minesweeper&lt;/a&gt; brings back the classic boards with a few modern comforts: the first click is always safe, flagging works on phones, and best times are remembered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Choose a board size, or &lt;strong&gt;Custom&lt;/strong&gt;, and press &lt;strong&gt;New game&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open a cell. The first click clears a safe area.&lt;/li&gt;
&lt;li&gt;Flag mines with &lt;strong&gt;Flag mode&lt;/strong&gt;, a long press, a right-click, or F.&lt;/li&gt;
&lt;li&gt;Open every safe cell. The timer stops when the board is clear.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Board sizes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beginner:&lt;/strong&gt; 9×9, 10 mines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intermediate:&lt;/strong&gt; 16×16, 40 mines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expert:&lt;/strong&gt; 30×16, 99 mines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom:&lt;/strong&gt; from 5×5 up to 50×30, with your own mine count.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a narrow phone screen, a wide board rotates to fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the first click is safe
&lt;/h2&gt;

&lt;p&gt;Mines are placed after your first click, away from that cell and its neighbours, so you always start with an open area. No more losing in the first second on pure luck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading numbers
&lt;/h2&gt;

&lt;p&gt;A number tells you how many mines touch that cell, including diagonals. The core logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;1&lt;/strong&gt; with only one unopened neighbour: that neighbour is a mine.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;1&lt;/strong&gt; that already has a flagged neighbour: all its other neighbours are safe.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;1-2-1&lt;/strong&gt; pattern along a wall: mines are under the two 1s, not under the 2.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;1-2-2-1&lt;/strong&gt; pattern: mines are under the two 2s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learning those patterns is most of what separates beginners from fast players.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chording: the speed trick
&lt;/h2&gt;

&lt;p&gt;When the flags around a number match the number, click the number itself to open all its remaining neighbours in one go. Experienced players chord constantly; it's the difference between a 3-minute and a 1-minute expert game. Just make sure your flags are right, because a wrong flag means chording opens a mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phone:&lt;/strong&gt; turn on Flag mode and tap, or press and hold a cell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mouse:&lt;/strong&gt; left-click to open, right-click to flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard:&lt;/strong&gt; arrow keys to move, Space or Enter to open, F to flag.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The timer
&lt;/h2&gt;

&lt;p&gt;It starts on the first click and stops when you clear the board or hit a mine. It pauses while the tab is in the background, so a phone call doesn't ruin your time. Best times per board size are kept in this browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you have to guess
&lt;/h2&gt;

&lt;p&gt;Sometimes the logic genuinely runs out, often at the very end, with a 50/50 between two cells. Before guessing, count: do the remaining mines and unopened cells tell you anything? If not, guess where it opens the most information, usually a corner or edge cell far from the numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting faster
&lt;/h2&gt;

&lt;p&gt;Once the patterns are second nature, speed comes from fewer wasted clicks. Flag only the mines you need for chording, open cells in an order that follows the edge of the cleared area, and avoid moving the pointer back and forth across the board. Track your best times per size and aim to beat them by a few seconds at a time. Beginner under 10 seconds and expert under two minutes are good milestones for regular players.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;According to the page, everything runs on your device; best times stay in this browser and the current board stays in the tab. Google ads appear on the page, as on the rest of the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Which board sizes can I play?&lt;/strong&gt;&lt;br&gt;
Beginner, intermediate, expert and custom.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is the first click always safe?&lt;/strong&gt;&lt;br&gt;
Mines are placed after it, away from that cell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I flag on a phone?&lt;/strong&gt;&lt;br&gt;
Use Flag mode, or press and hold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the timer measure?&lt;/strong&gt;&lt;br&gt;
From the first click to clearing the board, paused when the tab is hidden.&lt;/p&gt;

&lt;p&gt;Five minutes free? Clear a board on &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/minesweeper/" rel="noopener noreferrer"&gt;Minesweeper&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>tutorial</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How Islamic Prayer Times Are Calculated (and Why Methods Differ)</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Sun, 08 Nov 2026 08:36:03 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-islamic-prayer-times-are-calculated-and-why-methods-differ-fp</link>
      <guid>https://dev.to/aryansbtloe/how-islamic-prayer-times-are-calculated-and-why-methods-differ-fp</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-islamic-prayer-times-are-calculated-and-why-methods-differ/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-islamic-prayer-times-are-calculated-and-why-methods-differ/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Prayer times shift every day and differ from city to city, and the apps that track them are often heavy with ads and permission requests. Travelling makes it harder: a new city, a different calculation convention, Ramadan timings to plan around. &lt;a href="https://bestlatestapps.com/tools/prayer-times/" rel="noopener noreferrer"&gt;Prayer times&lt;/a&gt; works out today's times for your location, counts down to the next prayer and builds a month's timetable you can print.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Type your city, or press &lt;strong&gt;Use my location&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check the calculation method and the Asr method, and change them to match your mosque.&lt;/li&gt;
&lt;li&gt;Read today's times, or open the month timetable and print it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How the times are calculated
&lt;/h2&gt;

&lt;p&gt;The times come from the Sun's position, computed with a precise astronomy library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dhuhr&lt;/strong&gt; is when the Sun crosses the meridian (solar noon).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maghrib&lt;/strong&gt; is at sunset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fajr&lt;/strong&gt; and &lt;strong&gt;Isha&lt;/strong&gt; are when the Sun is a set angle below the horizon, and that angle depends on the method. The Muslim World League uses 18° for Fajr and 17° for Isha; ISNA uses 15°; Umm al-Qura uses 18.5° for Fajr and Isha 90 minutes after Maghrib.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asr&lt;/strong&gt; is when an object's shadow equals its length plus its noon shadow (standard), or twice its length (Hanafi).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing a method
&lt;/h2&gt;

&lt;p&gt;Use the one your local mosque or community uses. The page picks a common default for your region: ISNA in North America, Umm al-Qura in Saudi Arabia, Karachi in India and Pakistan. You can change it any time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hanafi vs standard Asr&lt;/strong&gt; makes the biggest visible difference: Hanafi Asr starts later in the afternoon, sometimes by an hour or more depending on the season and latitude. Most communities in South Asia follow Hanafi.&lt;/p&gt;

&lt;h2&gt;
  
  
  When your mosque is a few minutes different
&lt;/h2&gt;

&lt;p&gt;That's normal. Mosques may use a different method, or add a few safety minutes to Fajr, Maghrib or Isha. Set their method here and allow for their adjustments. If your mosque publishes a timetable, compare a week against this one to see the offset.&lt;/p&gt;

&lt;h2&gt;
  
  
  The month timetable
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Month timetable&lt;/strong&gt;, press &lt;strong&gt;Show this month&lt;/strong&gt;, then &lt;strong&gt;Print&lt;/strong&gt;. Useful for Ramadan, when Fajr (suhoor) and Maghrib (iftar) times matter to the minute, for sticking on the fridge, or for an elderly family member who prefers paper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Travelling
&lt;/h2&gt;

&lt;p&gt;Search your destination city before you go and print its timetable. At high latitudes in summer (northern UK, Scandinavia, Canada), Fajr and Isha can be extreme or undefined because the Sun barely sets; communities there follow local rulings, so check with a local mosque.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bookmark it with your city&lt;/strong&gt; on your phone's home screen for one-tap access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Double-check after moving cities;&lt;/strong&gt; the method default may change with region.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For the Qibla direction,&lt;/strong&gt; the site also has a &lt;a href="https://bestlatestapps.com/tools/qibla-direction/" rel="noopener noreferrer"&gt;Qibla direction&lt;/a&gt; tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why calculations differ between apps
&lt;/h2&gt;

&lt;p&gt;Two apps showing different Fajr times for the same city usually aren't wrong; they're using different angles. The gap between 15° and 18° below the horizon can mean 15 to 25 minutes depending on the season and how far you are from the equator. Knowing which method a timetable uses explains most disagreements, and lets you match the one your community follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;According to the page, everything runs on your device; your location is used only in the page to calculate the times and is kept out of the link. City search uses a list bundled with the page. Google ads appear on the page, as on the rest of the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Which method should I use?&lt;/strong&gt;&lt;br&gt;
Your local mosque's. The page picks a regional default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hanafi vs standard Asr?&lt;/strong&gt;&lt;br&gt;
Hanafi starts when a shadow is twice an object's length, later than standard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do times differ from my mosque?&lt;/strong&gt;&lt;br&gt;
Different method or added safety minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I print a month?&lt;/strong&gt;&lt;br&gt;
Yes, from Month timetable.&lt;/p&gt;

&lt;p&gt;Keep today's times one tap away with &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/prayer-times/" rel="noopener noreferrer"&gt;Prayer times&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How to Calculate Exact Age in Years, Months and Days</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Sat, 07 Nov 2026 08:38:16 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-to-calculate-exact-age-in-years-months-and-days-c5j</link>
      <guid>https://dev.to/aryansbtloe/how-to-calculate-exact-age-in-years-months-and-days-c5j</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-to-calculate-exact-age-in-years-months-and-days/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-to-calculate-exact-age-in-years-months-and-days/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Government job and exam notifications in India love age limits: "21 to 32 years as on 1 August 2026". Miss the cut-off by a day and the application is rejected. Working out exact age by hand across months of different lengths is surprisingly error-prone. &lt;a href="https://bestlatestapps.com/tools/age-calculator/" rel="noopener noreferrer"&gt;Age calculator&lt;/a&gt; gives your precise age on any date you choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enter the birth date.&lt;/li&gt;
&lt;li&gt;Change the &lt;strong&gt;as of&lt;/strong&gt; date if you're not measuring from today. Today is the default.&lt;/li&gt;
&lt;li&gt;Read the age, the total days and the next birthday.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Checking eligibility for an exam or job
&lt;/h2&gt;

&lt;p&gt;Put your birth date first and the cut-off date from the notification as the as-of date. The result is your exact age on that day in years, months and days.&lt;/p&gt;

&lt;p&gt;Most forms want &lt;strong&gt;completed years&lt;/strong&gt;, so use the years figure. If the notice says "not more than 32 years" and you're 32 years, 3 months, check the wording; many notices mean "must not have turned 33", but some are stricter. When in doubt, the notice's own examples or FAQ section settle it. Category-based age relaxations (for reserved categories, ex-servicemen and so on) are added on top, and the notification lists them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the calculation works
&lt;/h2&gt;

&lt;p&gt;Years and months are counted in calendar months, not an average month length. If the day of the month hasn't arrived yet, the month count steps back by one. Total days are the exact number of midnights between the two dates.&lt;/p&gt;

&lt;p&gt;February 29 uses the calendar's real date, so someone born on a leap day gets correct results in non-leap years too.&lt;/p&gt;

&lt;p&gt;Time of day isn't considered; both dates are whole days. If the as-of date is before the birth date, the page asks you to swap them instead of showing a negative age.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other ways to see it
&lt;/h2&gt;

&lt;p&gt;The result also lists age in months and days, in weeks and days, total days, and an approximate number of hours. Fun for a birthday card ("10,000 days old!"), useful for paediatric milestones measured in weeks or months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Birth date: 14 March 1995. A notification's cut-off: 1 August 2026. The calculator shows 31 years, 4 months, 18 days. For an upper limit of 32, you're eligible. For a limit of 30 with a 3-year relaxation, also eligible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other uses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;School admissions:&lt;/strong&gt; many boards set a minimum age as of a specific date for Class 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retirement planning:&lt;/strong&gt; exact age on a target date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insurance and pension forms&lt;/strong&gt; asking for age on the proposal date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next birthday:&lt;/strong&gt; shows the date and how far away it is, which helps plan surprises.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Double-check the date format when entering: day and month swapped is the most common slip.&lt;/li&gt;
&lt;li&gt;Use the date on your official documents (birth certificate, Class 10 certificate), which is what recruiters verify.&lt;/li&gt;
&lt;li&gt;Save a screenshot of the result alongside the notification for your records.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why manual calculations go wrong
&lt;/h2&gt;

&lt;p&gt;Counting on fingers usually breaks on months of different lengths and on whether the birthday has already passed in the cut-off year. Someone born on 31 January has a tricky "one month later" in February. The calculator follows the calendar strictly, which is also how recruitment boards compute age, so its answer matches what the board will check. It also avoids the common slip of using the application date instead of the cut-off date in the notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;The page says the dates stay in the tab and aren't uploaded. Google ads run on the page, as on the rest of the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Is this the age a form will accept?&lt;/strong&gt;&lt;br&gt;
Most forms want completed years; use that figure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the as-of date is earlier than the birth date?&lt;/strong&gt;&lt;br&gt;
You'll be asked to swap them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it consider time of day?&lt;/strong&gt;&lt;br&gt;
No, whole days only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I see age in weeks?&lt;/strong&gt;&lt;br&gt;
Yes, along with months, days and hours.&lt;/p&gt;

&lt;p&gt;Check eligibility before you apply with &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/age-calculator/" rel="noopener noreferrer"&gt;Age calculator&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How to Test Your Internet Speed (and What the Numbers Mean)</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Sat, 07 Nov 2026 08:37:36 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-to-test-your-internet-speed-and-what-the-numbers-mean-2p6</link>
      <guid>https://dev.to/aryansbtloe/how-to-test-your-internet-speed-and-what-the-numbers-mean-2p6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-to-test-your-internet-speed-and-what-the-numbers-mean/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-to-test-your-internet-speed-and-what-the-numbers-mean/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"The internet is slow" is the start of most household arguments and most calls to an ISP. Before either, get numbers. &lt;a href="https://bestlatestapps.com/tools/internet-speed-test/" rel="noopener noreferrer"&gt;Internet speed test&lt;/a&gt; measures download, upload and latency with real transfers to Cloudflare, and it's specific about exactly what it sends.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it talks to
&lt;/h2&gt;

&lt;p&gt;Unlike tools on this site that work entirely in the tab, a speed test has to move data over the network:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Downloads&lt;/strong&gt; come from &lt;code&gt;speed.cloudflare.com/__down&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uploads&lt;/strong&gt; go to &lt;code&gt;speed.cloudflare.com/__up&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The upload data is &lt;strong&gt;random bytes generated in your browser&lt;/strong&gt; with &lt;code&gt;crypto.getRandomValues&lt;/code&gt;. It contains no file, no page content and no identifier from your device.&lt;/li&gt;
&lt;li&gt;If Cloudflare's reply names the edge location, the page shows that code and its city.&lt;/li&gt;
&lt;li&gt;The result stays on the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;strong&gt;Start test&lt;/strong&gt; and keep the tab in front.&lt;/li&gt;
&lt;li&gt;Watch download, upload and latency fill in as each transfer finishes.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Stop&lt;/strong&gt; to end early if you need to.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The three numbers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Latency&lt;/strong&gt; is measured with several small downloads; the page reports the middle (median) value, so one slow request doesn't skew it. It's what matters most for video calls and gaming: under about 30 ms feels instant, 100 ms and up becomes noticeable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt; comes from larger transfers. It's what matters for streaming, downloads and browsing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upload&lt;/strong&gt; comes from sending the random bytes. It matters for video calls (your camera), cloud backups and posting videos. Many home plans have much slower upload than download, so don't panic if it's lower.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting a reading you can trust
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test on a cable, then on Wi-Fi.&lt;/strong&gt; If the cable is fast and Wi-Fi is slow, the problem is the Wi-Fi, not the ISP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stand near the router for a baseline,&lt;/strong&gt; then test from the room where things feel slow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pause other heavy use:&lt;/strong&gt; downloads, cloud backups, someone streaming in 4K.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test at different times.&lt;/strong&gt; Evening congestion is real on many networks. Three readings across a day tell you more than one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the tab in front.&lt;/strong&gt; Browsers throttle background tabs, which skews results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restart the router&lt;/strong&gt; if numbers are far below your plan, then test again.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Interpreting the result
&lt;/h2&gt;

&lt;p&gt;Compare with your plan's advertised speed. Getting 80–90% of the plan on a cable is normal; plans are sold as "up to". Wi-Fi typically gets less, sometimes much less on older routers or through walls. If you consistently get far under the plan on a cable at different times of day, that's the evidence your ISP's support line will ask for. Screenshot it with the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one test may differ from another
&lt;/h2&gt;

&lt;p&gt;Different speed tests use different servers, different numbers of parallel connections and different durations, so their numbers rarely match exactly. This one uses Cloudflare's network, which has locations in many cities, so it's a good approximation of real-world performance to popular websites. Compare like with like: use the same test when tracking a problem over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;To be precise: the test sends random bytes to Cloudflare and downloads test data from Cloudflare; nothing from your device is in the upload. The page also displays Google ads, as across the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What does it measure?&lt;/strong&gt;&lt;br&gt;
Download, upload and latency, from real transfers with Cloudflare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does it send?&lt;/strong&gt;&lt;br&gt;
Random bytes generated in your browser, to speed.cloudflare.com/__up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which server does it use?&lt;/strong&gt;&lt;br&gt;
Cloudflare's speed endpoint; the page shows the edge city when available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I stop a test?&lt;/strong&gt;&lt;br&gt;
Yes, Stop ends the current transfer.&lt;/p&gt;

&lt;p&gt;Before you call your ISP, run &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/internet-speed-test/" rel="noopener noreferrer"&gt;Internet speed test&lt;/a&gt;&lt;/strong&gt; a few times.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How to Convert CSV to Excel (and Keep Leading Zeros and Numbers Intact)</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Sat, 07 Nov 2026 08:36:54 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-to-convert-csv-to-excel-and-keep-leading-zeros-and-numbers-intact-2bhg</link>
      <guid>https://dev.to/aryansbtloe/how-to-convert-csv-to-excel-and-keep-leading-zeros-and-numbers-intact-2bhg</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-to-convert-csv-to-excel-and-keep-leading-zeros-and-numbers/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-to-convert-csv-to-excel-and-keep-leading-zeros-and-numbers/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Open a CSV of customer data in Excel and watch it "help": PIN code 040001 becomes 40001, a 16-digit card reference turns into 4.53E+15, and a product code like 1-12 becomes 12 January. Every operations person has a story. &lt;a href="https://bestlatestapps.com/tools/csv-to-excel/" rel="noopener noreferrer"&gt;CSV to Excel&lt;/a&gt; builds a proper .xlsx where numbers are numbers and everything that should stay text stays text. It also goes the other way, from a workbook sheet back to CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open a CSV or .xlsx file, or paste CSV text.&lt;/li&gt;
&lt;li&gt;For a CSV, set the sheet name. For a workbook with several sheets, choose one.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Download .xlsx&lt;/strong&gt; or &lt;strong&gt;Download CSV&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What it does differently from double-clicking a CSV
&lt;/h2&gt;

&lt;p&gt;The download is a genuine Office Open XML workbook, a ZIP of SpreadsheetML that Excel, Google Sheets and LibreOffice all open. The conversion is careful about types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plain numbers become numbers&lt;/strong&gt;, so SUM and sorting work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leading zeros are kept.&lt;/strong&gt; Postcodes, PIN codes, employee IDs and phone numbers starting with 0 arrive intact, stored as text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long numbers that aren't safe as numbers stay text&lt;/strong&gt;, so account numbers and IDs keep every digit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything starting with &lt;code&gt;=&lt;/code&gt; stays text.&lt;/strong&gt; That blocks CSV formula injection, where a malicious cell like &lt;code&gt;=HYPERLINK(...)&lt;/code&gt; would otherwise run when opened.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Going from .xlsx to CSV
&lt;/h2&gt;

&lt;p&gt;Drop an .xlsx or .xlsm file and the page reads every sheet. Pick one and download it as CSV. Dates that Excel stored with a date format come out as YYYY-MM-DD, the least ambiguous way to write a date. A number without a date format stays a number.&lt;/p&gt;

&lt;p&gt;Old binary .xls files from Excel 2003 are a different format entirely. Save them as .xlsx in Excel or LibreOffice first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: a CRM export
&lt;/h2&gt;

&lt;p&gt;Your CRM exports 8,000 leads as CSV: name, phone (with leading 0s), PIN code, a 14-digit lead ID, and a created date. Converted here, the phone and PIN keep their zeros, the lead ID keeps all 14 digits, and a sales manager can open the .xlsx and sort or filter without anyone re-entering data. When you need to re-import an edited sheet into another system, convert it back to CSV here so the importer gets clean, predictable values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An Excel sheet holds up to 1,048,576 rows. Bigger files need splitting or a database.&lt;/li&gt;
&lt;li&gt;If a column should be numeric but contains stray text (like "N/A"), Excel will treat those cells as text. Clean them first.&lt;/li&gt;
&lt;li&gt;For CSVs with semicolons as separators (common in European exports), check the preview to make sure columns split correctly.&lt;/li&gt;
&lt;li&gt;Name the sheet meaningfully. "Leads_Oct2026" beats "Sheet1" when the file gets forwarded around.&lt;/li&gt;
&lt;li&gt;For contacts specifically, &lt;a href="https://bestlatestapps.com/tools/vcf-to-csv/" rel="noopener noreferrer"&gt;VCF to CSV&lt;/a&gt; handles phone address-book formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Excel mangles CSVs in the first place
&lt;/h2&gt;

&lt;p&gt;A CSV has no types: every cell is just text between commas. When Excel opens one directly, it guesses each cell's type, and its guesses favour numbers and dates. So 040001 looks like a number (drop the zero), 4530123456789012 looks like a big number (switch to scientific notation and lose the last digits), and 1-12 looks like a date. Building the workbook deliberately, with types decided per cell, sidesteps the guessing entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;According to the page, the workbook is built in the tab and cleared when you close it, which is reassuring for exports full of customer phone numbers. Google ads appear on the page, as across the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Will Excel open it?&lt;/strong&gt;&lt;br&gt;
Yes, it's a standard .xlsx that Excel, Sheets and LibreOffice open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is a phone number stored as text?&lt;/strong&gt;&lt;br&gt;
So leading zeros and long digit strings survive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I convert several sheets?&lt;/strong&gt;&lt;br&gt;
Pick one sheet at a time from the workbook and download it as CSV.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is .xls supported?&lt;/strong&gt;&lt;br&gt;
Re-save it as .xlsx first.&lt;/p&gt;

&lt;p&gt;Before the next CSV loses its zeros, run it through &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/csv-to-excel/" rel="noopener noreferrer"&gt;CSV to Excel&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Cut an MP3 and Make a Ringtone in Your Browser</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Fri, 06 Nov 2026 08:42:14 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/how-to-cut-an-mp3-and-make-a-ringtone-in-your-browser-49fc</link>
      <guid>https://dev.to/aryansbtloe/how-to-cut-an-mp3-and-make-a-ringtone-in-your-browser-49fc</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/how-to-cut-an-mp3-and-make-a-ringtone-in-your-browser/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/how-to-cut-an-mp3-and-make-a-ringtone-in-your-browser/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The best 25 seconds of a song make a great ringtone; the other three and a half minutes don't. Or you've recorded a voice note for a class, and there's an awkward "um, wait" in the middle. &lt;a href="https://bestlatestapps.com/tools/mp3-cutter/" rel="noopener noreferrer"&gt;MP3 cutter&lt;/a&gt; shows the audio as a waveform, lets you drag handles to pick a section, and saves exactly the part you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open an audio file. MP3, M4A/AAC, WAV and OGG work in all current browsers; FLAC and WebM work in most.&lt;/li&gt;
&lt;li&gt;Drag the start and end handles on the waveform, or type exact times.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Play selection&lt;/strong&gt; to hear it.&lt;/li&gt;
&lt;li&gt;Set fades and the output format (MP3 or WAV).&lt;/li&gt;
&lt;li&gt;Save and download.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Keep a part, or remove a part
&lt;/h2&gt;

&lt;p&gt;There are two modes, and the second is the one people don't expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep selection&lt;/strong&gt; saves only what's between the handles: a ringtone, a clip for a video, a podcast snippet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove selection&lt;/strong&gt; cuts out what's between the handles and joins the rest with a short crossfade. A cough, a mistake or a long pause vanishes without an audible click at the join.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fades
&lt;/h2&gt;

&lt;p&gt;A clip that starts or ends abruptly sounds cheap, especially a ringtone that cuts in mid-note. A short fade in and fade out smooths the edges. Half a second to a second is usually enough for a ringtone; for speech, a very short fade just avoids clicks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quality
&lt;/h2&gt;

&lt;p&gt;The selected audio is decoded and re-encoded at the bitrate you pick. 192 kbps suits music; 128 kbps is plenty for speech. At 192 kbps and above, the difference from a typical MP3 is very hard to hear. Choose WAV if you'll keep editing the clip elsewhere and don't want another round of compression.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a ringtone
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the song and find the hook. Zoom in on the waveform; the loud chorus is usually easy to spot.&lt;/li&gt;
&lt;li&gt;Select up to 30 seconds.&lt;/li&gt;
&lt;li&gt;Add a short fade in and out.&lt;/li&gt;
&lt;li&gt;Save as MP3.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Android phones accept an MP3 directly as a ringtone. On iPhone, ringtones are added through GarageBand or a Mac, so you'll take the file there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other common uses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trimming WhatsApp voice notes&lt;/strong&gt; before forwarding them to a group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cutting the silence&lt;/strong&gt; from the start of a recorded lecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making an audio clip for an Instagram reel&lt;/strong&gt; that starts exactly on the beat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Removing a stumble&lt;/strong&gt; from a voice-over for a presentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need to record the audio first, the &lt;a href="https://bestlatestapps.com/tools/voice-recorder/" rel="noopener noreferrer"&gt;Online voice recorder&lt;/a&gt; pairs well. For audio that's inside a video, extract it with &lt;a href="https://bestlatestapps.com/tools/video-to-mp3/" rel="noopener noreferrer"&gt;Video to MP3&lt;/a&gt; and then trim here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Type exact times when you need precision. Dragging handles on a phone is fiddly.&lt;/li&gt;
&lt;li&gt;Listen to the selection twice before saving: once for the start, once for the end.&lt;/li&gt;
&lt;li&gt;Only use songs you have the right to use for anything public.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Finding the exact spot
&lt;/h2&gt;

&lt;p&gt;The waveform is your friend. Speech shows as clusters with flat gaps between sentences, so cut inside a gap rather than mid-word. Music shows loud and quiet passages; a chorus usually stands out as a denser block. Play the selection, nudge a handle, play again. Two or three rounds usually lands it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;According to the page, the file is decoded and encoded in the browser and saved straight to your downloads. There are Google ads on the page, as elsewhere on the site.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;How long should a ringtone be?&lt;/strong&gt;&lt;br&gt;
Up to 30 seconds, with short fades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does cutting reduce quality?&lt;/strong&gt;&lt;br&gt;
It re-encodes, but at 192 kbps or more it's very hard to hear the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I remove something from the middle?&lt;/strong&gt;&lt;br&gt;
Yes, use Remove selection; the two sides are crossfaded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which formats can I open?&lt;/strong&gt;&lt;br&gt;
Anything your browser can play.&lt;/p&gt;

&lt;p&gt;Got a song or recording to trim? Open &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/mp3-cutter/" rel="noopener noreferrer"&gt;MP3 cutter&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>tools</category>
    </item>
    <item>
      <title>Why Your Universal Links Open Safari: Validating the apple-app-site-association File</title>
      <dc:creator>Alok Singh</dc:creator>
      <pubDate>Fri, 06 Nov 2026 08:41:34 +0000</pubDate>
      <link>https://dev.to/aryansbtloe/why-your-universal-links-open-safari-validating-the-apple-app-site-association-file-393c</link>
      <guid>https://dev.to/aryansbtloe/why-your-universal-links-open-safari-validating-the-apple-app-site-association-file-393c</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://bestlatestapps.com/blog/why-your-universal-links-open-safari-validating-the-apple-app/" rel="noopener noreferrer"&gt;https://bestlatestapps.com/blog/why-your-universal-links-open-safari-validating-the-apple-app/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Universal links are one of those iOS features that either work perfectly or fail silently. Tap a link, Safari opens instead of your app, and there's no error anywhere. An afternoon can disappear into something as small as a missing Team ID prefix or a redirect from the bare domain to &lt;a href="http://www" rel="noopener noreferrer"&gt;www&lt;/a&gt;. &lt;a href="https://bestlatestapps.com/tools/aasa-validator/" rel="noopener noreferrer"&gt;AASA validator&lt;/a&gt; checks the file's structure, explains each rule, tests URLs against your rules, and walks through the hosting checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it checks in the file
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Valid JSON&lt;/strong&gt; (no comments, no trailing commas, no byte-order mark, no curly quotes pasted from a doc).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size:&lt;/strong&gt; at most 128 KB uncompressed, Apple's limit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App IDs&lt;/strong&gt; written as &lt;code&gt;&amp;lt;Team ID&amp;gt;.&amp;lt;bundle ID&amp;gt;&lt;/code&gt;. The prefix is almost always your 10-character uppercase Team ID. A bare bundle ID never matches; this is the single most common mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;components&lt;/strong&gt; entries only use keys Apple defines (&lt;code&gt;/&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;#&lt;/code&gt;, &lt;code&gt;exclude&lt;/code&gt;, &lt;code&gt;comment&lt;/code&gt;, &lt;code&gt;caseSensitive&lt;/code&gt;, &lt;code&gt;percentEncoded&lt;/code&gt;), and &lt;code&gt;exclude&lt;/code&gt; is a real boolean, not the string &lt;code&gt;"true"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Structural problems such as an app listed in two &lt;code&gt;details&lt;/code&gt; entries, empty &lt;code&gt;apps&lt;/code&gt; arrays in &lt;code&gt;webcredentials&lt;/code&gt; or &lt;code&gt;appclips&lt;/code&gt;, or a catch-all &lt;code&gt;{"/": "*"}&lt;/code&gt; that makes every rule after it unreachable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A signed (PKCS#7) file&lt;/strong&gt;, which iOS hasn't accepted since iOS 9.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML instead of JSON&lt;/strong&gt;, the telltale sign your server returned a 404, a login page or a redirect page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing URLs
&lt;/h2&gt;

&lt;p&gt;Paste URLs and the tool shows which rule matches first and whether your app would open. The model follows Apple's documented behaviour: for each app, iOS walks &lt;code&gt;components&lt;/code&gt; from top to bottom and stops at the first entry whose path, query and fragment patterns all match. If that entry has &lt;code&gt;"exclude": true&lt;/code&gt;, the browser opens; otherwise the app does. No match means the browser.&lt;/p&gt;

&lt;p&gt;Pattern syntax: &lt;code&gt;*&lt;/code&gt; matches any run of characters, &lt;code&gt;?&lt;/code&gt; exactly one, and &lt;code&gt;?*&lt;/code&gt; at least one. A &lt;code&gt;?&lt;/code&gt; key holding an object matches named query parameters.&lt;/p&gt;

&lt;p&gt;This is a model, not a device test. Confirm on a real device under Settings → Developer → Universal Links → Diagnostics (with Developer Mode on).&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting: where most failures really are
&lt;/h2&gt;

&lt;p&gt;The file has to be served:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;at &lt;code&gt;https://&amp;lt;domain&amp;gt;/.well-known/apple-app-site-association&lt;/code&gt;, &lt;strong&gt;no extension&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;over HTTPS with a valid certificate;&lt;/li&gt;
&lt;li&gt;with &lt;strong&gt;status 200 and no redirect&lt;/strong&gt;, on every domain and subdomain you list (Apple doesn't follow redirects, so &lt;code&gt;example.com&lt;/code&gt; → &lt;code&gt;www.example.com&lt;/code&gt; breaks it);&lt;/li&gt;
&lt;li&gt;as &lt;code&gt;application/json&lt;/code&gt;, unsigned;&lt;/li&gt;
&lt;li&gt;with no login, firewall rule or bot protection in front of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one bites people using aggressive bot protection: Apple's servers get challenged and never see the file. The page gives you curl commands to check both your server and what Apple's CDN currently holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apple's CDN
&lt;/h2&gt;

&lt;p&gt;Since iOS 14 and macOS 11, devices fetch the file from Apple's CDN, not your server. The CDN picks up changes within about 24 hours; devices fetch it at install and check roughly weekly. There's no purge button. On a development device, &lt;code&gt;?mode=developer&lt;/code&gt; in the associated domain entitlement bypasses the CDN while you test.&lt;/p&gt;

&lt;h2&gt;
  
  
  components or paths?
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;components&lt;/code&gt; for iOS 13 and later; it matches path, query and fragment separately and makes exclusions explicit. The older &lt;code&gt;paths&lt;/code&gt; array with &lt;code&gt;NOT&lt;/code&gt; prefixes still works. Pick one format per &lt;code&gt;details&lt;/code&gt; entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;The page says the checks run in your browser and its code doesn't send your file or domain anywhere. Like the rest of the site, the page shows Google ads.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Why do my links open Safari?&lt;/strong&gt;&lt;br&gt;
Wrong or missing Team ID prefix, a redirect or bot protection on the file, a stale CDN copy, an earlier rule or exclude matching first, or typing the URL straight into Safari's address bar (which never opens the app).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the file need a .json extension?&lt;/strong&gt;&lt;br&gt;
No. No extension, served as JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I clear Apple's CDN?&lt;/strong&gt;&lt;br&gt;
You can't. Wait, or use developer mode on a test device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the URL test definitive?&lt;/strong&gt;&lt;br&gt;
No, it's a model of Apple's rules. Check Diagnostics on a device.&lt;/p&gt;

&lt;p&gt;Before you blame iOS, run your file through &lt;strong&gt;&lt;a href="https://bestlatestapps.com/tools/aasa-validator/" rel="noopener noreferrer"&gt;AASA validator&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Alok Kumar Singh&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
