Total Pageviews

Friday, 31 October 2025

美中贸易从对抗走向试探性缓和

 

过去半年来,美中关税战时而升级时而平稳,但关税、出口管制与供应链围堵依旧让全球市场风声鹤唳。

日前,美中于马来西亚吉隆坡举行第五轮关税谈判,则回到“可对话的现实”层面,聚焦关税、稀土出口、大豆采购与科技企业股权问题,显示双方试图在“竞争中维持接触”,不愿让经贸对抗全面拖垮两国的经济动能。

谈判密集、节奏谨慎

双方代表团在吉隆坡连续闭门磋商两日,没有发表联合声明,而是各自表述。美方形容会谈“非常具有建设性”,中方则称“达成若干共识并建立框架”。

这种“低调但务实”的节奏,与2019年川普1.0贸易战在华盛顿及上海谈判时的高调姿态形成鲜明对比。彼时,双方公开互呛、频繁喊话,导致市场波动加剧。而本次谈判选择以“无声胜有声”的方式处理,反映双方在经济压力下的务实转向。

外交语音是一种艺术。它既要说话,又不能说太多。这一次,双方都极其谨慎,“建设性”“有进展”“框架性协议”这些词,像被精心挑选过的石子,既不尖锐,也不柔软

那是语言的边界:在对立与合作之间,维持一种恰到好处的模糊。对彼此而言,模糊即安全;明确反而危险。因为,一旦句子太清楚,就没有退路。

各取所需的框架妥协

美方的首要目标仍是延长贸易休兵期、维持供应链稳定,并在科技与安全底线不让步的前提下,争取中国恢复对美国大豆的采购,以稳定期中选举的选票。中方则希望缓解出口受限压力、换取关税减免与市场信心回升。双方因此达成“暂缓征收高额关税”与“延迟稀土出口管制一年”的框架共识。

在技术上这是“让步交换”,在策略上呈现“各退一步”。美方避免在选前制造经济不稳定,中方则需稳定外贸以支撑内需复苏。双方谈判刻意战略模糊,以“框架共识”取代“协议文本”,留给双方元首最后拍板的政治空间。

从对抗性谈判到“可控竞争”

与过往相比,本轮谈判在语气与仪式感上显示从冷和到温和。

川普1.0的2018–2020年间的美中经贸谈判,往往以“惩罚性关税”为威胁,以“结构性改革”为筹码,美方态度强硬、要求具体数字与法规承诺。而吉隆坡谈判更像是一场“风险管理会议”,双方只各自表述共识,寻求“如何不让矛盾扩大”。这是典型的“管控竞争”策略,意味两国都接受竞争长期化的现实。

框架已成,信任未立

虽然双方皆宣称达成“初步共识”,但协议尚无具体条文。关税额度、大豆采购、稀土出口与TikTok技术转让等关键问题,仍待元首会晤再公布。此外,双方暂时搁置台湾与南海等地缘政治敏感议题,但在科技、供应链与安全监管仍可能在未来数月重新点燃对抗。

回望川普1.0的美中谈判,当时的气氛如火药般神经紧绷。2018年在华盛顿与上海的会场里,媒体竞相捕捉“谁让步”“谁被羞辱”的画面。如今在吉隆坡,却像一场无声的双簧,双方都没有发表更多的言语。

从极限施压到节奏减压

这次没有谁领言,也没有掌声。双方都在衡量节奏,寻找能共存的韵律。这正是新时代的贸易写法,不再以“极限施压”求胜,而以“节奏减压”求稳。谈判成了一种长线的表演艺术,一边是威慑的姿态,一边是温和的调性。每一步都为了让冲突不致溢出舞台。

美中如今都认知到,全面脱钩不仅不切实际,还可能削弱自身产业竞争力。因而策略焦点转向“可预测的竞争节奏”,以控制市场恐慌与地缘风险。

吉隆坡谈判或许不是突破,但它标志着一种新的现实:即使对抗仍在,谈判已成必要。

双方都明白,经济的相互依存远比政治分歧更具黏性。这一轮会谈的最大意义,不在于协议条文,而在于为即将登场的元首峰会铺设一条仍可对话的路。

未来,美中之间的“谈判政治”或成为常态,既是博弈,也是管理;既是竞争,也是彼此确认对方仍愿意坐在谈判桌前的象征。

西方从“致命的自负”到面对中国的科技进步


国际媒体对习近平的关注,这些年政治上集中在他的内部清洗与加强社会控制;经济上集中在房地产衰退与大规模失业和他对私有经济的打压,以及低端劳密型产业的china+1布局;外交上聚焦于他与普丁的友好合作及中美关系交恶,完全忽视了他从2015年以来对产业结构转型的布局。被美国在2018年斥为“仿制、偷盗、剽窃美国技术之集大成”的《中国制造2025》,就是习近平主政第一任期内由总理李克强主持完成的。在美国对华贸易战的压力之下,北京被迫在2019年放弃了《中国制造2025》,但很快不事声张地成立了规模为210亿美元的“国家制造业转型升级基金股份有限公司”,对新材料、新一代信息技术和电力装备这三个领域进行投资,带给西方制造业严重挑战的中国出口产品“新三样”(电动汽车、锂电池、光伏产品),就是2021年以来陆续推向国际市场的,在这些中国制造如洪水般淹没国际市场,习近平正式提出“新质生产力”的说法,海外中文媒体一片嘲讽之声,但西方投资界与工商界人士在中国制造的倾销下,意识到中国要将自己变为制造业的“亚马逊”,最终结果是挤垮西方国家的制造业

2025中共二十届四中全会结束,推出了新的五年规划聚焦于人工智慧,晶片和主导全球生产链,在中国经济通货紧缩和地缘政治紧张的阴影下,中国此举公开表明希望通过推进技术革新赢得与美国竞争,以前中共提升科技水准是支持增长和减少不平等,现在重点是与美国竞争,就是在与华盛顿的战略对峙中,中国希望加倍投入人工智慧、先进半导体、量子物理学和太空探索,以确保其技术主权,这是关乎中国尤其是中共生存的优先事项。

通过美中关税战与九三阅兵,部分敏感的西方媒体对中国的认识已经更新,这至少有助于川普政府重新审视对华关系,不再轻敌。

《华尔街日报》在《中国新五年规划为与美国更激烈的科技对抗做准备》(10/24/2025)一文中,检讨了过去西方媒体对习近平的轻视,重新评价了中国于2015年发布的《中国制造2025》,认为该计划为该国设定了要主导电动汽车、航空航太和半导体等尖端技术的目标并成功实现其中许多目标,在催生一批全球赢家的同时,也扰乱了相关产业的全球格局。该文引用德国墨卡托中国研究中心(Mercator Institute for China Studies)的卡特娅·德林豪森(Katja Drinhausen)的说法,承认在“习近平上台时,这些规划仍被视为官方套话,未必很有分量,但过去十五年的情况表明,这些规划蕴含着影响力,特别是如果与投资、资源和激励措施相结合的话——这套模式已经取得了成效。”


Tuesday, 28 October 2025

父亲的滋补经

 

秋天是进补的最佳时节,父亲又开始捣腾他柜子里的食材了,莲子、银耳和百合煮粥,这是他最爱做的早点之一。润肺,清心,安神,除燥,老年人口痰多,喝这粥最好。每天5点,厨房的灯就亮了,父亲把食材放入电瓷罐里开始熬煮。等起床时,便可以喝到散发着清香的粥。

母亲总说,父亲熬的粥比那外面卖的什么高级补品都强。除了莲子银耳百合粥,父亲还会变着花样来,有时是红枣桂圆粥,补血养气;有时是山药薏米粥,健脾益胃。他总念叨着,药补不如食补,这些食材都是大自然赐予的宝贝,得好好利用。人要顺着四季变化调理身体,顺应天时,才能相得益彰。

他总爱交代母亲,一定要吃应季蔬菜,不要买反季菜。就算馋,也要忍住。菜只有在属于它们的节令里生长,才自然而然,富含营养,不憋屈。你吃了,只会有益身体。如果有悖它的时令,生得不情不愿,总是病态的。植物也有情绪,只是它们的情绪藏在那些根茎叶脉里,你无法看到而已。

莲藕和苦瓜是父亲秋天最爱吃的菜蔬,莲藕煮排骨,清炒,凉拌,它总以各种形式出现在我们家的餐桌上。至于苦瓜,简直是父亲的挚爱。父亲说,苦瓜乃是君子菜,清热降火,调节血糖最好,不过苦瓜性寒,老年人肠胃不好,就得用生姜和红枣作为配搭,以减轻对脾胃的负担。至于西瓜,他总说,秋后不碰西瓜,寒湿不到家。对于辛辣食物,也是秋日的禁忌。

除了平日的食疗,泡各种茶饮,也是父亲的最爱。他会根据不同的季节和身体状况,搭配出不同的茶饮。春天时,他会泡些菊花枸杞茶,明目清肝,缓解春日的干燥;夏天,则换成薄荷绿茶,消暑解渴,提神醒脑;到了秋天,父亲最常泡的就是陈皮普洱茶了,他说这茶能理气和中,暖胃生津,最适合这秋意渐浓的时节。偶尔,他还会加入几片桂花,让茶香中带着一丝丝甜意,更添几分秋日的韵味。在老家,人们最喜欢围着火塘喝烤茶,茶叶中放上几颗米粒,在土罐里烤得焦黄,再注入水,扑哧一下,白烟四起,香味乱蹿,这秋天的谷米茶,喝着最舒心安神。

“太阳不来照,医生就来找。”秋天的阳光也是一味补药,老祖宗的智慧是无量的。父亲说,把自己像放一块陈皮般放在暖阳下,烤上那么几分钟,待身体微微出汗,这就像喝鸡汤一样的舒坦。再没有比这样升阳最佳的疗愈方式了,人体脏腑主要功能就是靠阳气支撑,而烤一下太阳,也是增加阳气的办法之一。“秋日烤一烤,冬天感冒少。”那时,阿奶总是这样和他们说,植物需要阳光,人更需要。所以,经常把被褥晒晒,睡眠也会有所改善。

秋日,人们把收割的庄稼放置在阳光下,大地到处都是晒秋的色调和芬芳。父亲说,土地是最诚实的,你付出多少,它就回报你多少。同样,身体也是,你善待它,它就会给你最好的反馈。真正的滋补不在于昂贵的补品,而在于对生活的热爱和对自然的敬畏和顺应。

车上的故障灯亮,自己动手就能解决

 

-拆开蓄电池的负极,停留10秒,再装回去。

Saturday, 25 October 2025

就是溜溜的她

 

-原来‘溜溜的她’这首歌是齐秦首唱,而非费翔。

related post: https://briteming.blogspot.com/2015/10/blog-post_74.html

修理工手把手教你给汽车搭电

-先准备好备用电池,比如‘充电宝’。然后正极对正极,负极对负极。先用充电宝的正极去夹汽车电池的正极,后用充电宝的负极去夹汽车电池的负极,顺序千万不要搞反。充了一段时间的电后,取下充电宝的电极;此时,要先取充电宝的负极,后取充电宝的正极。买个充电宝,并不贵。

Friday, 24 October 2025

信天游。阿宝和他的老婆合唱

 

-他的老婆达到了专业水平

基于go的导航网站生成器gena

 

gena

导航网站生成器 | English Document

Test Lint Go Report Card goproxy.cn

安装

一键生成(推荐

gena-template 自动生成并自动部署到 GitHub Pages

源码安装:

go1.16 required

go get -u github.com/x1ah/gena/cmd/gena
> gena --help
Usage of ./gena:
  -c string
    	Config file (default "config.yml")

可执行文件下载

Release page 下载对应平台文件

生成网站

参照 config.yml 填入自己的网站列表

gena -c your/path/to/config.yaml 1> index.html

可选的模板

效果预览

浏览器打开生成的 index.html

使用案例

from https://github.com/x1ah/gena 

Thursday, 23 October 2025

搭建基于github issues的静态博客程序ginb

   首先fork 此项目https://github.com/ChrAlpha/ginb,我 fork后,得到的项目地址是

 https://github.com/briteming/ginb。访问https://github.com/briteming/ginb/settings,启用issues.

然后编辑 _config.js:

 https://github.com/briteming/ginb/blob/main/_config.js, 把第5行的username的值改为你的github用户名,把第6行的 repository的值改为你的github仓库名。

 登录https://vercel.com,然后访问vercel.com/new,导入项目  https://github.com/briteming/ginb。在environment variables那一步,Key的值填写GITHUB_TOKEN ,Value的值填写你的GITHUB TOKEN的值。然后点击下方的deploy按钮,等待部署完成。部署完成后,

我得到了网址https://ginb-v359.vercel.app/ ;

 

 

cryptochat


npm

Encrypted P2P chat over ICMP (Internet Control Message Protocol).

I strongly advise you to pick a high-entropy encryption key to avoid the possibility of brute-force attacks.

Uses raw-socket for ICMP handling and terminal-colors to spice it up a bit.

Install and usage

Make sure you have node 0.10.x (tip: use n) and then install the package globally with sudo.

sudo npm install -g cryptochat

Three variants of cryptochat are available depending on your use case:

  • Send and receive messages

    $ sudo cryptochat <ip> <encryption_key>

Receive messages

$ sudo cryptochat server <encryption_key>

Send messages

$ sudo cryptochat client <ip> <encryption_key>

Because it relies on stdin for input, it is possible to use pipes to send data:

cat cryptochat.js | sudo cryptochat client <ip> <encryption_key>
bits 0-7 bits 8-15 bits 16-31
type = 0x08 code = 0x00 checksum
identifier sequence number
payload

The message data is attached as the ICMP payload.

Message

Messages are piped from stdin and split into payload packages, which are encrypted and sent as ICMP Echo requests. The payload size per request is currently set to 32 bytes. The first byte is the length of the message and the rest is the message itself.

The first request contains a salt and an initialization vector needed to decrypt the payloads.

byte 0 bytes 1-15 bytes 16-31
0x3e salt initialization vector

An "end" request is sent in order for the receiver to know when a message is completed. The end request has the following format:

byte 0 bytes 1-31
0x3e 0xffffffff...

When the end request is received, the full message is printed to the screen.

from  https://github.com/mateogianolio/cryptochat

歌唱祖国

《歌唱祖国》,王莘创作的原版于1950年创作,并在同年发表于《大众歌选》,于1951年9月15日在《人民日报》正式发表。 1950年9月:: 作曲家王莘在为国庆一周年庆祝活动所见的场景中,创作了《歌唱祖国》的初稿。

我和我的祖国

Wednesday, 22 October 2025

phanpy

A minimalistic opinionated Mastodon web client.

phanpy.social

This is an alternative web client for Mastodon.

  • 🏢 Production: https://phanpy.social
    • production branch
    • break less often
    • slower fixes unless critical
  • 🏗️ Development: https://dev.phanpy.social
    • main branch
    • may see new cool stuff sooner
    • may break more often
    • may be fixed much faster too

🐘 Follow @phanpy on Mastodon for updates ✨

Everything is designed and engineered following my taste and vision. This is a personal side project for me to learn about Mastodon and experiment with new UI/UX ideas.

Features

  • 👪 Multiple accounts
  • 🪟 Compose window pop-out/in
  • 🌗 Light/dark/auto theme
  • 🔔 Grouped notifications
  • 🪺 Nested comments thread
  • 📬 Unsent draft recovery
  • 🎠 Boosts Carousel™️
  • ⚡ Shortcuts™️ with view modes like multi-column or tab bar
  • #️⃣ Multi-hashtag timeline

Design decisions

  • Status actions (reply, boost, favourite, bookmark, etc) are hidden by default.
    They only appear in individual status page. This is to reduce clutter and distraction. It may result in lower engagement, but we're not chasing numbers here.
  • Boost is represented with the rocket icon.
    The green double arrow icon (retweet for Twitter) doesn't look right for the term "boost". Green rocket looks weird, so I use purple.
  • Short usernames (@username) are displayed in timelines, instead of the full account username (@username@instance).
    Despite the guideline mentioned that "Decentralization must be transparent to the user", I don't think we should shove it to the face every single time. There are also some screen-reader-related accessibility concerns with the full username, though this web app is unfortunately not accessible yet.
  • No autoplay for video/GIF/whatever in timeline.
    The timeline is already a huge mess with lots of people, brands, news and media trying to grab your attention. Let's not make it worse. (Current exception now would be animated emojis.)
  • Hash-based URLs.
    This web app is not meant to be a full-fledged replacement to Mastodon's existing front-end. There's no SEO, database, serverless or any long-running servers. I could be wrong one day.

Subtle UI implementations

User name display

User name display




Boosts Carousel

Boosts Carousel




Thread number badge (e.g. Thread 1/X)

Thread number badge





Hashtag stuffing collapsing

Hashtag stuffing collapsing








Filtered posts





Development

Prerequisites: Node.js 20+

  • npm install - Install dependencies
  • npm run dev - Start development server and messages:extract (clean + watch) in parallel
  • npm run build - Build for production
  • npm run preview - Preview the production build
  • npm run fetch-instances - Fetch instances list from joinmastodon.org/servers, save it to src/data/instances.json
  • npm run sourcemap - Run source-map-explorer on the production build
  • npm run messages:extract - Extract messages from source files and update the locale message catalogs
  • npm run git:po-filter - Configure git to use po-filter for diffing .po files

Tech stack

Some of these may change in the future. The front-end world is ever-changing.

Internationalization

All translations are available as gettext .po files in the src/locales folder. The default language is English (en). CLDR Plural Rules are used for pluralization. RTL (right-to-left) languages are also supported with proper text direction, icon rendering and layout.

On page load, default language is detected via these methods, in order (first match is used):

  1. URL parameter lang e.g. /?lang=zh-Hant
  2. localStorage key lang
  3. Browser's navigator.language

Users can change the language in the settings, which sets the localStorage key lang.

Guide for translators

*Inspired by Translate WordPress Handbook:

Technical notes

  • IDs for strings are auto-generated instead of explicitly defined. Some of the benefits are avoiding the "naming things" problem and avoiding duplicates.
    • Explicit IDs might be introduced in the future when requirements and priorities change. The library (Lingui) allows both.
    • Please report issues if certain strings are translated differently based on context, culture or region.
  • There are no strings for push notifications. The language is set on the instance server.
  • Native HTML date pickers, e.g. <input type="month"> will always follow the system's locale and not the user's set locale.
  • "ALT" in ALT badge is not translated. It serves as a a recognizable standard across languages.
  • Custom emoji names are not localized, therefore searches don't work for non-English languages.
  • GIPHY API supports a list of languages for searches.
  • Unicode Right-to-left mark (RLM) (U+200F, &rlm;) may need to be used for mixed RTL/LTR text, especially for <title> element (document.title).
  • On development, there's an additional pseudo-LOCALE locale, used for pseudolocalization. It's for testing and won't show up on production.
  • When building for production, English (en) catalog messages are not bundled separatedly. Other locales are bundled as separate files and loaded on demand. This ensures that en is always available as fallback.

Volunteer translations

Crowdin

Languages chart

Translations are managed on Crowdin. You can help by volunteering translations.

Read the intro documentation to get started.

Self-hosting

This is a pure static web app. You can host it anywhere you want.

Two ways (choose one):

Easy way

Go to Releases and download the latest phanpy-dist.zip or phanpy-dist.tar.gz. It's pre-built so don't need to run any install/build commands. Extract it. Serve the folder of extracted files.

Important

Text translations connect to an external service (translang.phanpy.social).

Custom-build way

Requires Node.js.

Download or git clone this repository. Use production branch for stable releases, main for latest. Build it by running npm run build (after npm install). Serve the dist folder.

Important

Text translations connect to an external service (translang.phanpy.social). This can be configured with environment variables if you want to self-host your own instance.

Customization can be done by passing environment variables to the build command. Examples:

PHANPY_CLIENT_NAME="Phanpy Dev" \
    PHANPY_WEBSITE="https://dev.phanpy.social" \
    npm run build
PHANPY_DEFAULT_INSTANCE=hachyderm.io \
    PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL=https://hachyderm.io/auth/sign_up \
    PHANPY_PRIVACY_POLICY_URL=https://hachyderm.io/privacy-policy \
    npm run build

It's also possible to set them in the .env file.

Available variables:

  • PHANPY_CLIENT_NAME (optional, default: Phanpy) affects:
    • Web page title, shown in the browser window or tab title
    • App title, when installed as PWA, shown in the Home screen, macOS dock, Windows taskbar, etc
    • OpenGraph card title, when shared on social networks
    • Client name, when registering the app for authentication and shown as client used on posts in some apps/clients
  • PHANPY_WEBSITE (optional but recommended, default: https://phanpy.social) affects:
    • Canonical URL of the website
    • OpenGraph card URL, when shared on social networks
    • Root path for the OpenGraph card image
    • Client URL, when registering the app for authentication and shown as client used on posts in some apps/clients
  • PHANPY_DEFAULT_INSTANCE (optional, no defaults):
    • e.g. 'mastodon.social', without https://
    • Default instance for log-in
    • When logging in, the user will be redirected instantly to the instance's authentication page instead of having to manually type the instance URL and submit
  • PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL (optional, no defaults):
    • URL of the instance registration page
    • E.g. https://mastodon.social/auth/sign_up
  • PHANPY_PRIVACY_POLICY_URL (optional, default to official instance's privacy policy):
    • URL of the privacy policy page
    • May specify the instance's own privacy policy
  • PHANPY_DEFAULT_LANG (optional):
    • Default language is English (en) if not specified.
    • Fallback language after multiple detection methods (lang query parameter, lang key in localStorage and navigator.language)
  • PHANPY_REFERRER_POLICY (optional, default: origin):
    • Referrer policy for the site. See MDN.
    • This is applied with the <meta> tag on the client-side.
    • The policy can also be set with Referrer-Policy header configured on the server-side (not this variable).
    • Note that since Phanpy uses hash-based URLs, the referrer does not include the hash part.
  • PHANPY_LINGVA_INSTANCES (DEPRECATED, optional, space-separated list, default: lingva.phanpy.social [...hard-coded list of fallback instances]):
    • Specify a space-separated list of instances. First will be used as default before falling back to the subsequent instances. If there's only 1 instance, means no fallback.
    • May specify a self-hosted Lingva instance, powered by either lingva-translate or lingva-api
    • List of fallback instances hard-coded in /.env
    • ↗️ List of lingva-translate instances
  • PHANPY_TRANSLANG_INSTANCES (optional, space-separated list, default: translang.phanpy.social):
    • Specify a space-separated list of instances. First will be used as default before falling back to the subsequent instances. If there's only 1 instance, means no fallback.
    • May specify a self-hosted Translating instance, powered by translang-api.
    • List of instances hard-coded in /.env
  • PHANPY_IMG_ALT_API_URL (optional, no defaults):
    • API endpoint for self-hosted instance of img-alt-api.
    • If provided, a setting will appear for users to enable the image description generator in the composer. Disabled by default.
  • PHANPY_GIPHY_API_KEY (optional, no defaults):
    • API key for GIPHY. See API docs.
    • If provided, a setting will appear for users to enable the GIF picker in the composer. Disabled by default.
    • This is not self-hosted.
  • PHANPY_DISALLOW_ROBOTS (optional, default: not set):
    • Set to any value (true, 1, etc) to override the robots.txt file and disallow all web crawlers from indexing the site

Static site hosting

Try online search for "how to self-host static sites" as there are many ways to do it.

Lingva-translate or lingva-api hosting

⚠️ DEPRECATED. See documentation for lingva-translate or lingva-api.

Translang API hosting

See documentation for translang-api.

Community deployments

These are self-hosted by other wonderful folks.

Note: Add yours by creating a pull request.

Costs

Costs involved in running and developing this web app:

  • Domain name (.social): USD$23.18/year (USD$6.87 1st year)
  • Hosting: Free
  • Development, design, maintenance: "Free" (My precious time)

Mascot

Phanpy is a Ground-type Pokémon.

Maintainers + contributors

Contributors

Translation volunteers

  • A.Mason (Polish)
  • alidsds11 (Arabic)
  • alternative (Korean)
  • AmaseCocoa (Japanese)
  • BoFFire (Arabic, French, Kabyle)
  • Brawaru (Russian)
  • cbasje (Dutch)
  • cbo92 (French)
  • CDN (Chinese Simplified)
  • codl (French)
  • dannypsnl (Chinese Traditional)
  • databio (Catalan)
  • Dizro (Italian)
  • Drift6944 (Czech)
  • drydenwu (Chinese Traditional)
  • elissarc (French)
  • ElPamplina (Spanish)
  • filipesmedeiros (Portuguese)
  • Fitik (Esperanto, Hebrew)
  • Freeesia (Japanese)
  • gflorian (German)
  • ghose (Galician)
  • hongminhee (Korean)
  • Hugoglyph (Esperanto, Spanish)
  • isard (Catalan)
  • kaliuwu (Polish)
  • karlafej (Czech)
  • katullo11 (Italian)
  • Kytta (German)
  • llun (Thai)
  • lucsdev24 (Occitan, Portuguese, Portuguese, Brazilian)
  • LukeHong (Chinese Traditional)
  • mahefa.randimbisoa (French)
  • Mannivu (Italian)
  • manuelviens (French)
  • marcin.kozinski (Polish)
  • martinmodrak (Czech)
  • misk (Polish)
  • mkljczkk (Polish)
  • mojosoeun (Korean)
  • moreal (Korean)
  • MrWillCom (Chinese Simplified)
  • nclm (French)
  • nycterent (Lithuanian)
  • pazpi (Italian)
  • PPNplus (Thai)
  • punkrockgirl (Basque)
  • radecos (French)
  • Razem (Czech)
  • realpixelcode (German)
  • rezahosseinzadeh (Persian)
  • rwmpelstilzchen (Esperanto, Hebrew)
  • SadmL (Russian)
  • SadmL_AI (Russian)
  • Schishka71 (Russian)
  • seizeheures (Esperanto)
  • shuuji3 (Japanese)
  • Sky_NiniKo (French)
  • StasZin4 (Ukrainian)
  • Steffo99 (Italian)
  • Su5hicz (Czech)
  • svetlemodry (Czech)
  • tferrermo (Spanish)
  • tkbremnes (Norwegian Bokmal)
  • tux93 (German)
  • Usia (Ukrainian)
  • uzaylul (Turkish)
  • Vac31. (Lithuanian)
  • valtlai (Finnish)
  • vasiriri (Polish)
  • voitech (Polish)
  • voyagercy (Chinese Traditional)
  • xabi_itzultzaile (Basque)
  • xen4n (Ukrainian)
  • xqueralt (Catalan)
  • Yukaii (Chinese Traditional)
  • Zet24 (Arabic)
  • ZiriSut (Kabyle)
  • zkreml (Czech)

Backstory

I am one of the earliest users of Twitter. Twitter was launched on 15 July 2006. I joined on December 2006 and my first tweet was posted on 18 December 2006.

I know how early Twitter looks like. It was fun.

Back then, I made a Twitter clone called "Twig" written in Python and Google App Engine. I almost made my own Twitter desktop client written in Appcelerator Titanium. I gave one of my best talks about the Twitter client in a mini-conference. I built this thing called "Twitter Columns", a web app that shows your list of followings, your followings' followings, your followers, your followers' followers and so on. In 2009, I wrote a blog post titled "How I got started with Twitter". I created two themes for DestroyTwitter (a desktop client made with Adobe Air by Jonnie Hallman) and one of them is called "Vimeo". In 2013, I wrote my own tweets backup site with a front-end to view my tweets and a CouchDB backend to store them.

It's been more than 15 years.

And here I am. Building a Mastodon web client.

Alternative web clients

💁‍♂️ Notice to all other social media client developers

Please, please copy the UI ideas and experiments from this app. I think some of them are pretty good and it would be great if more apps have them.

If you're not a developer, please tell your favourite social media client developers about this app and ask them to copy the UI ideas and experiments.

from https://github.com/cheeaun/phanpy