2026-01-17 11:09:43
Welcome to part 3 of our JSON to Excel series! So far, we've covered the introduction to JSON to Excel and the Web App. Today, we're exploring the Excel Add-in - the perfect solution for users who spend their days working in Excel and want to convert JSON data without leaving their familiar environment.
The JSON to Excel Excel Add-in is designed for power users who live in Excel. Here's why it might be the perfect choice for you:
Documentation: https://json-to-excel.wtsolutions.cn/
Before installing, ensure your system meets these requirements:
That's it! The add-in is now ready to use.
For visual learners, check out this installation guide:
Once installed, using the add-in is straightforward:
Watch this step-by-step usage guide:
One of the most powerful features of the Excel Add-in is batch processing. Instead of converting files one at a time, you can:
This is perfect when you have:
The Excel Add-in supports the same powerful conversion options as the Web App:
Choose how nested properties are named:
user.name
user_name
user/name
Control how deep nested objects are processed:
You're working with an API that returns JSON data about sales:
[
{
"id": 1,
"product": "Widget A",
"sales": 150,
"region": "North"
},
{
"id": 2,
"product": "Widget B",
"sales": 200,
"region": "South"
}
]
Steps:
You have customer data with nested contact information:
[
{
"customerId": "C001",
"name": "John Doe",
"contact": {
"email": "[email protected]",
"phone": "555-1234",
"address": {
"street": "123 Main St",
"city": "New York",
"zip": "10001"
}
}
}
]
Steps:
customerId, name, contact.email, contact.phone, contact.address.street, contact.address.city, contact.address.zip
You receive daily sales reports as JSON files. Instead of opening each file separately:
After installation, you can access the add-in quickly:
Keep these limitations in mind:
Choose the Excel Add-in when:
Choose the Web App when:
Now that you're comfortable with the Excel Add-in, you might be interested in exploring other integration options. In our next post, we'll cover the WPS Add-in for users who prefer WPS Office over Microsoft Excel.
Ready to install the Excel Add-in? Open Excel and search for "JSON to Excel" in the Add-ins store today!
2026-01-17 11:08:59
A few weeks ago, I introduced MdBin—a free utility for sharing beautifully rendered markdown. The response was incredible, and people were using it exactly how I'd hoped: sharing LLM outputs, documentation snippets, and formatted notes without the friction of paywalls or mangled formatting.
But here's the thing about building in public: you never stop iterating.
Today I'm excited to share a significant upgrade under the hood—migrating from a custom markdown-it + Shiki pipeline to Streamdown, Vercel's new drop-in replacement for react-markdown.
My original implementation was solid. I used markdown-it-async with @shikijs/markdown-it for syntax highlighting:
import { fromAsyncCodeToHtml } from '@shikijs/markdown-it/async'
import MarkdownItAsync from 'markdown-it-async'
import { codeToHtml } from 'shiki'
const md = MarkdownItAsync({
html: true,
xhtmlOut: true,
linkify: true,
typographer: true,
breaks: true,
})
md.use(
fromAsyncCodeToHtml(codeToHtml, {
themes: {
light: 'github-light',
dark: 'github-dark',
},
defaultColor: false,
cssVariablePrefix: '--shiki-',
})
)
export async function renderMarkdown(content: string): Promise<string> {
const html = await md.renderAsync(content)
return html
}
Then in my page component, I'd render with the classic dangerouslySetInnerHTML:
<article
className="markdown-content"
dangerouslySetInnerHTML={{ __html: renderedContent }}
/>
This approach had several drawbacks:
dangerouslySetInnerHTML is exactly what it sounds likeWhen I discovered Streamdown, I initially dismissed it. "It's for AI streaming," I thought. "MdBin renders static content SSR."
But then I looked closer at the feature set:
rehype-harden
Wait. This is exactly what a markdown sharing tool needs.
Here's what the new implementation looks like:
import { Streamdown } from 'streamdown'
export default async function PastePage({ params }) {
const { id } = await params
const { decompressedContent, createdAt } = await cachedGetPaste(id)
return (
<Streamdown
className="markdown-content"
parseIncompleteMarkdown
shikiTheme={['github-light', 'github-dark']}
mode="streaming"
isAnimating={false}
controls={{
table: true,
code: true,
mermaid: {
download: true,
copy: true,
fullscreen: true,
panZoom: true,
},
}}
>
{decompressedContent}
</Streamdown>
)
}
That's it. No separate render function. No dangerouslySetInnerHTML. No manual security sanitization.
The Tailwind setup is one line in globals.css:
@source "../../node_modules/streamdown/dist/index.js";
The timing couldn't have been better. Streamdown just shipped v2.0.0 with some massive improvements:
This was the big one. Previously, bundling all those Shiki language grammars and themes bloated your build. Now, language-specific highlighting and KaTeX CSS are loaded from their CDN on-demand.
Your build stays lean. Users only fetch what they need.
This was a blocker for me before. Mermaid diagrams in markdown are incredibly useful—flowcharts, sequence diagrams, architecture docs—but SSR rendering was broken. Now it works beautifully, with viewport-based lazy loading that prevents page freezing when you have multiple diagrams.
rehype-harden + rehype-sanitize means I don't have to worry about XSS attacks from malicious markdown. The component handles sanitization automatically.
All those controls I would have had to build myself? Built-in:
| Feature | Before | After |
|---|---|---|
| Security | Manual with dangerouslySetInnerHTML
|
Built-in rehype-harden
|
| Code copy | Custom CopyButton component |
✅ Built-in |
| Mermaid SSR | ❌ Broken | ✅ Works |
| Table download | ❌ Not implemented | ✅ Built-in |
| Math rendering | ❌ Not implemented | ✅ KaTeX built-in |
| Bundle size | Growing with each language | CDN-loaded on demand |
| Incomplete markdown | Could break render | Graceful handling |
You might wonder: "Why use a streaming-optimized library for static content?"
Fair question. The mode="streaming" and isAnimating={false} props tell Streamdown this is pre-rendered content—no typing effects, no progressive reveal. But all the other benefits still apply:
parseIncompleteMarkdown: Handles edge cases where users paste malformed markdown (unclosed code blocks, incomplete tables). Instead of crashing or showing garbage, it renders gracefully.The Streamdown team has done an incredible job packaging what could have been a complex, multi-library setup into a single, well-designed component. It powers their AI Elements Message component, but it's genuinely useful for any markdown rendering use case.
The documentation is solid, the defaults are sensible, and it just works.
Head over to mdbin.sivaramp.com and paste some markdown. Try:
Here's a quick Mermaid example to paste:
graph TD
A[Paste Markdown] --> B[Streamdown Renders]
B --> C{What type?}
C -->|Code| D[Shiki Highlighting]
C -->|Diagram| E[Mermaid SVG]
C -->|Math| F[KaTeX Render]
D --> G[Beautiful Output]
E --> G
F --> G
With the rendering layer now handled by Streamdown, I can focus on features users actually want:
The foundation is solid. Now it's time to build.
TL;DR: Migrated MdBin from markdown-it + Shiki to Vercel's Streamdown. Got built-in code copy, Mermaid rendering (that actually works SSR!), math support, enhanced security, and a 98% smaller bundle—all from one component. The Vercel team knocked it out of the park with this one.
Check out the upgrade at mdbin.sivaramp.com and the Streamdown repo.
2026-01-17 11:05:48
Welcome back to our JSON to Excel series! In our previous post, we introduced the JSON to Excel toolkit and its various components. Today, we're diving into the quickest and easiest way to convert JSON to Excel: the Web App.
The JSON to Excel Web App is perfect when you need to convert JSON files quickly without installing any software. Here's why it's ideal:
Simply open your web browser (Chrome, Firefox, Safari, Edge, or any modern browser) and navigate to:
https://s.wtsolutions.cn/json-to-excel.html
That's it! No registration, no login, no installation. The app loads instantly and you're ready to go.
You have three ways to load your JSON data:
The simplest method - just copy your JSON data and paste it directly into the text area provided. You'll see a live preview of your JSON below the text area, so you can verify the data before conversion.
Click the "Load JSON File(s)" button to select JSON files from your computer. With the Pro version, you can load up to 20 files at once for batch processing. Each file will be converted to a separate sheet in your Excel file.
For Pro users, you can also load JSON files directly from web URLs. This is perfect when you have JSON data hosted online and want to convert it without downloading first. You can load up to 20 URLs at once.
Before converting, you can customize the conversion settings:
Choose between:
When using Nested JSON Mode, you can choose how nested properties are separated:
user.name
user_name
user__name
user/name
Control how deep the converter processes nested objects:
Once your settings are configured, click the "Go" button and watch the magic happen!
After conversion, you'll see:
Let's walk through converting a simple JSON array:
[
{
"id": 1,
"name": "John Doe",
"email": "[email protected]",
"age": 30
},
{
"id": 2,
"name": "Jane Smith",
"email": "[email protected]",
"age": 25
}
]
Steps:
That's it! You now have an Excel file with your JSON data perfectly formatted.
The Web App includes a JSON preview that helps you verify your data is properly formatted before conversion. Look out for:
If your JSON has nested objects, use "Nested JSON Mode" for better results. For example:
[
{
"name": "John",
"contact": {
"email": "[email protected]",
"phone": "123-456-7890"
}
}
]
With Nested JSON Mode and dot delimiter, this becomes:
| name | contact.email | contact.phone |
|------|----------------|---------------|
| John | [email protected] | 123-456-7890 |
For multiple JSON files:
The Web App has some limitations:
The free version is perfect for occasional use with simple JSON structures. Consider upgrading to Pro if you:
Now that you've mastered the Web App, you might be wondering about other ways to use JSON to Excel. In our next post, we'll explore the Excel Add-in, which provides seamless integration directly within Excel - perfect for users who work in Excel all day.
Ready to try the Web App? Visit https://s.wtsolutions.cn/json-to-excel.html and start converting your JSON files today!
2026-01-17 11:03:31
Vulnerability ID: GHSA-GW32-9RMW-QWWW
CVSS Score: 8.4
Published: 2026-01-16
A high-severity Cross-Site Scripting (XSS) vulnerability exists in Svelte's Server-Side Rendering (SSR) compiler. Due to improper escaping of bind:value directives on <textarea> elements, attackers can break out of the HTML tag context and execute arbitrary JavaScript.
Svelte's SSR compiler forgot that <textarea> contents are children, not attributes. It didn't escape bind:value content during server-side rendering. Attackers can inject </textarea> to close the tag early and run scripts. Fixed in 3.59.2.
3.59.2)fix: escape textarea children during SSR
@@ -149,7 +149,7 @@ export default function (node: Element, renderer: Renderer, options: RenderOptio
// value = name === 'textContent' ? x`@escape($$value)` : x`$$value`;
} else if (binding.name === 'value' && node.name === 'textarea') {
const snippet = expression.node;
- node_contents = x`${snippet} || ""`;
+ node_contents = x`@escape(${snippet} || "")`;
} else if (binding.name === 'value' && node.name === 'select') {
bind:value on textareas with untrusted input in SSR mode if patching is impossible.Remediation Steps:
package.json for svelte version.npm install svelte@latest or yarn upgrade svelte.npm list svelte.Read the full report for GHSA-GW32-9RMW-QWWW on our website for more details including interactive diagrams and full exploit analysis.
2026-01-17 10:43:58
For my latest programming assignment from Codecademy, I decided to build a Terminal-Blackjack game. I chose this project because I wanted to practice translating real-world rules (like the complex logic of an Ace being either 1 or 11) into clean, functional Python code.
My goal was to create a game that felt interactive and "smart" enough to play against a dealer, all within a simple text-based interface.
Here is a look at the gameplay loop, showing the deck shuffling, the deal, and the logic behind hitting and standing:
This project was a great way to dive deeper into Python's core features. Here are a few technical highlights from the build:
random module. This replicates a real deck being mixed before it is dealt.while loop that keeps the "Hit or Stand" phase active until the player either stops or "busts" (goes over 21).You can explore the full logic, including how I handled the dealer's AI and the game flow, on my GitHub:
View Terminal-Blackjack on GitHub
Building this game taught me that the hardest part of coding isn't just writing syntax, it's planning for every possible user decision. Seeing the logic come together to successfully crown a winner (or bust a player!) was incredibly satisfying.
I'm looking forward to adding more features, like a save feature or a "shoe" to support multiple decks, in the future!